forked from Consensys/gnark
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stats.go
124 lines (104 loc) · 2.66 KB
/
stats.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package stats
import (
"encoding/gob"
"fmt"
"os"
"sync"
"github.com/aakash4dev/gnark2/backend"
"github.com/aakash4dev/gnark2/frontend"
"github.com/aakash4dev/gnark2/frontend/cs/r1cs"
"github.com/aakash4dev/gnark2/frontend/cs/scs"
"github.com/consensys/gnark"
"github.com/consensys/gnark-crypto/ecc"
)
const nbCurves = 7
func CurveIdx(curve ecc.ID) int {
switch curve {
case ecc.BN254:
return 0
case ecc.BLS12_377:
return 1
case ecc.BLS12_381:
return 2
case ecc.BLS24_315:
return 3
case ecc.BW6_761:
return 4
case ecc.BW6_633:
return 5
case ecc.BLS24_317:
return 6
default:
panic("not implemented")
}
}
func init() {
if nbCurves != len(gnark.Curves()) {
panic("expected nbCurves == len(gnark.Curves())")
}
}
func NewGlobalStats() *globalStats {
return &globalStats{
Stats: make(map[string][backend.PLONKFRI + 1][nbCurves + 1]snippetStats),
}
}
func (s *globalStats) Save(path string) error {
fStats, err := os.Create(path) //#nosec G304 -- ignoring internal pacakge s
if err != nil {
return err
}
encoder := gob.NewEncoder(fStats)
err = encoder.Encode(s.Stats)
_ = fStats.Close()
return err
}
func (s *globalStats) Load(path string) error {
fStats, err := os.Open(path) //#nosec G304 -- ignoring internal package
if err != nil {
return err
}
decoder := gob.NewDecoder(fStats)
err = decoder.Decode(&s.Stats)
_ = fStats.Close()
return err
}
func NewSnippetStats(curve ecc.ID, backendID backend.ID, circuit frontend.Circuit) (snippetStats, error) {
var newCompiler frontend.NewBuilder
switch backendID {
case backend.GROTH16:
newCompiler = r1cs.NewBuilder
case backend.PLONK, backend.PLONKFRI:
newCompiler = scs.NewBuilder
default:
panic("not implemented")
}
ccs, err := frontend.Compile(curve.ScalarField(), newCompiler, circuit, frontend.IgnoreUnconstrainedInputs())
if err != nil {
return snippetStats{}, err
}
// ensure we didn't introduce regressions that make circuits less efficient
nbConstraints := ccs.GetNbConstraints()
internal, _, _ := ccs.GetNbVariables()
return snippetStats{nbConstraints, internal}, nil
}
func (s *globalStats) Add(curve ecc.ID, backendID backend.ID, cs snippetStats, circuitName string) {
s.Lock()
defer s.Unlock()
rs := s.Stats[circuitName]
rs[backendID][CurveIdx(curve)] = cs
s.Stats[circuitName] = rs
}
type Circuit struct {
Circuit frontend.Circuit
Curves []ecc.ID
}
type globalStats struct {
sync.RWMutex
Stats map[string][backend.PLONKFRI + 1][nbCurves + 1]snippetStats
}
type snippetStats struct {
NbConstraints, NbInternalWires int
}
func (cs snippetStats) String() string {
return fmt.Sprintf("nbConstraints: %d, nbInternalWires: %d", cs.NbConstraints, cs.NbInternalWires)
}