github.com/consensys/gnark@v0.11.0/internal/stats/generate/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"regexp"
     8  	"sync"
     9  
    10  	"github.com/consensys/gnark/backend"
    11  	"github.com/consensys/gnark/internal/stats"
    12  )
    13  
    14  var (
    15  	fSave   = flag.Bool("s", false, "save new stats in file ")
    16  	fFilter = flag.String("run", "", "filter runs with regexp; example 'pairing*'")
    17  )
    18  
    19  func main() {
    20  	flag.Parse()
    21  
    22  	var r *regexp.Regexp
    23  	if *fFilter != "" {
    24  		r = regexp.MustCompile(*fFilter)
    25  	}
    26  
    27  	s := stats.NewGlobalStats()
    28  
    29  	// load reference objects
    30  	// for each circuit, on each curve, on each backend
    31  	// compare with reference stats
    32  	snippets := stats.GetSnippets()
    33  	var wg sync.WaitGroup
    34  	for name, c := range snippets {
    35  		if r != nil && !r.MatchString(name) {
    36  			continue
    37  		}
    38  		wg.Add(1)
    39  		go func(name string, circuit stats.Circuit) {
    40  			defer wg.Done()
    41  			for _, curve := range circuit.Curves {
    42  				for _, backendID := range backend.Implemented() {
    43  					cs, err := stats.NewSnippetStats(curve, backendID, circuit.Circuit)
    44  					if err != nil {
    45  						log.Fatalf("building stats for circuit %s %v", name, err)
    46  					}
    47  					s.Add(curve, backendID, cs, name)
    48  				}
    49  			}
    50  		}(name, c)
    51  	}
    52  	wg.Wait()
    53  
    54  	fmt.Println("id,curve,backend,nbConstraints,nbWires")
    55  	for name, c := range snippets {
    56  		if r != nil && !r.MatchString(name) {
    57  			continue
    58  		}
    59  		ss := s.Stats[name]
    60  		for _, curve := range c.Curves {
    61  			for _, backendID := range backend.Implemented() {
    62  				cs := ss[backendID][stats.CurveIdx(curve)]
    63  				fmt.Printf("%s,%s,%s,%d,%d\n", name, curve, backendID, cs.NbConstraints, cs.NbInternalWires)
    64  			}
    65  		}
    66  	}
    67  
    68  	if *fSave {
    69  		const refPath = "../latest.stats"
    70  		if err := s.Save(refPath); err != nil {
    71  			log.Fatal(err)
    72  		}
    73  		log.Println("successfully saved new reference stats file", refPath)
    74  	}
    75  
    76  }