pub struct AuditSink { /* private fields */ }Expand description
A bounded append-only audit chain with a small deterministic model hash.
The default modulo-100 hash supports structural recomputation tests. It is not collision resistant and does not by itself establish durable custody or detect an attacker who can rewrite both records and chain values.
§Examples
use automation_structures::AuditSink;
let mut sink = AuditSink::new(2);
assert!(sink.try_record(4));
assert!(sink.validate());
assert_eq!(sink.records().count(), 1);Implementations§
Source§impl AuditSink
impl AuditSink
Sourcepub fn new(capacity: usize) -> Self
pub fn new(capacity: usize) -> Self
Construct an empty sink with a fixed record capacity.
Examples found in repository?
examples/catalog.rs (line 65)
21fn main() -> Result<(), Box<dyn Error>> {
22 // Primitives.
23 let mut budget = Budget::new(8);
24 assert!(budget.try_reserve(3));
25 budget.commit_reservation(3)?;
26
27 let mut hierarchy = QualityHierarchy::new(2, 2);
28 hierarchy.set_node_properties(0, 2, 1)?;
29 hierarchy.set_node_properties(1, 1, 2)?;
30 hierarchy.add_child(0, 1)?;
31
32 let mut registry = ResourceRegistry::new();
33 registry.insert(1, 10);
34 assert_eq!(registry.get(1), Some(10));
35
36 let mut hard = CompetitiveSelectionHard::new(2)?;
37 hard.update_score(0, 2)?;
38 hard.update_score(1, 1)?;
39 assert_eq!(hard.evaluate(), 0);
40
41 let mut exclusive = CompetitiveSelectionHardExclusive::new(1, 2, 2)?;
42 exclusive.update_score(0, 0, 2)?;
43 exclusive.update_score(0, 1, 1)?;
44 assert_eq!(exclusive.evaluate(0)?, 0);
45
46 let mut soft = CompetitiveSelectionSoft::begin(vec![3, 1], 4, 3)?;
47 assert_eq!(soft.assign_next()?, 0);
48
49 let mut ranked = CompetitiveSelectionRanked::new(vec![2, 1], 1, 2)?;
50 ranked.select();
51 assert_eq!(ranked.is_selected(0), Some(true));
52
53 let mut actuation = ActuationPass::new(vec![Some(7)]);
54 actuation.actuate(0)?;
55 actuation.finish()?;
56
57 let mut propagation = PropagationPass::new(1, 2, vec![], vec![0])?;
58 propagation.start_round()?;
59 propagation.update_node(0)?;
60 propagation.end_round()?;
61
62 let mut convergence = ConvergenceGovernor::new(2, 6, 2, 10)?;
63 assert_eq!(convergence.update(1)?, 1);
64
65 let mut audit = AuditSink::new(1);
66 assert!(audit.try_record(7));
67 assert!(audit.validate());
68
69 let mut backtracking = BacktrackingTraversal::new(2, 1, 0)?;
70 backtracking.descend(1, 1)?;
71 backtracking.visit()?;
72
73 // Named compositions.
74 let mut snapshot = AllocationSnapshot::new(3, 1);
75 snapshot.accept(0, 3)?;
76
77 let mut federated = FederatedBudget::new(4, 1);
78 assert!(federated.try_delegate(0, 4));
79 assert!(federated.try_allocate(0, 2));
80
81 let mut bisection = Bisection::new(4, 2)?;
82 bisection.converge();
83 assert!(bisection.is_converged());
84
85 let mut classes = EquivalenceClass::new(2, 1);
86 assert!(classes.union(0, 1)?);
87
88 let mut rate_limit = RateLimit::new(1, 1, 1)?;
89 assert!(rate_limit.try_acquire());
90
91 let mut reduction = Reduction::new(vec![2, 3])?;
92 reduction.process_next()?;
93
94 let mut graph = RelationshipGraph::new(2, 1);
95 assert!(graph.add_edge(0, 1, 1)?);
96
97 let mut sampler = Sampler::new(vec![1, 1], 1);
98 sampler.sample(0)?;
99
100 let mut select_then_actuate = SelectThenActuate::new(1, 2)?;
101 select_then_actuate.update_score(0, 0, 1)?;
102 assert_eq!(select_then_actuate.evaluate(0)?, 0);
103 select_then_actuate.actuate(0)?;
104 select_then_actuate.finish()?;
105
106 let mut signal = Signal::new(0, 2, 1)?;
107 assert!(signal.set_value(1)?);
108 signal.notify(0)?;
109
110 let mut traversal = TraversalEngine::new(1, 0, 2)?;
111 traversal.visit(0)?;
112 assert_eq!(traversal.accepted_cost(), 2);
113 traversal.terminate()?;
114
115 // Execution modalities.
116 let mut sequential = Sequential::new(1, 2, 0)?;
117 assert!(sequential.begin_step());
118 assert!(sequential.complete_step(1));
119
120 let mut fork_join = ForkJoin::new(1, 2, 0)?;
121 assert!(fork_join.start_worker(0));
122 assert!(fork_join.complete_worker(0, 1));
123 assert!(fork_join.barrier());
124 assert!(fork_join.produce_output());
125
126 let mut step_graph = StepGraph::new(1, vec![])?;
127 assert!(step_graph.start(0));
128 assert!(step_graph.complete(0));
129
130 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
131 assert!(stream_graph.ingest(1));
132 assert!(stream_graph.advance_first());
133 assert_eq!(stream_graph.consume(), Some(1));
134
135 // Connective roles.
136 let mut cursor = Cursor::new(0);
137 cursor.advance_to(1)?;
138
139 let mut accumulator = Accumulator::new(vec![1]);
140 assert_eq!(accumulator.advance(), Some(1));
141 assert_eq!(accumulator.accumulated(0), Some(1));
142
143 let mut marker = Marker::new(false);
144 assert!(marker.set());
145
146 let mut counter = Counter::new(0);
147 assert!(counter.try_increment());
148
149 let mut buffer = Buffer::new(1);
150 assert_eq!(buffer.push(1), Ok(()));
151 assert_eq!(buffer.pop(), Some(1));
152
153 assert!(projection_consistent(true, true));
154 assert!(strictly_before(0, 1));
155
156 assert_debuggable!(
157 budget,
158 hierarchy,
159 registry,
160 hard,
161 exclusive,
162 soft,
163 ranked,
164 actuation,
165 propagation,
166 convergence,
167 audit,
168 backtracking,
169 snapshot,
170 federated,
171 bisection,
172 classes,
173 rate_limit,
174 reduction,
175 graph,
176 sampler,
177 select_then_actuate,
178 signal,
179 traversal,
180 sequential,
181 fork_join,
182 step_graph,
183 stream_graph,
184 cursor,
185 accumulator,
186 marker,
187 counter,
188 buffer,
189 );
190
191 println!("all public automation structures constructed and exercised");
192 Ok(())
193}Sourcepub fn try_record(&mut self, operation: u64) -> bool
pub fn try_record(&mut self, operation: u64) -> bool
Append an operation if capacity remains.
Examples found in repository?
examples/catalog.rs (line 66)
21fn main() -> Result<(), Box<dyn Error>> {
22 // Primitives.
23 let mut budget = Budget::new(8);
24 assert!(budget.try_reserve(3));
25 budget.commit_reservation(3)?;
26
27 let mut hierarchy = QualityHierarchy::new(2, 2);
28 hierarchy.set_node_properties(0, 2, 1)?;
29 hierarchy.set_node_properties(1, 1, 2)?;
30 hierarchy.add_child(0, 1)?;
31
32 let mut registry = ResourceRegistry::new();
33 registry.insert(1, 10);
34 assert_eq!(registry.get(1), Some(10));
35
36 let mut hard = CompetitiveSelectionHard::new(2)?;
37 hard.update_score(0, 2)?;
38 hard.update_score(1, 1)?;
39 assert_eq!(hard.evaluate(), 0);
40
41 let mut exclusive = CompetitiveSelectionHardExclusive::new(1, 2, 2)?;
42 exclusive.update_score(0, 0, 2)?;
43 exclusive.update_score(0, 1, 1)?;
44 assert_eq!(exclusive.evaluate(0)?, 0);
45
46 let mut soft = CompetitiveSelectionSoft::begin(vec![3, 1], 4, 3)?;
47 assert_eq!(soft.assign_next()?, 0);
48
49 let mut ranked = CompetitiveSelectionRanked::new(vec![2, 1], 1, 2)?;
50 ranked.select();
51 assert_eq!(ranked.is_selected(0), Some(true));
52
53 let mut actuation = ActuationPass::new(vec![Some(7)]);
54 actuation.actuate(0)?;
55 actuation.finish()?;
56
57 let mut propagation = PropagationPass::new(1, 2, vec![], vec![0])?;
58 propagation.start_round()?;
59 propagation.update_node(0)?;
60 propagation.end_round()?;
61
62 let mut convergence = ConvergenceGovernor::new(2, 6, 2, 10)?;
63 assert_eq!(convergence.update(1)?, 1);
64
65 let mut audit = AuditSink::new(1);
66 assert!(audit.try_record(7));
67 assert!(audit.validate());
68
69 let mut backtracking = BacktrackingTraversal::new(2, 1, 0)?;
70 backtracking.descend(1, 1)?;
71 backtracking.visit()?;
72
73 // Named compositions.
74 let mut snapshot = AllocationSnapshot::new(3, 1);
75 snapshot.accept(0, 3)?;
76
77 let mut federated = FederatedBudget::new(4, 1);
78 assert!(federated.try_delegate(0, 4));
79 assert!(federated.try_allocate(0, 2));
80
81 let mut bisection = Bisection::new(4, 2)?;
82 bisection.converge();
83 assert!(bisection.is_converged());
84
85 let mut classes = EquivalenceClass::new(2, 1);
86 assert!(classes.union(0, 1)?);
87
88 let mut rate_limit = RateLimit::new(1, 1, 1)?;
89 assert!(rate_limit.try_acquire());
90
91 let mut reduction = Reduction::new(vec![2, 3])?;
92 reduction.process_next()?;
93
94 let mut graph = RelationshipGraph::new(2, 1);
95 assert!(graph.add_edge(0, 1, 1)?);
96
97 let mut sampler = Sampler::new(vec![1, 1], 1);
98 sampler.sample(0)?;
99
100 let mut select_then_actuate = SelectThenActuate::new(1, 2)?;
101 select_then_actuate.update_score(0, 0, 1)?;
102 assert_eq!(select_then_actuate.evaluate(0)?, 0);
103 select_then_actuate.actuate(0)?;
104 select_then_actuate.finish()?;
105
106 let mut signal = Signal::new(0, 2, 1)?;
107 assert!(signal.set_value(1)?);
108 signal.notify(0)?;
109
110 let mut traversal = TraversalEngine::new(1, 0, 2)?;
111 traversal.visit(0)?;
112 assert_eq!(traversal.accepted_cost(), 2);
113 traversal.terminate()?;
114
115 // Execution modalities.
116 let mut sequential = Sequential::new(1, 2, 0)?;
117 assert!(sequential.begin_step());
118 assert!(sequential.complete_step(1));
119
120 let mut fork_join = ForkJoin::new(1, 2, 0)?;
121 assert!(fork_join.start_worker(0));
122 assert!(fork_join.complete_worker(0, 1));
123 assert!(fork_join.barrier());
124 assert!(fork_join.produce_output());
125
126 let mut step_graph = StepGraph::new(1, vec![])?;
127 assert!(step_graph.start(0));
128 assert!(step_graph.complete(0));
129
130 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
131 assert!(stream_graph.ingest(1));
132 assert!(stream_graph.advance_first());
133 assert_eq!(stream_graph.consume(), Some(1));
134
135 // Connective roles.
136 let mut cursor = Cursor::new(0);
137 cursor.advance_to(1)?;
138
139 let mut accumulator = Accumulator::new(vec![1]);
140 assert_eq!(accumulator.advance(), Some(1));
141 assert_eq!(accumulator.accumulated(0), Some(1));
142
143 let mut marker = Marker::new(false);
144 assert!(marker.set());
145
146 let mut counter = Counter::new(0);
147 assert!(counter.try_increment());
148
149 let mut buffer = Buffer::new(1);
150 assert_eq!(buffer.push(1), Ok(()));
151 assert_eq!(buffer.pop(), Some(1));
152
153 assert!(projection_consistent(true, true));
154 assert!(strictly_before(0, 1));
155
156 assert_debuggable!(
157 budget,
158 hierarchy,
159 registry,
160 hard,
161 exclusive,
162 soft,
163 ranked,
164 actuation,
165 propagation,
166 convergence,
167 audit,
168 backtracking,
169 snapshot,
170 federated,
171 bisection,
172 classes,
173 rate_limit,
174 reduction,
175 graph,
176 sampler,
177 select_then_actuate,
178 signal,
179 traversal,
180 sequential,
181 fork_join,
182 step_graph,
183 stream_graph,
184 cursor,
185 accumulator,
186 marker,
187 counter,
188 buffer,
189 );
190
191 println!("all public automation structures constructed and exercised");
192 Ok(())
193}Sourcepub fn validate(&self) -> bool
pub fn validate(&self) -> bool
Recompute and validate the concrete structural chain.
A successful result establishes internal arithmetic consistency only. It is not evidence of cryptographic integrity, persistence, provenance, or external tamper detection.
Examples found in repository?
examples/catalog.rs (line 67)
21fn main() -> Result<(), Box<dyn Error>> {
22 // Primitives.
23 let mut budget = Budget::new(8);
24 assert!(budget.try_reserve(3));
25 budget.commit_reservation(3)?;
26
27 let mut hierarchy = QualityHierarchy::new(2, 2);
28 hierarchy.set_node_properties(0, 2, 1)?;
29 hierarchy.set_node_properties(1, 1, 2)?;
30 hierarchy.add_child(0, 1)?;
31
32 let mut registry = ResourceRegistry::new();
33 registry.insert(1, 10);
34 assert_eq!(registry.get(1), Some(10));
35
36 let mut hard = CompetitiveSelectionHard::new(2)?;
37 hard.update_score(0, 2)?;
38 hard.update_score(1, 1)?;
39 assert_eq!(hard.evaluate(), 0);
40
41 let mut exclusive = CompetitiveSelectionHardExclusive::new(1, 2, 2)?;
42 exclusive.update_score(0, 0, 2)?;
43 exclusive.update_score(0, 1, 1)?;
44 assert_eq!(exclusive.evaluate(0)?, 0);
45
46 let mut soft = CompetitiveSelectionSoft::begin(vec![3, 1], 4, 3)?;
47 assert_eq!(soft.assign_next()?, 0);
48
49 let mut ranked = CompetitiveSelectionRanked::new(vec![2, 1], 1, 2)?;
50 ranked.select();
51 assert_eq!(ranked.is_selected(0), Some(true));
52
53 let mut actuation = ActuationPass::new(vec![Some(7)]);
54 actuation.actuate(0)?;
55 actuation.finish()?;
56
57 let mut propagation = PropagationPass::new(1, 2, vec![], vec![0])?;
58 propagation.start_round()?;
59 propagation.update_node(0)?;
60 propagation.end_round()?;
61
62 let mut convergence = ConvergenceGovernor::new(2, 6, 2, 10)?;
63 assert_eq!(convergence.update(1)?, 1);
64
65 let mut audit = AuditSink::new(1);
66 assert!(audit.try_record(7));
67 assert!(audit.validate());
68
69 let mut backtracking = BacktrackingTraversal::new(2, 1, 0)?;
70 backtracking.descend(1, 1)?;
71 backtracking.visit()?;
72
73 // Named compositions.
74 let mut snapshot = AllocationSnapshot::new(3, 1);
75 snapshot.accept(0, 3)?;
76
77 let mut federated = FederatedBudget::new(4, 1);
78 assert!(federated.try_delegate(0, 4));
79 assert!(federated.try_allocate(0, 2));
80
81 let mut bisection = Bisection::new(4, 2)?;
82 bisection.converge();
83 assert!(bisection.is_converged());
84
85 let mut classes = EquivalenceClass::new(2, 1);
86 assert!(classes.union(0, 1)?);
87
88 let mut rate_limit = RateLimit::new(1, 1, 1)?;
89 assert!(rate_limit.try_acquire());
90
91 let mut reduction = Reduction::new(vec![2, 3])?;
92 reduction.process_next()?;
93
94 let mut graph = RelationshipGraph::new(2, 1);
95 assert!(graph.add_edge(0, 1, 1)?);
96
97 let mut sampler = Sampler::new(vec![1, 1], 1);
98 sampler.sample(0)?;
99
100 let mut select_then_actuate = SelectThenActuate::new(1, 2)?;
101 select_then_actuate.update_score(0, 0, 1)?;
102 assert_eq!(select_then_actuate.evaluate(0)?, 0);
103 select_then_actuate.actuate(0)?;
104 select_then_actuate.finish()?;
105
106 let mut signal = Signal::new(0, 2, 1)?;
107 assert!(signal.set_value(1)?);
108 signal.notify(0)?;
109
110 let mut traversal = TraversalEngine::new(1, 0, 2)?;
111 traversal.visit(0)?;
112 assert_eq!(traversal.accepted_cost(), 2);
113 traversal.terminate()?;
114
115 // Execution modalities.
116 let mut sequential = Sequential::new(1, 2, 0)?;
117 assert!(sequential.begin_step());
118 assert!(sequential.complete_step(1));
119
120 let mut fork_join = ForkJoin::new(1, 2, 0)?;
121 assert!(fork_join.start_worker(0));
122 assert!(fork_join.complete_worker(0, 1));
123 assert!(fork_join.barrier());
124 assert!(fork_join.produce_output());
125
126 let mut step_graph = StepGraph::new(1, vec![])?;
127 assert!(step_graph.start(0));
128 assert!(step_graph.complete(0));
129
130 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
131 assert!(stream_graph.ingest(1));
132 assert!(stream_graph.advance_first());
133 assert_eq!(stream_graph.consume(), Some(1));
134
135 // Connective roles.
136 let mut cursor = Cursor::new(0);
137 cursor.advance_to(1)?;
138
139 let mut accumulator = Accumulator::new(vec![1]);
140 assert_eq!(accumulator.advance(), Some(1));
141 assert_eq!(accumulator.accumulated(0), Some(1));
142
143 let mut marker = Marker::new(false);
144 assert!(marker.set());
145
146 let mut counter = Counter::new(0);
147 assert!(counter.try_increment());
148
149 let mut buffer = Buffer::new(1);
150 assert_eq!(buffer.push(1), Ok(()));
151 assert_eq!(buffer.pop(), Some(1));
152
153 assert!(projection_consistent(true, true));
154 assert!(strictly_before(0, 1));
155
156 assert_debuggable!(
157 budget,
158 hierarchy,
159 registry,
160 hard,
161 exclusive,
162 soft,
163 ranked,
164 actuation,
165 propagation,
166 convergence,
167 audit,
168 backtracking,
169 snapshot,
170 federated,
171 bisection,
172 classes,
173 rate_limit,
174 reduction,
175 graph,
176 sampler,
177 select_then_actuate,
178 signal,
179 traversal,
180 sequential,
181 fork_join,
182 step_graph,
183 stream_graph,
184 cursor,
185 accumulator,
186 marker,
187 counter,
188 buffer,
189 );
190
191 println!("all public automation structures constructed and exercised");
192 Ok(())
193}Sourcepub fn record(&self, index: usize) -> Option<AuditRecord>
pub fn record(&self, index: usize) -> Option<AuditRecord>
Read an immutable record by index.
Source§impl AuditSink
impl AuditSink
Sourcepub fn records(&self) -> impl ExactSizeIterator<Item = AuditRecord> + '_
pub fn records(&self) -> impl ExactSizeIterator<Item = AuditRecord> + '_
Iterate over immutable records in chain order.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for AuditSink
impl RefUnwindSafe for AuditSink
impl Send for AuditSink
impl Sync for AuditSink
impl Unpin for AuditSink
impl UnsafeUnpin for AuditSink
impl UnwindSafe for AuditSink
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more