59 auto construct_point = [&](
const GrumpkinPoint& point,
bool as_constant) -> std::vector<WitnessOrConstant<FF>> {
62 return { WitnessOrConstant<FF>::from_constant(point.
x),
63 WitnessOrConstant<FF>::from_constant(point.
y),
67 std::vector<uint32_t> point_indices = add_to_witness_and_track_indices(witness_values, point);
68 return { WitnessOrConstant<FF>::from_index(point_indices[0]),
69 WitnessOrConstant<FF>::from_index(point_indices[1]),
70 WitnessOrConstant<FF>::from_index(point_indices[2]) };
78 auto input1_fields = construct_point(input1, input1_is_constant);
79 auto input2_fields = construct_point(input2, input2_is_constant);
82 std::vector<uint32_t> result_indices = add_to_witness_and_track_indices(witness_values, result);
83 uint32_t predicate_index = add_to_witness_and_track_indices(witness_values,
FF(1));
86 ec_add_constraint = EcAdd{
87 .input1_x = input1_fields[0],
88 .input1_y = input1_fields[1],
89 .input1_infinite = input1_fields[2],
90 .input2_x = input2_fields[0],
91 .input2_y = input2_fields[1],
92 .input2_infinite = input2_fields[2],
93 .predicate = WitnessOrConstant<FF>::from_index(predicate_index),
94 .result_x = result_indices[0],
95 .result_y = result_indices[1],
96 .result_infinite = result_indices[2],
101 WitnessVector& witness_values,
104 switch (invalid_witness_target) {
108 witness_values[constraint.input1_x.index] +=
bb::fr(1);
110 constraint.input1_x = WitnessOrConstant<FF>::from_constant(constraint.input1_x.value +
bb::fr(1));
117 witness_values[constraint.input2_x.index] +=
bb::fr(1);
119 constraint.input2_x = WitnessOrConstant<FF>::from_constant(constraint.input2_x.value +
bb::fr(1));
127 witness_values[constraint.result_infinite] =
FF::zero();