use field_cat::Field;
use crate::poly::MultilinearPoly;
#[derive(Debug, Clone)]
pub struct SumcheckClaim<F: Field> {
poly: MultilinearPoly<F>,
claimed_sum: F,
}
impl<F: Field> SumcheckClaim<F> {
#[must_use]
pub fn new(poly: MultilinearPoly<F>, claimed_sum: F) -> Self {
Self { poly, claimed_sum }
}
#[must_use]
pub fn poly(&self) -> &MultilinearPoly<F> {
&self.poly
}
#[must_use]
pub fn claimed_sum(&self) -> &F {
&self.claimed_sum
}
}
#[derive(Debug, Clone)]
pub struct RoundPoly<F: Field> {
eval_zero: F,
eval_one: F,
}
impl<F: Field> RoundPoly<F> {
#[must_use]
pub fn new(eval_zero: F, eval_one: F) -> Self {
Self {
eval_zero,
eval_one,
}
}
#[must_use]
pub fn eval_zero(&self) -> &F {
&self.eval_zero
}
#[must_use]
pub fn eval_one(&self) -> &F {
&self.eval_one
}
#[must_use]
pub fn evaluate(&self, t: &F) -> F {
self.eval_zero.clone() * (F::one() - t.clone()) + self.eval_one.clone() * t.clone()
}
}
#[derive(Debug, Clone)]
pub struct SumcheckProof<F: Field> {
round_polys: Vec<RoundPoly<F>>,
}
impl<F: Field> SumcheckProof<F> {
#[must_use]
pub fn new(round_polys: Vec<RoundPoly<F>>) -> Self {
Self { round_polys }
}
#[must_use]
pub fn round_polys(&self) -> &[RoundPoly<F>] {
&self.round_polys
}
}