holos_tda/
coverage_frontier.rs1use std::fmt;
8
9use crate::CoverageComponent;
10
11mod compose;
12
13#[cfg(test)]
14mod tests;
15
16pub use compose::compose_coverage_frontiers;
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20pub enum CoverageCompositionStatus {
21 Optimal,
23 Infeasible,
25 SearchIncomplete,
27}
28
29impl fmt::Display for CoverageCompositionStatus {
30 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
31 formatter.write_str(match self {
32 Self::Optimal => "optimal",
33 Self::Infeasible => "infeasible",
34 Self::SearchIncomplete => "search incomplete",
35 })
36 }
37}
38
39#[derive(Debug, Clone, PartialEq, Eq)]
41pub struct CoverageFrontierEntry {
42 activations: usize,
43 cost: u64,
44 selected: Vec<usize>,
45}
46
47impl CoverageFrontierEntry {
48 pub fn activations(&self) -> usize {
50 self.activations
51 }
52
53 pub fn cost(&self) -> u64 {
55 self.cost
56 }
57
58 pub fn selected(&self) -> &[usize] {
60 &self.selected
61 }
62}
63
64#[derive(Debug, Clone, PartialEq, Eq)]
66pub struct CoverageComponentFrontier {
67 component: CoverageComponent,
68 entries: Vec<CoverageFrontierEntry>,
69}
70
71impl CoverageComponentFrontier {
72 pub fn component(&self) -> &CoverageComponent {
74 &self.component
75 }
76
77 pub fn entries(&self) -> &[CoverageFrontierEntry] {
79 &self.entries
80 }
81}
82
83#[derive(Debug, Clone, PartialEq, Eq)]
85pub struct CoverageComposition {
86 status: CoverageCompositionStatus,
87 frontiers: Vec<CoverageComponentFrontier>,
88 selected: Vec<usize>,
89 cost: Option<u64>,
90 oracle_calls: usize,
91 search_nodes: usize,
92 cache_hits: usize,
93}
94
95impl CoverageComposition {
96 pub fn status(&self) -> CoverageCompositionStatus {
98 self.status
99 }
100
101 pub fn frontiers(&self) -> &[CoverageComponentFrontier] {
103 &self.frontiers
104 }
105
106 pub fn selected(&self) -> &[usize] {
108 &self.selected
109 }
110
111 pub fn cost(&self) -> Option<u64> {
113 self.cost
114 }
115
116 pub fn oracle_calls(&self) -> usize {
118 self.oracle_calls
119 }
120
121 pub fn search_nodes(&self) -> usize {
123 self.search_nodes
124 }
125
126 pub fn cache_hits(&self) -> usize {
128 self.cache_hits
129 }
130}