binius_core/protocols/gkr_gpa/
oracles.rs1use std::iter;
4
5use binius_field::{Field, PackedField, TowerField};
6use binius_utils::bail;
7use tracing::instrument;
8
9use super::{gkr_gpa::LayerClaim, Error, GrandProductClaim, GrandProductWitness};
10use crate::{
11 oracle::{MultilinearOracleSet, OracleId},
12 protocols::evalcheck::EvalcheckMultilinearClaim,
13};
14
15pub fn get_grand_products_from_witnesses<PW, F>(witnesses: &[GrandProductWitness<PW>]) -> Vec<F>
16where
17 PW: PackedField<Scalar: Into<F>>,
18 F: Field,
19{
20 witnesses
21 .iter()
22 .map(|witness| witness.grand_product_evaluation().into())
23 .collect::<Vec<_>>()
24}
25
26pub fn construct_grand_product_claims<F>(
27 ids: &[OracleId],
28 oracles: &MultilinearOracleSet<F>,
29 products: &[F],
30) -> Result<Vec<GrandProductClaim<F>>, Error>
31where
32 F: TowerField,
33{
34 if ids.len() != products.len() {
35 bail!(Error::MetasProductsMismatch);
36 }
37
38 Ok(iter::zip(ids, products)
39 .map(|(id, product)| GrandProductClaim {
40 n_vars: oracles.n_vars(*id),
41 product: *product,
42 })
43 .collect::<Vec<_>>())
44}
45
46#[instrument(skip_all, level = "debug")]
47pub fn make_eval_claims<F: TowerField>(
48 metas: impl IntoIterator<Item = OracleId>,
49 final_layer_claims: impl IntoIterator<IntoIter: ExactSizeIterator<Item = LayerClaim<F>>>,
50) -> Result<Vec<EvalcheckMultilinearClaim<F>>, Error> {
51 let metas = metas.into_iter().collect::<Vec<_>>();
52
53 let final_layer_claims = final_layer_claims.into_iter();
54 if metas.len() != final_layer_claims.len() {
55 bail!(Error::MetasClaimMismatch);
56 }
57
58 Ok(iter::zip(metas, final_layer_claims)
59 .map(|(oracle_id, claim)| EvalcheckMultilinearClaim {
60 id: oracle_id,
61 eval_point: claim.eval_point.into(),
62 eval: claim.eval,
63 })
64 .collect::<Vec<_>>())
65}