mod covector;
mod multilinear_extension;
mod univariate_evaluation;
use std::any::Any;
use ark_ff::Field;
use static_assertions::assert_obj_safe;
pub use self::{
covector::Covector, multilinear_extension::MultilinearExtension,
univariate_evaluation::UnivariateEvaluation,
};
use crate::algebra::{
embedding::{self, Embedding},
fields,
};
pub trait LinearForm<F: Field>: Any + Send + Sync {
fn size(&self) -> usize;
fn mle_evaluate(&self, point: &[F]) -> F;
fn accumulate(&self, accumulator: &mut [F], scalar: F);
}
pub trait Evaluate<M: Embedding>: LinearForm<M::Target> {
fn evaluate(&self, embedding: &M, vector: &[M::Source]) -> M::Target;
}
assert_obj_safe!(LinearForm<fields::Field64>);
assert_obj_safe!(Evaluate<embedding::Basefield<fields::Field64_2>>);