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 Proof: Clone + Serialize + DeserializeOwned;
32
33 type Error: Debug;
34
35 fn natural_domain_for_degree(&self, degree: usize) -> Self::Domain;
37
38 #[allow(clippy::type_complexity)]
39 fn commit(
40 &self,
41 evaluations: Vec<(Self::Domain, RowMajorMatrix<Val<Self::Domain>>)>,
42 ) -> (Self::Commitment, Self::ProverData);
43
44 fn get_evaluations_on_domain<'a>(
45 &self,
46 prover_data: &'a Self::ProverData,
47 idx: usize,
48 domain: Self::Domain,
49 ) -> impl Matrix<Val<Self::Domain>> + 'a;
50
51 fn open(
52 &self,
53 rounds: Vec<(
55 &Self::ProverData,
56 Vec<
58 Vec<Challenge>,
60 >,
61 )>,
62 challenger: &mut Challenger,
63 ) -> (OpenedValues<Challenge>, Self::Proof);
64
65 #[allow(clippy::type_complexity)]
66 fn verify(
67 &self,
68 rounds: Vec<(
70 Self::Commitment,
71 Vec<(
73 Self::Domain,
75 Vec<(
77 Challenge,
79 Vec<Challenge>,
81 )>,
82 )>,
83 )>,
84 proof: &Self::Proof,
85 challenger: &mut Challenger,
86 ) -> Result<(), Self::Error>;
87}
88
89pub type OpenedValues<F> = Vec<OpenedValuesForRound<F>>;
90pub type OpenedValuesForRound<F> = Vec<OpenedValuesForMatrix<F>>;
91pub type OpenedValuesForMatrix<F> = Vec<OpenedValuesForPoint<F>>;
92pub type OpenedValuesForPoint<F> = Vec<F>;