@@ -35,9 +35,6 @@ impl<'a, T: FieldElement> MultiplicityColumnGenerator<'a, T> {
35
35
) -> HashMap < String , Vec < T > > {
36
36
record_start ( MULTIPLICITY_WITGEN_NAME ) ;
37
37
38
- // A map from multiplicity column ID to the vector of multiplicities.
39
- let mut multiplicity_columns = BTreeMap :: new ( ) ;
40
-
41
38
let ( identities, _) = convert_identities ( self . fixed . analyzed ) ;
42
39
43
40
let all_columns = witness_columns
@@ -75,11 +72,11 @@ impl<'a, T: FieldElement> MultiplicityColumnGenerator<'a, T> {
75
72
} )
76
73
. map ( |( bus_id, bus_receive) | {
77
74
let ( size, rhs_tuples) =
78
- self . get_tuples ( & terminal_values, & bus_receive. selected_payload ) ;
75
+ self . get_tuples ( & terminal_values, & bus_receive. selected_payload , None ) ;
79
76
80
77
let index = rhs_tuples
81
78
. into_iter ( )
82
- . map ( |( i, tuple) | {
79
+ . map ( |( i, tuple, _ ) | {
83
80
// There might be multiple identical rows, but it's fine, we can pick any.
84
81
( tuple, i)
85
82
} )
@@ -104,28 +101,35 @@ impl<'a, T: FieldElement> MultiplicityColumnGenerator<'a, T> {
104
101
} )
105
102
. collect :: < BTreeMap < _ , _ > > ( ) ;
106
103
104
+ // A map from multiplicity column ID to the vector of multiplicities.
105
+ let mut multiplicity_columns = receive_infos
106
+ . values ( )
107
+ . map ( |info| ( info. multiplicity_column , vec ! [ 0 ; info. size] ) )
108
+ . collect :: < BTreeMap < _ , _ > > ( ) ;
109
+
107
110
// Increment multiplicities for all bus sends.
108
- for ( bus_send, bus_receive) in identities. iter ( ) . filter_map ( |i| match i {
109
- Identity :: BusSend ( bus_send) => receive_infos
110
- . get ( & bus_send. bus_id ( ) . unwrap ( ) )
111
- . map ( |bus_receive| ( bus_send, bus_receive) ) ,
111
+ for bus_send in identities. iter ( ) . filter_map ( |i| match i {
112
+ Identity :: BusSend ( bus_send) => Some ( bus_send) ,
112
113
_ => None ,
113
114
} ) {
114
- let ( _, lhs_tuples) = self . get_tuples ( & terminal_values, & bus_send. selected_payload ) ;
115
-
116
- let multiplicities = multiplicity_columns
117
- . entry ( bus_receive. multiplicity_column )
118
- . or_insert_with ( || vec ! [ 0 ; bus_receive. size] ) ;
119
- assert_eq ! ( multiplicities. len( ) , bus_receive. size) ;
115
+ let ( _, lhs_tuples) = self . get_tuples (
116
+ & terminal_values,
117
+ & bus_send. selected_payload ,
118
+ Some ( & bus_send. bus_id ) ,
119
+ ) ;
120
120
121
121
// Looking up the index is slow, so we do it in parallel.
122
122
let indices = lhs_tuples
123
123
. into_par_iter ( )
124
- . map ( |( _, tuple) | bus_receive. index [ & tuple] )
124
+ . filter_map ( |( _, tuple, bus_id) | {
125
+ receive_infos. get ( & bus_id. unwrap ( ) ) . map ( |receive_info| {
126
+ ( receive_info. multiplicity_column , receive_info. index [ & tuple] )
127
+ } )
128
+ } )
125
129
. collect :: < Vec < _ > > ( ) ;
126
130
127
- for index in indices {
128
- multiplicities [ index] += 1 ;
131
+ for ( multiplicity_column , index) in indices {
132
+ multiplicity_columns . get_mut ( & multiplicity_column ) . unwrap ( ) [ index] += 1 ;
129
133
}
130
134
}
131
135
@@ -151,7 +155,8 @@ impl<'a, T: FieldElement> MultiplicityColumnGenerator<'a, T> {
151
155
& self ,
152
156
terminal_values : & OwnedTerminalValues < T > ,
153
157
selected_expressions : & SelectedExpressions < T > ,
154
- ) -> ( usize , Vec < ( usize , Vec < T > ) > ) {
158
+ bus_id : Option < & AlgebraicExpression < T > > ,
159
+ ) -> ( usize , Vec < ( usize , Vec < T > , Option < T > ) > ) {
155
160
let machine_size = selected_expressions
156
161
. expressions
157
162
. iter ( )
@@ -178,17 +183,21 @@ impl<'a, T: FieldElement> MultiplicityColumnGenerator<'a, T> {
178
183
terminal_values. row ( row) ,
179
184
& self . fixed . intermediate_definitions ,
180
185
) ;
181
- let result = evaluator. evaluate ( & selected_expressions. selector ) ;
186
+ let selector = evaluator. evaluate ( & selected_expressions. selector ) ;
182
187
183
- assert ! ( result. is_zero( ) || result. is_one( ) , "Non-binary selector" ) ;
184
- result. is_one ( ) . then ( || {
188
+ assert ! (
189
+ selector. is_zero( ) || selector. is_one( ) ,
190
+ "Non-binary selector"
191
+ ) ;
192
+ selector. is_one ( ) . then ( || {
185
193
(
186
194
row,
187
195
selected_expressions
188
196
. expressions
189
197
. iter ( )
190
198
. map ( |expression| evaluator. evaluate ( expression) )
191
199
. collect :: < Vec < _ > > ( ) ,
200
+ bus_id. map ( |bus_id| evaluator. evaluate ( bus_id) ) ,
192
201
)
193
202
} )
194
203
} )
0 commit comments