use std::fmt;
use crate::{CohomologyLimits, Error, KineticEdge, KineticLimits, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct SynthesisLimits {
pub max_bytes: usize,
pub max_vertices: usize,
pub max_edges_per_state: usize,
pub max_states: usize,
pub max_actions: usize,
pub max_terms: usize,
pub max_oracle_calls: usize,
pub max_search_nodes: usize,
pub max_proof_nodes: usize,
pub max_proof_depth: usize,
pub cohomology: CohomologyLimits,
pub kinetic: KineticLimits,
}
impl Default for SynthesisLimits {
fn default() -> Self {
Self {
max_bytes: 1 << 30,
max_vertices: 1_000_000,
max_edges_per_state: 20_000_000,
max_states: 1_024,
max_actions: 16_384,
max_terms: 10_000_000,
max_oracle_calls: 2_000_000,
max_search_nodes: 2_000_000,
max_proof_nodes: 2_000_000,
max_proof_depth: 1_024,
cohomology: CohomologyLimits::default(),
kinetic: KineticLimits::default(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum SynthesisSource {
Finite,
Affine {
scenario: u64,
edges: Vec<KineticEdge>,
start: f64,
end: f64,
maximum_rank: usize,
},
}
impl SynthesisLimits {
#[must_use]
pub fn with_max_oracle_calls(mut self, maximum: usize) -> Self {
self.max_oracle_calls = maximum;
self
}
#[must_use]
pub fn with_max_search_nodes(mut self, maximum: usize) -> Self {
self.max_search_nodes = maximum;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct SynthesisCoordinate {
pub basis: usize,
pub coefficient: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SynthesisStatus {
Optimal,
Infeasible,
SearchIncomplete,
}
impl SynthesisStatus {
pub(in crate::synthesis) fn code(self) -> u8 {
match self {
Self::Optimal => 1,
Self::Infeasible => 2,
Self::SearchIncomplete => 3,
}
}
pub(in crate::synthesis) fn from_code(code: u8) -> Result<Self> {
match code {
1 => Ok(Self::Optimal),
2 => Ok(Self::Infeasible),
3 => Ok(Self::SearchIncomplete),
_ => Err(Error::InvalidInput("synthesis status is invalid".into())),
}
}
}
impl fmt::Display for SynthesisStatus {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::Optimal => "optimal",
Self::Infeasible => "infeasible",
Self::SearchIncomplete => "search incomplete",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(in crate::synthesis) enum BoundKind {
Cost,
Edits,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(in crate::synthesis) enum ProofNode {
Cost,
SurvivingMaximum,
SurvivingEditLimit,
BlockerBound {
kind: BoundKind,
blockers: Vec<Vec<usize>>,
},
Branch {
blocker: Vec<usize>,
children: Vec<ProofNode>,
},
}