binius_core/transparent/
constant.rs1use binius_field::{BinaryField128b, ExtensionField, TowerField};
4use binius_macros::{erased_serialize_bytes, DeserializeBytes, SerializeBytes};
5use binius_utils::{bail, DeserializeBytes};
6
7use crate::polynomial::{Error, MultivariatePoly};
8
9#[derive(Debug, Copy, Clone, SerializeBytes, DeserializeBytes)]
11pub struct Constant<F: TowerField> {
12 n_vars: usize,
13 value: F,
14 tower_level: usize,
15}
16
17inventory::submit! {
18 <dyn MultivariatePoly<BinaryField128b>>::register_deserializer(
19 "Constant",
20 |buf, mode| Ok(Box::new(Constant::<BinaryField128b>::deserialize(&mut *buf, mode)?))
21 )
22}
23
24impl<F: TowerField> Constant<F> {
25 pub fn new<FS: TowerField>(n_vars: usize, value: FS) -> Self
26 where
27 F: ExtensionField<FS>,
28 {
29 Self {
30 value: value.into(),
31 tower_level: FS::TOWER_LEVEL,
32 n_vars,
33 }
34 }
35}
36
37#[erased_serialize_bytes]
38impl<F: TowerField> MultivariatePoly<F> for Constant<F> {
39 fn n_vars(&self) -> usize {
40 self.n_vars
41 }
42
43 fn degree(&self) -> usize {
44 0
45 }
46
47 fn evaluate(&self, query: &[F]) -> Result<F, Error> {
48 if query.len() != self.n_vars {
49 bail!(Error::IncorrectQuerySize {
50 expected: self.n_vars,
51 });
52 }
53 Ok(self.value)
54 }
55
56 fn binary_tower_level(&self) -> usize {
57 self.tower_level
58 }
59}