51 using SymbolRank = std::underlying_type_t<SymbolKind>;
52 const SymbolRank lhs_kind =
static_cast<SymbolRank
>(lhs.kind);
53 const SymbolRank rhs_kind =
static_cast<SymbolRank
>(rhs.kind);
54 return lhs_kind < rhs_kind || (lhs_kind == rhs_kind && lhs.index < rhs.index);
73 using Term = std::pair<Symbol, FieldElement>;
80 explicit Expr(std::int64_t value);
96 const std::vector<Term>&
linear()
const {
146 std::pair<Expr, Expr>
split()
const;
150 void push_term(
const Term& term);
153 std::vector<Term> linear_;
161 bool operator()(
const std::pair<Expr, Expr>& lhs,
const std::pair<Expr, Expr>& rhs)
const;
204 std::vector<Expr::Term> terms_;
216 Expr secret(
const std::optional<FieldElement>& value);
231 std::optional<FieldElement>
evaluate(
const Expr& expr)
const;
246 const std::vector<MulConstraint>&
muls()
const {
251 const std::vector<Expr>&
eqs()
const {
257 std::vector<MulConstraint> muls_;
260 std::set<Expr, ExprLess> bool_cache_;
261 std::vector<Expr> eqs_;
264Expr
operator+(
const Expr& lhs,
const Expr& rhs);
265Expr
operator+(
const Expr& lhs, std::int64_t rhs);
266Expr
operator+(std::int64_t lhs,
const Expr& rhs);
267Expr
operator-(
const Expr& lhs,
const Expr& rhs);
268Expr
operator-(
const Expr& lhs, std::int64_t rhs);
269Expr
operator-(std::int64_t lhs,
const Expr& rhs);
275bool operator==(
const Expr& lhs,
const Expr& rhs);
276bool operator<(
const Expr& lhs,
const Expr& rhs);
Small runtime builder that flattens affine combinations into one expression.
ExprBuilder & add(const FieldElement &value)
Adds a constant field term to the pending affine expression.
ExprBuilder & add_term(Symbol symbol, const FieldElement &scale)
Adds one scaled symbolic variable term.
static ExprBuilder reserved(std::size_t terms)
Returns a builder with storage reserved for approximately terms linear slots.
Expr build()
Materializes the flattened affine expression.
ExprBuilder & add_scaled(const Expr &expr, const FieldElement &scale)
Adds an existing expression scaled by a field element.
ExprBuilder & subtract(const Expr &expr)
Subtracts an existing expression with implicit coefficient minus one.
ExprBuilder & reserve(std::size_t terms)
Reserves storage for approximately terms linear slots.
Symbolic affine expression over indexed variables and field coefficients.
friend bool operator==(const Expr &lhs, const Expr &rhs)
Compares two affine expressions structurally.
friend Expr operator*(const Expr &expr, const FieldElement &scalar)
Scales an affine expression by a field element.
const FieldElement & constant() const
Returns the constant term of the affine expression.
std::string to_string() const
Formats the expression in a stable human-readable form used for debugging and serialization.
std::vector< Term > & linear()
Returns mutable access to the sorted linear term list.
friend Expr operator+(const Expr &lhs, const Expr &rhs)
Adds two affine expressions and merges like terms.
Expr()
Constructs the zero expression.
friend Expr operator-(const Expr &lhs, const Expr &rhs)
Subtracts one affine expression from another.
std::pair< Symbol, FieldElement > Term
const std::vector< Term > & linear() const
Returns read-only access to the sorted linear term list.
static Expr variable(Symbol symbol)
Returns a single-variable expression with coefficient one.
std::optional< FieldElement > evaluate(const WitnessAssignments &values) const
Evaluates the expression against a possibly partial transcript witness assignment.
friend bool operator<(const Expr &lhs, const Expr &rhs)
Orders affine expressions structurally for cache keys.
std::pair< Expr, Expr > split() const
Splits the expression into a pure constant and a pure linear component.
Field element modulo the backend scalar field used by this implementation.
static FieldElement zero()
Returns the additive identity of the scalar field.
Mutable transcript used to record symbolic multiplication, division, and boolean constraints.
const std::vector< Expr > & eqs() const
Returns the linear equality constraints accumulated so far.
Expr secret(const std::optional< FieldElement > &value)
Allocates a new secret witness variable, optionally with a known concrete value.
std::optional< FieldElement > evaluate(const Expr &expr) const
Evaluates an expression against the transcript's current witness vector.
Expr boolean(const Expr &expr)
Constrains an expression to be boolean by adding x * (x - 1) = 0.
const std::vector< MulConstraint > & muls() const
Returns the multiplication and division constraints accumulated so far.
Expr mul(const Expr &lhs, const Expr &rhs)
Allocates or reuses a multiplication witness enforcing lhs * rhs = out.
const WitnessAssignments & varmap() const
Returns the underlying witness assignment vector.
Expr div(const Expr &lhs, const Expr &rhs)
Allocates or reuses a division witness enforcing out * rhs = lhs.
void equal(const Expr &lhs, const Expr &rhs)
Records a linear equality constraint between two expressions.
bool operator<(const Symbol &lhs, const Symbol &rhs) noexcept
Expr operator*(const Expr &expr, const FieldElement &scalar)
std::ostream & operator<<(std::ostream &out, const Expr &expr)
Streams the human-readable expression form to an output stream.
SymbolKind
Symbol classes used while deriving witness and Bulletproof wire relations.
bool operator==(const Expr &lhs, const Expr &rhs)
Expr operator-(const Expr &lhs, const Expr &rhs)
std::vector< std::optional< FieldElement > > WitnessAssignments
Partial witness assignment vector indexed by transcript witness id.
Bytes operator+(Bytes lhs, const Bytes &rhs)
Concatenates two byte vectors.
Fixed-width integer and field arithmetic helpers used throughout Purify.
bool operator()(const Expr &lhs, const Expr &rhs) const
bool operator()(const std::pair< Expr, Expr > &lhs, const std::pair< Expr, Expr > &rhs) const
bool operator()(const Symbol &lhs, const Symbol &rhs) const noexcept
Compact symbolic variable identifier used inside expressions and transcripts.
bool operator==(const Symbol &) const =default
static Symbol witness(std::uint32_t index)
static Symbol left(std::uint32_t index)
static Symbol output(std::uint32_t index)
std::string to_string() const
static Symbol commitment(std::uint32_t index)
static Symbol right(std::uint32_t index)
One multiplicative relation emitted by the symbolic transcript.