-
Notifications
You must be signed in to change notification settings - Fork 40
Open
Description
We should use sumcheck_layer_eval to reduce the cycles in the computation of initial_sum.
The old codes do three things:
-
get initial product evaluations;
ceno/ceno_recursion/src/tower_verifier/program.rs
Lines 224 to 243 in 1e7dbea
let prod_spec_point_n_eval: Array<C, PointAndEvalVariable<C>> = builder.dyn_array(num_prod_spec.clone()); iter_zip!(builder, prod_out_evals, prod_spec_point_n_eval).for_each(|ptr_vec, builder| { let ptr = ptr_vec[0]; let evals = builder.iter_ptr_get(&prod_out_evals, ptr); let e = evaluate_at_point_degree_1(builder, &evals, &initial_rt); let p_ptr = ptr_vec[1]; builder.iter_ptr_set( &prod_spec_point_n_eval, p_ptr, PointAndEvalVariable { point: PointVariable { fs: initial_rt.clone(), }, eval: e, }, ); }); -
get initial logup evaluations and store them in two separate arrays.
ceno/ceno_recursion/src/tower_verifier/program.rs
Lines 243 to 289 in 1e7dbea
let logup_spec_p_point_n_eval: Array<C, PointAndEvalVariable<C>> = builder.dyn_array(num_logup_spec.clone()); let logup_spec_q_point_n_eval: Array<C, PointAndEvalVariable<C>> = builder.dyn_array(num_logup_spec.clone()); iter_zip!( builder, logup_out_evals, logup_spec_p_point_n_eval, logup_spec_q_point_n_eval ) .for_each(|ptr_vec, builder| { let ptr = ptr_vec[0]; let evals = builder.iter_ptr_get(&prod_out_evals, ptr); let p_slice = evals.slice(builder, 0, 2); let q_slice = evals.slice(builder, 2, 4); let e1 = evaluate_at_point_degree_1(builder, &p_slice, &initial_rt); let e2 = evaluate_at_point_degree_1(builder, &q_slice, &initial_rt); let p_ptr = ptr_vec[1]; let q_ptr = ptr_vec[2]; builder.iter_ptr_set( &logup_spec_p_point_n_eval, p_ptr, PointAndEvalVariable { point: PointVariable { fs: initial_rt.clone(), }, eval: e1, }, ); builder.iter_ptr_set( &logup_spec_q_point_n_eval, q_ptr, PointAndEvalVariable { point: PointVariable { fs: initial_rt.clone(), }, eval: e2, }, ); }); -
get initial sum by accumulating the above 3 arrays.
ceno/ceno_recursion/src/tower_verifier/program.rs
Lines 289 to 308 in 1e7dbea
let initial_claim: Ext<C::F, C::EF> = builder.eval(zero + zero); iter_zip!(builder, prod_spec_point_n_eval).for_each(|ptr_vec, builder| { let ptr = ptr_vec[0]; let prod_eval = builder.iter_ptr_get(&prod_spec_point_n_eval, ptr); builder.assign(&initial_claim, initial_claim + prod_eval.eval * alpha_acc); builder.assign(&alpha_acc, alpha_acc * alpha); }); builder .range(0, num_logup_spec.clone()) .for_each(|i_vec, builder| { let p = builder.get(&logup_spec_p_point_n_eval, i_vec[0]); builder.assign(&initial_claim, initial_claim + p.eval * alpha_acc); builder.assign(&alpha_acc, alpha_acc * alpha); let q = builder.get(&logup_spec_q_point_n_eval, i_vec[0]); builder.assign(&initial_claim, initial_claim + q.eval * alpha_acc); builder.assign(&alpha_acc, alpha_acc * alpha); });
Metadata
Metadata
Assignees
Labels
No labels