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  }