@@ -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