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;
|
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.
|
|
|
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.
|
|
|
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); |
|
}); |
We should use
sumcheck_layer_evalto 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
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
get initial sum by accumulating the above 3 arrays.
ceno/ceno_recursion/src/tower_verifier/program.rs
Lines 289 to 308 in 1e7dbea