feat: allow calculating diffs between two row consumptions (#980)

This commit is contained in:
Ömer Faruk Irmak 2024-08-12 22:22:38 +03:00 committed by GitHub
parent 4464f48a5d
commit 096b98a85c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 116 additions and 0 deletions

View file

@ -1,5 +1,7 @@
package types
import "slices"
type RowUsage struct {
IsOk bool `json:"is_ok"`
RowNumber uint64 `json:"row_number"`
@ -12,4 +14,38 @@ type SubCircuitRowUsage struct {
RowNumber uint64 `json:"row_number" gencodec:"required"`
}
// RowConsumptionLimit is the max number of row we support per subcircuit
const RowConsumptionLimit = 1_000_000
type RowConsumption []SubCircuitRowUsage
// IsOverflown returns if any subcircuits are overflown
func (rc RowConsumption) IsOverflown() bool {
return slices.ContainsFunc(rc, func(scru SubCircuitRowUsage) bool {
return scru.RowNumber > RowConsumptionLimit
})
}
// Difference returns rc - other
// Assumes that rc > other for all subcircuits
func (rc RowConsumption) Difference(other RowConsumption) RowConsumption {
subCircuitMap := make(map[string]uint64, len(rc))
for _, detail := range rc {
subCircuitMap[detail.Name] = detail.RowNumber
}
for _, detail := range other {
subCircuitMap[detail.Name] -= detail.RowNumber
}
diff := make([]SubCircuitRowUsage, 0, len(subCircuitMap))
for name, rowNumDiff := range subCircuitMap {
if rowNumDiff > 0 {
diff = append(diff, SubCircuitRowUsage{
Name: name,
RowNumber: rowNumDiff,
})
}
}
return diff
}

View file

@ -0,0 +1,80 @@
package types
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestRowConsumptionDifference(t *testing.T) {
tests := []struct {
rc1 RowConsumption
rc2 RowConsumption
expected RowConsumption
}{
{
rc1: RowConsumption{
SubCircuitRowUsage{
"sc1",
123,
},
SubCircuitRowUsage{
"sc2",
456,
},
},
rc2: RowConsumption{
SubCircuitRowUsage{
"sc2",
111,
},
},
expected: RowConsumption{
SubCircuitRowUsage{
"sc1",
123,
},
SubCircuitRowUsage{
"sc2",
345,
},
},
},
{
rc1: RowConsumption{
SubCircuitRowUsage{
"sc1",
123,
},
SubCircuitRowUsage{
"sc2",
456,
},
},
rc2: RowConsumption{
SubCircuitRowUsage{
"sc2",
456,
},
},
expected: RowConsumption{
SubCircuitRowUsage{
"sc1",
123,
},
},
},
}
makeMap := func(rc RowConsumption) map[string]uint64 {
m := make(map[string]uint64)
for _, usage := range rc {
m[usage.Name] = usage.RowNumber
}
return m
}
for _, test := range tests {
assert.Equal(t, makeMap(test.expected), makeMap(test.rc1.Difference(test.rc2)))
}
}