Skip to content

apply sumcheck_layer_eval to compute initial sum in tower verifier #1244

@kunxian-xia

Description

@kunxian-xia

We should use sumcheck_layer_eval to reduce the cycles in the computation of initial_sum.

The old codes do three things:

  1. 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,
    },
    );
    });

  2. 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,
    },
    );
    });

  3. 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);
    });

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions