github.com/consensys/gnark@v0.11.0/constraint/string_utils.go (about) 1 package constraint 2 3 import ( 4 "strings" 5 ) 6 7 // Resolver allows pretty printing of constraints. 8 type Resolver interface { 9 CoeffToString(coeffID int) string 10 VariableToString(variableID int) string 11 } 12 13 // StringBuilder is a helper to build string from constraints, linear expressions or terms. 14 // It embeds a strings.Builder object for convenience. 15 type StringBuilder struct { 16 strings.Builder 17 Resolver 18 } 19 20 // NewStringBuilder returns a new StringBuilder. 21 func NewStringBuilder(r Resolver) *StringBuilder { 22 return &StringBuilder{Resolver: r} 23 } 24 25 // WriteLinearExpression appends the linear expression to the current buffer 26 func (sbb *StringBuilder) WriteLinearExpression(l LinearExpression) { 27 for i := 0; i < len(l); i++ { 28 sbb.WriteTerm(l[i]) 29 if i+1 < len(l) { 30 sbb.WriteString(" + ") 31 } 32 } 33 } 34 35 // WriteTerm appends the term to the current buffer 36 func (sbb *StringBuilder) WriteTerm(t Term) { 37 if t.CoeffID() == CoeffIdZero { 38 sbb.WriteByte('0') 39 return 40 } 41 vs := sbb.VariableToString(t.WireID()) 42 if t.CoeffID() == CoeffIdOne { 43 // print the variable only 44 sbb.WriteString(vs) 45 return 46 } 47 sbb.WriteString(sbb.CoeffToString(t.CoeffID())) 48 if t.WireID() == 0 && vs == "1" { 49 // special path for R1CS; the one wire so let's just print the coeff for clarity 50 return 51 } 52 sbb.WriteString("⋅") 53 sbb.WriteString(vs) 54 }