use core::marker::PhantomData;
use crate::{
fft::EvaluationDomain,
snark::varuna::{
ahp::verifier::{FirstMessage, FourthMessage, SecondMessage, ThirdMessage},
CircuitId,
SNARKMode,
},
};
use snarkvm_fields::PrimeField;
use std::collections::{BTreeMap, HashSet};
#[derive(Debug)]
pub struct CircuitSpecificState<F: PrimeField> {
pub(crate) input_domain: EvaluationDomain<F>,
pub(crate) variable_domain: EvaluationDomain<F>,
pub(crate) constraint_domain: EvaluationDomain<F>,
pub(crate) non_zero_a_domain: EvaluationDomain<F>,
pub(crate) non_zero_b_domain: EvaluationDomain<F>,
pub(crate) non_zero_c_domain: EvaluationDomain<F>,
pub(in crate::snark::varuna) batch_size: usize,
}
#[derive(Debug)]
pub struct State<F: PrimeField, SM: SNARKMode> {
pub(crate) circuit_specific_states: BTreeMap<CircuitId, CircuitSpecificState<F>>,
pub(crate) max_constraint_domain: EvaluationDomain<F>,
pub(crate) max_variable_domain: EvaluationDomain<F>,
pub(crate) max_non_zero_domain: EvaluationDomain<F>,
pub(crate) first_round_message: Option<FirstMessage<F>>,
pub(crate) second_round_message: Option<SecondMessage<F>>,
pub(crate) third_round_message: Option<ThirdMessage<F>>,
pub(crate) fourth_round_message: Option<FourthMessage<F>>,
pub(crate) gamma: Option<F>,
pub(crate) mode: PhantomData<SM>,
}
impl<F: PrimeField, MM: SNARKMode> State<F, MM> {
pub(crate) fn constraint_domains(&self) -> HashSet<EvaluationDomain<F>> {
self.circuit_specific_states.values().map(|s| s.constraint_domain).collect()
}
pub(crate) fn variable_domains(&self) -> HashSet<EvaluationDomain<F>> {
self.circuit_specific_states.values().map(|s| s.variable_domain).collect()
}
pub(crate) fn non_zero_domains(&self) -> HashSet<EvaluationDomain<F>> {
self.circuit_specific_states
.values()
.flat_map(|s| [s.non_zero_a_domain, s.non_zero_b_domain, s.non_zero_c_domain])
.collect()
}
}