use std::convert::TryInto; use std::ops::Range; use crate::field::extension_field::algebra::ExtensionAlgebra; use crate::field::extension_field::target::{ExtensionAlgebraTarget, ExtensionTarget}; use crate::field::extension_field::{Extendable, FieldExtension}; use crate::field::field::Field; use crate::proof::{Hash, HashTarget}; #[derive(Debug, Copy, Clone)] pub struct EvaluationVars<'a, F: Extendable, const D: usize> { pub(crate) local_constants: &'a [F::Extension], pub(crate) local_wires: &'a [F::Extension], pub(crate) public_inputs_hash: &'a Hash, } #[derive(Debug, Copy, Clone)] pub struct EvaluationVarsBase<'a, F: Field> { pub(crate) local_constants: &'a [F], pub(crate) local_wires: &'a [F], pub(crate) public_inputs_hash: &'a Hash, } impl<'a, F: Extendable, const D: usize> EvaluationVars<'a, F, D> { pub fn get_local_ext_algebra( &self, wire_range: Range, ) -> ExtensionAlgebra { debug_assert_eq!(wire_range.len(), D); let arr = self.local_wires[wire_range].try_into().unwrap(); ExtensionAlgebra::from_basefield_array(arr) } pub fn remove_prefix(&mut self, prefix: &[bool]) { self.local_constants = &self.local_constants[prefix.len()..]; } } impl<'a, F: Field> EvaluationVarsBase<'a, F> { pub fn get_local_ext(&self, wire_range: Range) -> F::Extension where F: Extendable, { debug_assert_eq!(wire_range.len(), D); let arr = self.local_wires[wire_range].try_into().unwrap(); F::Extension::from_basefield_array(arr) } pub fn remove_prefix(&mut self, prefix: &[bool]) { self.local_constants = &self.local_constants[prefix.len()..]; } } impl<'a, const D: usize> EvaluationTargets<'a, D> { pub fn remove_prefix(&mut self, prefix: &[bool]) { self.local_constants = &self.local_constants[prefix.len()..]; } } #[derive(Copy, Clone)] pub struct EvaluationTargets<'a, const D: usize> { pub(crate) local_constants: &'a [ExtensionTarget], pub(crate) local_wires: &'a [ExtensionTarget], pub(crate) public_inputs_hash: &'a HashTarget, } impl<'a, const D: usize> EvaluationTargets<'a, D> { pub fn get_local_ext_algebra(&self, wire_range: Range) -> ExtensionAlgebraTarget { debug_assert_eq!(wire_range.len(), D); let arr = self.local_wires[wire_range].try_into().unwrap(); ExtensionAlgebraTarget(arr) } }