use core::fmt::Debug;
use p3_field::{ExtensionField, Field};
use serde::Serialize;
use serde::de::DeserializeOwned;
pub trait MultilinearPcs<Challenge, Challenger>
where
Challenge: ExtensionField<Self::Val>,
{
type Val: Field;
type Commitment: Clone + Serialize + DeserializeOwned;
type ProverData;
type Proof: Clone + Serialize + DeserializeOwned;
type Error: Debug;
type Witness;
type OpeningProtocol;
fn num_vars(&self) -> usize;
fn commit(
&self,
witness: Self::Witness,
challenger: &mut Challenger,
) -> (Self::Commitment, Self::ProverData);
fn open(
&self,
prover_data: Self::ProverData,
protocol: Self::OpeningProtocol,
challenger: &mut Challenger,
) -> Self::Proof;
fn verify(
&self,
commitment: &Self::Commitment,
proof: &Self::Proof,
challenger: &mut Challenger,
protocol: Self::OpeningProtocol,
) -> Result<(), Self::Error>;
}