kimchi/circuits/
domains.rs1use alloc::string::ToString;
4
5use ark_ff::FftField;
6use ark_poly::{EvaluationDomain, Radix2EvaluationDomain};
7use serde::{Deserialize, Serialize};
8use serde_with::serde_as;
9
10use crate::error::DomainCreationError;
11
12#[derive(Clone, Copy, Debug, PartialEq)]
15pub enum Domain {
16 D1 = 1,
17 D2 = 2,
18 D4 = 4,
19 D8 = 8,
20}
21
22#[serde_as]
23#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
24pub struct EvaluationDomains<F: FftField> {
25 #[serde_as(as = "o1_utils::serialization::SerdeAs")]
26 pub d1: Radix2EvaluationDomain<F>, #[serde_as(as = "o1_utils::serialization::SerdeAs")]
28 pub d2: Radix2EvaluationDomain<F>, #[serde_as(as = "o1_utils::serialization::SerdeAs")]
30 pub d4: Radix2EvaluationDomain<F>, #[serde_as(as = "o1_utils::serialization::SerdeAs")]
32 pub d8: Radix2EvaluationDomain<F>, }
34
35impl<F: FftField> EvaluationDomains<F> {
36 pub fn create(n: usize) -> Result<Self, DomainCreationError> {
41 let n = Radix2EvaluationDomain::<F>::compute_size_of_domain(n)
42 .ok_or(DomainCreationError::DomainSizeFailed(n))?;
43
44 let d1 = Radix2EvaluationDomain::<F>::new(n).ok_or(
45 DomainCreationError::DomainConstructionFailed("d1".to_string(), n),
46 )?;
47
48 let d2 = Radix2EvaluationDomain::<F>::new(2 * n).ok_or(
53 DomainCreationError::DomainConstructionFailed("d2".to_string(), 2 * n),
54 )?;
55 let d4 = Radix2EvaluationDomain::<F>::new(4 * n).ok_or(
56 DomainCreationError::DomainConstructionFailed("d4".to_string(), 4 * n),
57 )?;
58 let d8 = Radix2EvaluationDomain::<F>::new(8 * n).ok_or(
59 DomainCreationError::DomainConstructionFailed("d8".to_string(), 8 * n),
60 )?;
61
62 assert_eq!(d2.group_gen.square(), d1.group_gen);
65 assert_eq!(d4.group_gen.square(), d2.group_gen);
66 assert_eq!(d8.group_gen.square(), d4.group_gen);
67
68 Ok(EvaluationDomains { d1, d2, d4, d8 })
69 }
70}