use std::fmt;
use crate::{Error, Result};
use super::specification::CoverageSpecification;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct CoverageAction {
pub vertex: usize,
pub cost: u64,
pub(crate) states: Vec<usize>,
}
impl CoverageAction {
pub fn new(vertex: usize, cost: u64, mut states: Vec<usize>) -> Self {
states.sort_unstable();
states.dedup();
Self {
vertex,
cost,
states,
}
}
pub fn states(&self) -> &[usize] {
&self.states
}
pub fn throughout(vertex: usize, cost: u64, specification: &CoverageSpecification) -> Self {
Self::new(vertex, cost, (0..specification.states.len()).collect())
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct CoverageComponent {
pub(crate) states: Vec<usize>,
pub(crate) actions: Vec<usize>,
}
impl CoverageComponent {
pub fn states(&self) -> &[usize] {
&self.states
}
pub fn actions(&self) -> &[usize] {
&self.actions
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CoverageCounterexample {
pub state: usize,
pub failed_vertices: Vec<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CoveragePlanEvaluation {
pub criterion_holds: bool,
pub checks: usize,
pub minimum_witness_triangles: Option<usize>,
pub counterexample: Option<CoverageCounterexample>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CoverageSynthesisStatus {
Optimal,
Infeasible,
SearchIncomplete,
}
impl CoverageSynthesisStatus {
pub(crate) fn code(self) -> u8 {
match self {
Self::Optimal => 1,
Self::Infeasible => 2,
Self::SearchIncomplete => 3,
}
}
pub(crate) fn from_code(code: u8) -> Result<Self> {
match code {
1 => Ok(Self::Optimal),
2 => Ok(Self::Infeasible),
3 => Ok(Self::SearchIncomplete),
_ => Err(Error::InvalidInput(
"coverage synthesis status is invalid".into(),
)),
}
}
}
impl fmt::Display for CoverageSynthesisStatus {
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(crate) struct EvaluationClaim {
pub(crate) criterion_holds: bool,
pub(crate) checks: usize,
pub(crate) minimum_witness_triangles: Option<usize>,
}
impl From<&CoveragePlanEvaluation> for EvaluationClaim {
fn from(evaluation: &CoveragePlanEvaluation) -> Self {
Self {
criterion_holds: evaluation.criterion_holds,
checks: evaluation.checks,
minimum_witness_triangles: evaluation.minimum_witness_triangles,
}
}
}