Skip to content

Commit 82a3ddd

Browse files
committed
expression to arithmetics
1 parent 89aa6ad commit 82a3ddd

File tree

1 file changed

+140
-0
lines changed
  • crates/multilinear_extensions/src/expression

1 file changed

+140
-0
lines changed

crates/multilinear_extensions/src/expression/utils.rs

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,143 @@ pub fn expr_convert_to_witins<E: ExtensionField>(
190190
Expression::Challenge(..) => (),
191191
}
192192
}
193+
194+
pub const DagLoadWit: usize = 0;
195+
pub const DagLoadScalar: usize = 1;
196+
pub const DagAdd: usize = 2;
197+
pub const DagMul: usize = 3;
198+
199+
pub fn expr_compression_to_dag<E: ExtensionField>(
200+
expr: &Expression<E>,
201+
challenges_offset: usize,
202+
constant_offset: usize,
203+
) -> (
204+
Vec<u32>,
205+
Vec<Instance>,
206+
Vec<Expression<E>>,
207+
Vec<Either<E::BaseField, E>>,
208+
) {
209+
let mut dag = vec![];
210+
let mut constant = vec![];
211+
let mut instance_scalar = vec![];
212+
let mut challenges = vec![];
213+
expr_compression_to_dag_helper(
214+
&mut dag,
215+
&mut instance_scalar,
216+
217+
challenges_offset,
218+
&mut challenges,
219+
constant_offset,
220+
&mut constant,
221+
expr,
222+
);
223+
(dag, instance_scalar, challenges, constant)
224+
}
225+
226+
fn expr_compression_to_dag_helper<E: ExtensionField>(
227+
dag: &mut Vec<u32>,
228+
instance_scalar: &mut Vec<Instance>,
229+
challenges_offset: usize,
230+
challenges: &mut Vec<Expression<E>>,
231+
constant_offset: usize,
232+
constant: &mut Vec<Either<E::BaseField, E>>,
233+
expr: &Expression<E>,
234+
) {
235+
match expr {
236+
Expression::Fixed(_) => unimplemented!(),
237+
Expression::WitIn(wit_id) => dag.extend(vec![DagLoadWit as u32, *wit_id as u32]),
238+
Expression::StructuralWitIn(_, ..) => unimplemented!(),
239+
Expression::Instance(_) => unimplemented!(),
240+
Expression::InstanceScalar(inst) => {
241+
instance_scalar.push(inst.clone());
242+
dag.extend(vec![DagLoadScalar as u32, instance_scalar.len() as u32 - 1])
243+
}
244+
Expression::Constant(value) => {
245+
constant.push(value.clone());
246+
dag.extend(vec![
247+
DagLoadScalar as u32,
248+
(constant_offset + constant.len()) as u32 - 1,
249+
])
250+
}
251+
Expression::Sum(a, b) => {
252+
expr_compression_to_dag_helper(
253+
dag,
254+
instance_scalar,
255+
challenges_offset,
256+
challenges,
257+
constant_offset,
258+
constant,
259+
a,
260+
);
261+
expr_compression_to_dag_helper(
262+
dag,
263+
instance_scalar,
264+
challenges_offset,
265+
challenges,
266+
constant_offset,
267+
constant,
268+
b,
269+
);
270+
dag.extend(vec![DagAdd as u32])
271+
}
272+
Expression::Product(a, b) => {
273+
expr_compression_to_dag_helper(
274+
dag,
275+
instance_scalar,
276+
challenges_offset,
277+
challenges,
278+
constant_offset,
279+
constant,
280+
a,
281+
);
282+
expr_compression_to_dag_helper(
283+
dag,
284+
instance_scalar,
285+
challenges_offset,
286+
challenges,
287+
constant_offset,
288+
constant,
289+
b,
290+
);
291+
dag.extend(vec![DagMul as u32])
292+
}
293+
Expression::ScaledSum(x, a, b) => {
294+
expr_compression_to_dag_helper(
295+
dag,
296+
instance_scalar,
297+
challenges_offset,
298+
challenges,
299+
constant_offset,
300+
constant,
301+
x,
302+
);
303+
expr_compression_to_dag_helper(
304+
dag,
305+
instance_scalar,
306+
challenges_offset,
307+
challenges,
308+
constant_offset,
309+
constant,
310+
a,
311+
);
312+
dag.extend(vec![DagMul as u32]);
313+
expr_compression_to_dag_helper(
314+
dag,
315+
instance_scalar,
316+
challenges_offset,
317+
challenges,
318+
constant_offset,
319+
constant,
320+
b,
321+
);
322+
dag.extend(vec![DagAdd as u32]);
323+
}
324+
c @ Expression::Challenge(..) => {
325+
challenges.push(c.clone());
326+
dag.extend(vec![
327+
DagLoadScalar as u32,
328+
(challenges_offset + challenges.len()) as u32 - 1,
329+
])
330+
}
331+
}
332+
}

0 commit comments

Comments
 (0)