1use alloc::vec::Vec;
4use core::fmt::Debug;
5
6use p3_field::ExtensionField;
7use p3_matrix::dense::RowMajorMatrix;
8use p3_matrix::Matrix;
9use serde::de::DeserializeOwned;
10use serde::Serialize;
11
12use crate::PolynomialSpace;
13
14pub type Val<D> = <D as PolynomialSpace>::Val;
15
16pub trait Pcs<Challenge, Challenger>
19where
20 Challenge: ExtensionField<Val<Self::Domain>>,
21{
22 type Domain: PolynomialSpace;
23
24 type Commitment: Clone + Serialize + DeserializeOwned;
26
27 type ProverData;
29
30 type EvaluationsOnDomain<'a>: Matrix<Val<Self::Domain>> + 'a;
32
33 type Proof: Clone + Serialize + DeserializeOwned;
35
36 type Error: Debug;
37
38 fn natural_domain_for_degree(&self, degree: usize) -> Self::Domain;
40
41 #[allow(clippy::type_complexity)]
42 fn commit(
43 &self,
44 evaluations: Vec<(Self::Domain, RowMajorMatrix<Val<Self::Domain>>)>,
45 ) -> (Self::Commitment, Self::ProverData);
46
47 fn get_evaluations_on_domain<'a>(
48 &self,
49 prover_data: &'a Self::ProverData,
50 idx: usize,
51 domain: Self::Domain,
52 ) -> Self::EvaluationsOnDomain<'a>;
53
54 fn open(
55 &self,
56 rounds: Vec<(
58 &Self::ProverData,
59 Vec<
61 Vec<Challenge>,
63 >,
64 )>,
65 challenger: &mut Challenger,
66 ) -> (OpenedValues<Challenge>, Self::Proof);
67
68 #[allow(clippy::type_complexity)]
69 fn verify(
70 &self,
71 rounds: Vec<(
73 Self::Commitment,
74 Vec<(
76 Self::Domain,
78 Vec<(
80 Challenge,
82 Vec<Challenge>,
84 )>,
85 )>,
86 )>,
87 proof: &Self::Proof,
88 challenger: &mut Challenger,
89 ) -> Result<(), Self::Error>;
90}
91
92pub type OpenedValues<F> = Vec<OpenedValuesForRound<F>>;
93pub type OpenedValuesForRound<F> = Vec<OpenedValuesForMatrix<F>>;
94pub type OpenedValuesForMatrix<F> = Vec<OpenedValuesForPoint<F>>;
95pub type OpenedValuesForPoint<F> = Vec<F>;