use ark_ff::Field;
use ark_poly::{
multivariate::{SparsePolynomial, SparseTerm, Term},
DenseMVPolynomial, Polynomial,
};
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
use ark_std::vec::Vec;
#[derive(Debug, Clone, CanonicalSerialize, CanonicalDeserialize)]
pub struct PolynomialPredicate<F: Field> {
pub polynomial: SparsePolynomial<F, SparseTerm>,
}
impl<F: Field> PolynomialPredicate<F> {
pub fn new(arity: usize, terms: impl IntoIterator<Item = (F, Vec<(usize, usize)>)>) -> Self {
let sparse_terms = terms
.into_iter()
.map(|(coeff, term)| (coeff, SparseTerm::new(term.clone())))
.collect();
Self {
polynomial: SparsePolynomial::from_coefficients_vec(arity, sparse_terms),
}
}
}
impl<F: Field> PolynomialPredicate<F> {
pub fn is_satisfied(&self, variables: &[F]) -> bool {
self.polynomial.evaluate(&variables.to_vec()).is_zero()
}
pub fn eval(&self, variables: &[F]) -> F {
self.polynomial.evaluate(&variables.to_vec())
}
pub fn arity(&self) -> usize {
self.polynomial.num_vars()
}
pub fn degree(&self) -> usize {
self.polynomial.degree()
}
}
pub const R1CS_PREDICATE_LABEL: &str = "R1CS";
pub const SR1CS_PREDICATE_LABEL: &str = "SR1CS";