31 #ifndef CRYPTO3_ZK_BLUEPRINT_AS_WAKSMAN_ROUTING_COMPONENT_HPP
32 #define CRYPTO3_ZK_BLUEPRINT_AS_WAKSMAN_ROUTING_COMPONENT_HPP
43 namespace components {
45 template<
typename FieldType>
64 std::vector<std::vector<blueprint_variable_vector<FieldType>>>
routed_packets;
76 std::vector<std::map<std::size_t, blueprint_variable<FieldType>>>
asw_switch_bits;
96 template<
typename FieldType>
99 template<
typename FieldType>
102 const std::size_t num_packets,
107 routing_input_bits(routing_input_bits), routing_output_bits(routing_output_bits),
108 packet_size(routing_input_bits[0].size()),
109 num_subpackets((packet_size + FieldType::capacity() - 1) / FieldType::capacity()) {
117 for (std::size_t packet_idx = 0; packet_idx <
num_packets; ++packet_idx) {
121 for (std::size_t column_idx = 0; column_idx <
num_columns; ++column_idx) {
124 for (std::size_t row_idx = 0; row_idx <
num_packets; ++row_idx) {
130 const std::size_t straight_edge =
neighbors[column_idx][row_idx].first;
131 const std::size_t cross_edge =
neighbors[column_idx][row_idx].second;
142 for (std::size_t packet_idx = 0; packet_idx <
num_packets; ++packet_idx) {
148 FieldType::capacity()));
154 FieldType::capacity()));
161 for (std::size_t column_idx = 0; column_idx <
num_columns; ++column_idx) {
162 for (std::size_t row_idx = 0; row_idx <
num_packets; ++row_idx) {
172 template<
typename FieldType>
175 for (std::size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
176 pack_inputs[packet_idx].generate_r1cs_constraints(
false);
177 unpack_outputs[packet_idx].generate_r1cs_constraints(
true);
181 for (std::size_t column_idx = 0; column_idx < num_columns; ++column_idx) {
182 for (std::size_t row_idx = 0; row_idx < num_packets; ++row_idx) {
183 if (neighbors[column_idx][row_idx].first == neighbors[column_idx][row_idx].second) {
188 if (num_subpackets == 1) {
192 for (std::size_t switch_input : {row_idx, row_idx + 1}) {
193 const std::size_t straight_edge = neighbors[column_idx][switch_input].first;
194 const std::size_t cross_edge = neighbors[column_idx][switch_input].second;
197 routed_packets[column_idx][switch_input][0] -
198 routed_packets[column_idx + 1][straight_edge][0],
199 routed_packets[column_idx][switch_input][0] -
200 routed_packets[column_idx + 1][cross_edge][0],
205 generate_boolean_r1cs_constraint<FieldType>(this->bp,
206 asw_switch_bits[column_idx][row_idx]);
209 for (std::size_t subpacket_idx = 0; subpacket_idx < num_subpackets; ++subpacket_idx) {
214 for (std::size_t switch_input : {row_idx, row_idx + 1}) {
215 const std::size_t straight_edge = neighbors[column_idx][switch_input].first;
216 const std::size_t cross_edge = neighbors[column_idx][switch_input].second;
219 asw_switch_bits[column_idx][row_idx],
220 routed_packets[column_idx + 1][cross_edge][subpacket_idx] -
221 routed_packets[column_idx + 1][straight_edge][subpacket_idx],
222 routed_packets[column_idx][switch_input][subpacket_idx] -
223 routed_packets[column_idx + 1][straight_edge][subpacket_idx]));
234 template<
typename FieldType>
236 const integer_permutation &permutation) {
238 for (std::size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
239 pack_inputs[packet_idx].generate_r1cs_witness_from_bits();
245 for (std::size_t column_idx = 0; column_idx < num_columns; ++column_idx) {
246 for (std::size_t row_idx = 0; row_idx < num_packets; ++row_idx) {
247 if (neighbors[column_idx][row_idx].first == neighbors[column_idx][row_idx].second) {
249 const std::size_t next = neighbors[column_idx][row_idx].first;
251 for (std::size_t subpacket_idx = 0; subpacket_idx < num_subpackets; ++subpacket_idx) {
252 this->bp.val(routed_packets[column_idx + 1][next][subpacket_idx]) =
253 this->bp.val(routed_packets[column_idx][row_idx][subpacket_idx]);
256 if (num_subpackets > 1) {
258 this->bp.val(asw_switch_bits[column_idx][row_idx]) =
259 typename FieldType::value_type(routing[column_idx][row_idx] ? 1 : 0);
263 const bool switch_val = routing[column_idx][row_idx];
265 for (std::size_t switch_input : {row_idx, row_idx + 1}) {
266 const std::size_t straight_edge = neighbors[column_idx][switch_input].first;
267 const std::size_t cross_edge = neighbors[column_idx][switch_input].second;
269 const std::size_t switched_edge = (switch_val ? cross_edge : straight_edge);
271 for (std::size_t subpacket_idx = 0; subpacket_idx < num_subpackets;
273 this->bp.val(routed_packets[column_idx + 1][switched_edge][subpacket_idx]) =
274 this->bp.val(routed_packets[column_idx][switch_input][subpacket_idx]);
285 for (std::size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
286 unpack_outputs[packet_idx].generate_r1cs_witness_from_packed();
290 template<
typename FieldType>
293 integer_permutation permutation(num_packets);
294 permutation.random_shuffle();
296 std::vector<blueprint_variable_vector<FieldType>> randbits(num_packets), outbits(num_packets);
297 for (std::size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
298 randbits[packet_idx].allocate(bp, packet_size);
299 outbits[packet_idx].allocate(bp, packet_size);
301 for (std::size_t bit_idx = 0; bit_idx < packet_size; ++bit_idx) {
302 bp.
val(randbits[packet_idx][bit_idx]) =
303 (rand() % 2) ? FieldType::value_type::zero() : FieldType::value_type::zero();
312 for (std::size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
313 for (std::size_t bit_idx = 0; bit_idx < packet_size; ++bit_idx) {
314 assert(bp.
val(outbits[permutation.get(packet_idx)][bit_idx]) ==
315 bp.
val(randbits[packet_idx][bit_idx]));
Definition: blueprint_variable.hpp:57
Definition: blueprint_variable.hpp:46
Definition: blueprint.hpp:46
FieldType::value_type & val(const blueprint_variable< FieldType > &var)
Definition: blueprint.hpp:70
bool is_satisfied() const
Definition: blueprint.hpp:102
Definition: component.hpp:37
blueprint< FieldType > & bp
Definition: component.hpp:39
Definition: packing.hpp:100
vector(T, U...) -> vector< std::enable_if_t<(std::is_same_v< T, U > &&...), T >, 1+sizeof...(U)>
deduction guide for uniform initialization
void test_as_waksman_routing_component(const std::size_t num_packets, const std::size_t packet_size)
Definition: as_waksman_components.hpp:291
std::size_t as_waksman_num_columns(size_t num_packets)
Definition: as_waksman.hpp:186
std::vector< std::vector< std::pair< std::size_t, std::size_t > > > as_waksman_topology
Definition: as_waksman.hpp:99
std::vector< std::map< std::size_t, bool > > as_waksman_routing
Definition: as_waksman.hpp:118
as_waksman_topology generate_as_waksman_topology(size_t num_packets)
Definition: as_waksman.hpp:299
as_waksman_routing get_as_waksman_routing(const integer_permutation &permutation)
Definition: as_waksman.hpp:612
Definition: as_waksman_components.hpp:46
std::vector< multipacking_component< FieldType > > unpack_outputs
Definition: as_waksman_components.hpp:65
const std::size_t packet_size
Definition: as_waksman_components.hpp:85
const std::vector< blueprint_variable_vector< FieldType > > routing_output_bits
Definition: as_waksman_components.hpp:83
const std::size_t num_packets
Definition: as_waksman_components.hpp:80
std::vector< multipacking_component< FieldType > > pack_inputs
Definition: as_waksman_components.hpp:65
const std::size_t num_columns
Definition: as_waksman_components.hpp:81
void generate_r1cs_constraints()
Definition: as_waksman_components.hpp:173
const std::size_t num_subpackets
Definition: as_waksman_components.hpp:85
std::vector< std::map< std::size_t, blueprint_variable< FieldType > > > asw_switch_bits
Definition: as_waksman_components.hpp:76
as_waksman_routing_component(blueprint< FieldType > &bp, const std::size_t num_packets, const std::vector< blueprint_variable_vector< FieldType >> &routing_input_bits, const std::vector< blueprint_variable_vector< FieldType >> &routing_output_bits)
Definition: as_waksman_components.hpp:100
void generate_r1cs_witness(const integer_permutation &permutation)
Definition: as_waksman_components.hpp:235
const std::vector< blueprint_variable_vector< FieldType > > routing_input_bits
Definition: as_waksman_components.hpp:82
std::vector< std::vector< blueprint_variable_vector< FieldType > > > routed_packets
Definition: as_waksman_components.hpp:64
as_waksman_topology neighbors
Definition: as_waksman_components.hpp:77