use p3_field::{ExtensionField, TwoAdicField};
use p3_multilinear_util::point::Point;
use crate::layout::{Layout, PrefixProver, ProverMultiClaim, ProverVirtualClaim, SuffixProver};
use crate::product_polynomial::ProductPolynomial;
use crate::strategy::VariableOrder;
pub trait ZkLayout<F, EF>: Layout<F, EF>
where
F: TwoAdicField,
EF: ExtensionField<F>,
{
#[inline]
fn concrete_claims(&self) -> impl Iterator<Item = &ProverMultiClaim<F, EF>> {
self.claims().concrete_claims()
}
#[inline]
fn virtual_claims(&self) -> &[ProverVirtualClaim<EF>] {
&self.claims().virtual_claims
}
#[inline]
fn batched_sum(&self, alpha: EF) -> EF {
self.claims().sum(alpha)
}
fn zk_residual_handoff(self, rs: &Point<EF>, alpha: EF, eps: EF) -> ProductPolynomial<F, EF>
where
EF: TwoAdicField;
}
impl<F, EF> ZkLayout<F, EF> for PrefixProver<F, EF>
where
F: TwoAdicField,
EF: ExtensionField<F>,
{
fn zk_residual_handoff(self, rs: &Point<EF>, alpha: EF, eps: EF) -> ProductPolynomial<F, EF>
where
EF: TwoAdicField,
{
self.residual_product(rs, alpha, eps)
}
}
impl<F, EF> ZkLayout<F, EF> for SuffixProver<F, EF>
where
F: TwoAdicField,
EF: ExtensionField<F>,
{
fn zk_residual_handoff(self, rs: &Point<EF>, alpha: EF, eps: EF) -> ProductPolynomial<F, EF>
where
EF: TwoAdicField,
{
let reversed = rs.reversed();
let compressed = tracing::info_span!("compress_stacked_with_eps")
.in_scope(|| self.compress_stacked_scaled(&reversed, eps));
let weights = self.combine_weights(&reversed, alpha);
ProductPolynomial::new_unpacked(VariableOrder::Suffix, compressed, weights)
}
}