halo2_axiom/poly/kzg/multiopen/
gwc.rs

1mod prover;
2mod verifier;
3
4pub use prover::ProverGWC;
5pub use verifier::VerifierGWC;
6
7use crate::{poly::query::Query, transcript::ChallengeScalar};
8use ff::Field;
9use std::marker::PhantomData;
10
11#[derive(Clone, Copy, Debug)]
12struct U {}
13type ChallengeU<F> = ChallengeScalar<F, U>;
14
15#[derive(Clone, Copy, Debug)]
16struct V {}
17type ChallengeV<F> = ChallengeScalar<F, V>;
18
19struct CommitmentData<F: Field, Q: Query<F>> {
20    queries: Vec<Q>,
21    point: F,
22    _marker: PhantomData<F>,
23}
24
25fn construct_intermediate_sets<F: Field, I, Q: Query<F>>(queries: I) -> Vec<CommitmentData<F, Q>>
26where
27    I: IntoIterator<Item = Q> + Clone,
28{
29    let mut point_query_map: Vec<(F, Vec<Q>)> = Vec::new();
30    for query in queries {
31        if let Some(pos) = point_query_map
32            .iter()
33            .position(|(point, _)| *point == query.get_point())
34        {
35            let (_, queries) = &mut point_query_map[pos];
36            queries.push(query);
37        } else {
38            point_query_map.push((query.get_point(), vec![query]));
39        }
40    }
41
42    point_query_map
43        .into_iter()
44        .map(|(point, queries)| CommitmentData {
45            queries,
46            point,
47            _marker: PhantomData,
48        })
49        .collect()
50}