Skip to main content

SelectThenActuate

Struct SelectThenActuate 

Source
pub struct SelectThenActuate { /* private fields */ }
Expand description

Hard selection per seat followed by the shared ActuationPass lifecycle.

§Examples

use automation_structures::SelectThenActuate;

let mut pass = SelectThenActuate::new(1, 2)?;
pass.update_score(0, 1, 9)?;
assert_eq!(pass.evaluate(0)?, 1);
pass.actuate(0)?;
pass.finish()?;
assert!(pass.is_complete());

Implementations§

Source§

impl SelectThenActuate

Source

pub fn new( num_seats: usize, num_candidates: usize, ) -> Result<Self, SelectThenActuateBuildError>

Construct empty seat allocations over a nonempty candidate universe.

§Errors

Returns an error when either configured dimension is zero.

Examples found in repository?
examples/catalog.rs (line 100)
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}
Source

pub fn seat_count(&self) -> usize

Number of independently selected seats.

Source

pub fn candidate_count(&self) -> usize

Number of candidates available to each seat.

Source

pub fn score(&self, seat: usize, candidate: usize) -> Option<u64>

Read one score when both indices are in range.

Source

pub fn allocation(&self, seat: usize) -> Option<usize>

Read one seat’s current selected candidate.

Source

pub fn is_actuated(&self, seat: usize) -> Option<bool>

Whether one in-range seat has applied its selected effect.

Source

pub fn is_complete(&self) -> bool

Whether the shared actuation pass is complete.

Source

pub fn update_score( &mut self, seat: usize, candidate: usize, value: u64, ) -> Result<(), SelectThenActuateError>

Revise one unapplied seat’s candidate score.

§Errors

Returns an error for an unknown seat or candidate, or after evaluation has begun.

Examples found in repository?
examples/catalog.rs (line 101)
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}
Source

pub fn evaluate(&mut self, seat: usize) -> Result<usize, SelectThenActuateError>

Select the highest-scoring candidate for one empty seat.

§Errors

Returns an error when the seat is unknown, already evaluated, or evaluation is disabled.

Examples found in repository?
examples/catalog.rs (line 102)
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}
Source

pub fn actuate(&mut self, seat: usize) -> Result<(), SelectThenActuateError>

Apply one seat’s selected candidate through ActuationPass.

§Errors

Returns an error when the seat is unknown, not evaluated, already actuated, or actuation is disabled.

Examples found in repository?
examples/catalog.rs (line 103)
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}
Source

pub fn finish(&mut self) -> Result<(), SelectThenActuateError>

Close the shared ActuationPass after every allocation is applied.

§Errors

Returns an error when the pass is already complete or not all seats were actuated.

Examples found in repository?
examples/catalog.rs (line 104)
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}
Source§

impl SelectThenActuate

Source

pub fn scores(&self, seat: usize) -> Option<&[u64]>

Borrow one seat’s candidate scores.

Source

pub fn allocations(&self) -> impl ExactSizeIterator<Item = Option<usize>> + '_

Iterate over current seat allocations.

Source

pub fn effects(&self) -> &[Option<u64>]

Borrow committed effects by seat.

Trait Implementations§

Source§

impl Debug for SelectThenActuate

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.