binius_core/protocols/gkr_gpa/
oracles.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3use 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}