use alloc::vec::Vec;
use p3_commit::Mmcs;
use p3_field::Field;
use p3_multilinear_util::poly::Poly;
use p3_sumcheck::{OpeningEvals, SumcheckData};
use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
#[serde(bound(
serialize = "MX::Commitment: Serialize, MX::MultiProof: Serialize",
deserialize = "MX::Commitment: Deserialize<'de>, MX::MultiProof: Deserialize<'de>"
))]
pub struct RoundProof<EF: Field, MX: Mmcs<EF>> {
pub commitment: MX::Commitment,
pub opened_values: Vec<Vec<EF>>,
pub multi_proof: MX::MultiProof,
}
#[derive(Clone, Serialize, Deserialize)]
#[serde(bound(
serialize = "MT::Commitment: Serialize, MT::MultiProof: Serialize, MX::Commitment: Serialize, MX::MultiProof: Serialize",
deserialize = "MT::Commitment: Deserialize<'de>, MT::MultiProof: Deserialize<'de>, MX::Commitment: Deserialize<'de>, MX::MultiProof: Deserialize<'de>"
))]
pub struct BinaryPcsProof<F: Field, EF: Field, MT: Mmcs<F>, MX: Mmcs<EF>> {
pub sumcheck: SumcheckData<F, EF>,
pub rounds: Vec<RoundProof<EF, MX>>,
pub base_opened_values: Vec<Vec<F>>,
pub base_multi_proof: MT::MultiProof,
pub final_codeword: Poly<EF>,
pub pow_witness: F,
pub evals: Vec<OpeningEvals<EF>>,
}