Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
translator_delta_range_constraint_relation_impl.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
9
10namespace bb {
11
24template <typename FF>
25template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
26void TranslatorDeltaRangeConstraintRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulators,
27 const AllEntities& in,
28 const Parameters&,
29 const FF& scaling_factor)
30{
31 static const FF minus_one = FF(-1);
32 static const FF minus_two = FF(-2);
33 static const FF minus_three = FF(-3);
34 static const size_t micro_limb_bits = 14;
35 static const auto maximum_sort_value = -FF((1 << micro_limb_bits) - 1);
36
37 [&]() {
39 using View = typename Accumulator::View;
40 auto ordered_range_constraints_0 = View(in.ordered_range_constraints_0);
41 auto ordered_range_constraints_1 = View(in.ordered_range_constraints_1);
42 auto ordered_range_constraints_2 = View(in.ordered_range_constraints_2);
43 auto ordered_range_constraints_3 = View(in.ordered_range_constraints_3);
44 auto ordered_range_constraints_4 = View(in.ordered_range_constraints_4);
45 auto ordered_range_constraints_0_shift = View(in.ordered_range_constraints_0_shift);
46 auto ordered_range_constraints_1_shift = View(in.ordered_range_constraints_1_shift);
47 auto ordered_range_constraints_2_shift = View(in.ordered_range_constraints_2_shift);
48 auto ordered_range_constraints_3_shift = View(in.ordered_range_constraints_3_shift);
49 auto ordered_range_constraints_4_shift = View(in.ordered_range_constraints_4_shift);
50 // Represents the positon of the final non masked witness index
51 auto lagrange_real_last = View(in.lagrange_real_last);
52 auto lagrange_masking = View(in.lagrange_masking);
53
54 auto is_last_witness_or_masking = (lagrange_real_last + minus_one) * (lagrange_masking + minus_one);
55
56 // Compute wire differences
57 auto delta_1 = ordered_range_constraints_0_shift - ordered_range_constraints_0;
58 auto delta_2 = ordered_range_constraints_1_shift - ordered_range_constraints_1;
59 auto delta_3 = ordered_range_constraints_2_shift - ordered_range_constraints_2;
60 auto delta_4 = ordered_range_constraints_3_shift - ordered_range_constraints_3;
61 auto delta_5 = ordered_range_constraints_4_shift - ordered_range_constraints_4;
62
63 // Contribution (1) (contributions 1-5 ensure that the sequential values have a difference of {0,1,2,3})
64 auto tmp_1 = delta_1;
65 tmp_1 *= (delta_1 + minus_one);
66 tmp_1 *= (delta_1 + minus_two);
67 tmp_1 *= (delta_1 + minus_three);
68 tmp_1 *= is_last_witness_or_masking;
69 tmp_1 *= scaling_factor;
70 std::get<0>(accumulators) += tmp_1;
71
72 // Contribution (2)
73 auto tmp_2 = delta_2;
74 tmp_2 *= (delta_2 + minus_one);
75 tmp_2 *= (delta_2 + minus_two);
76 tmp_2 *= (delta_2 + minus_three);
77 tmp_2 *= is_last_witness_or_masking;
78 tmp_2 *= scaling_factor;
79
80 std::get<1>(accumulators) += tmp_2;
81
82 // Contribution (3)
83 auto tmp_3 = delta_3;
84 tmp_3 *= (delta_3 + minus_one);
85 tmp_3 *= (delta_3 + minus_two);
86 tmp_3 *= (delta_3 + minus_three);
87 tmp_3 *= is_last_witness_or_masking;
88 tmp_3 *= scaling_factor;
89 std::get<2>(accumulators) += tmp_3;
90
91 // Contribution (4)
92 auto tmp_4 = delta_4;
93 tmp_4 *= (delta_4 + minus_one);
94 tmp_4 *= (delta_4 + minus_two);
95 tmp_4 *= (delta_4 + minus_three);
96 tmp_4 *= is_last_witness_or_masking;
97 tmp_4 *= scaling_factor;
98 std::get<3>(accumulators) += tmp_4;
99
100 // Contribution (5)
101 auto tmp_5 = delta_5;
102 tmp_5 *= (delta_5 + minus_one);
103 tmp_5 *= (delta_5 + minus_two);
104 tmp_5 *= (delta_5 + minus_three);
105 tmp_5 *= is_last_witness_or_masking;
106 tmp_5 *= scaling_factor;
107 std::get<4>(accumulators) += tmp_5;
108 }();
109
110 [&]() {
112 using View = typename Accumulator::View;
113 auto ordered_range_constraints_0 = View(in.ordered_range_constraints_0);
114 auto ordered_range_constraints_1 = View(in.ordered_range_constraints_1);
115 auto ordered_range_constraints_2 = View(in.ordered_range_constraints_2);
116 auto ordered_range_constraints_3 = View(in.ordered_range_constraints_3);
117 auto ordered_range_constraints_4 = View(in.ordered_range_constraints_4);
118 auto lagrange_real_last = View(in.lagrange_real_last);
119
120 // Contribution (6) (Contributions 6-10 ensure that the last value is the designated maximum value. We don't
121 // need to constrain the first value to be 0, because the shift mechanic does this for us)
122 std::get<5>(accumulators) +=
123 lagrange_real_last * (ordered_range_constraints_0 + maximum_sort_value) * scaling_factor;
124 // Contribution (7)
125 std::get<6>(accumulators) +=
126 lagrange_real_last * (ordered_range_constraints_1 + maximum_sort_value) * scaling_factor;
127 // Contribution (8)
128 std::get<7>(accumulators) +=
129 lagrange_real_last * (ordered_range_constraints_2 + maximum_sort_value) * scaling_factor;
130 // Contribution (9)
131 std::get<8>(accumulators) +=
132 lagrange_real_last * (ordered_range_constraints_3 + maximum_sort_value) * scaling_factor;
133 // Contribution (10)
134 std::get<9>(accumulators) +=
135 lagrange_real_last * (ordered_range_constraints_4 + maximum_sort_value) * scaling_factor;
136 }();
137};
138} // namespace bb
static void accumulate(ContainerOverSubrelations &accumulators, const AllEntities &in, const Parameters &, const FF &scaling_factor)
Expression for the generalized permutation sort relation.
Entry point for Barretenberg command-line interface.
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13