use itertools::Itertools;
use super::{CircleEvaluation, CirclePoly};
use crate::core::circle::{CirclePoint, Coset};
use crate::core::fields::m31::BaseField;
use crate::core::fields::qm31::SecureField;
use crate::core::poly::circle::{CanonicCoset, CircleDomain};
use crate::core::ColumnVec;
use crate::prover::backend::ColumnOps;
use crate::prover::poly::twiddles::TwiddleTree;
use crate::prover::poly::BitReversedOrder;
pub trait PolyOps: ColumnOps<BaseField> + Sized {
type Twiddles;
fn interpolate(
eval: CircleEvaluation<Self, BaseField, BitReversedOrder>,
itwiddles: &TwiddleTree<Self>,
) -> CirclePoly<Self>;
fn interpolate_columns(
columns: impl IntoIterator<Item = CircleEvaluation<Self, BaseField, BitReversedOrder>>,
twiddles: &TwiddleTree<Self>,
) -> Vec<CirclePoly<Self>> {
columns
.into_iter()
.map(|eval| eval.interpolate_with_twiddles(twiddles))
.collect()
}
fn eval_at_point(poly: &CirclePoly<Self>, point: CirclePoint<SecureField>) -> SecureField;
fn extend(poly: &CirclePoly<Self>, log_size: u32) -> CirclePoly<Self>;
fn evaluate(
poly: &CirclePoly<Self>,
domain: CircleDomain,
twiddles: &TwiddleTree<Self>,
) -> CircleEvaluation<Self, BaseField, BitReversedOrder>;
fn evaluate_polynomials(
polynomials: &ColumnVec<CirclePoly<Self>>,
log_blowup_factor: u32,
twiddles: &TwiddleTree<Self>,
) -> Vec<CircleEvaluation<Self, BaseField, BitReversedOrder>> {
polynomials
.iter()
.map(|poly| {
poly.evaluate_with_twiddles(
CanonicCoset::new(poly.log_size() + log_blowup_factor).circle_domain(),
twiddles,
)
})
.collect_vec()
}
fn precompute_twiddles(coset: Coset) -> TwiddleTree<Self>;
}