pub struct CompetitiveSelectionHardExclusive { /* private fields */ }Expand description
Lowest-index argmax selection across seats with exclusive candidates.
§Examples
use automation_structures::CompetitiveSelectionHardExclusive;
let mut selection = CompetitiveSelectionHardExclusive::new(2, 2, 10)?;
selection.update_score(0, 0, 10)?;
selection.update_score(1, 0, 9)?;
assert_eq!(selection.evaluate(0)?, 0);
assert_eq!(selection.candidate_available(1, 0), Some(false));Implementations§
Source§impl CompetitiveSelectionHardExclusive
impl CompetitiveSelectionHardExclusive
Sourcepub fn new(
num_seats: usize,
num_candidates: usize,
max_score: u64,
) -> Result<Self, CompetitiveSelectionError>
pub fn new( num_seats: usize, num_candidates: usize, max_score: u64, ) -> Result<Self, CompetitiveSelectionError>
Construct num_seats empty allocations over a nonempty candidate set.
§Errors
Returns CompetitiveSelectionError::NoCandidates for an empty candidate universe.
Examples found in repository?
examples/catalog.rs (line 41)
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, 1)?;
111 traversal.visit(0)?;
112 traversal.terminate()?;
113
114 // Execution modalities.
115 let mut sequential = Sequential::new(1, 2, 0)?;
116 assert!(sequential.begin_step());
117 assert!(sequential.complete_step(1));
118
119 let mut fork_join = ForkJoin::new(1, 2, 0)?;
120 assert!(fork_join.start_worker(0));
121 assert!(fork_join.complete_worker(0, 1));
122 assert!(fork_join.barrier());
123 assert!(fork_join.produce_output());
124
125 let mut step_graph = StepGraph::new(1, vec![])?;
126 assert!(step_graph.start(0));
127 assert!(step_graph.complete(0));
128
129 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
130 assert!(stream_graph.ingest(1));
131 assert!(stream_graph.advance_first());
132 assert_eq!(stream_graph.consume(), Some(1));
133
134 // Connective roles.
135 let mut cursor = Cursor::new(0);
136 cursor.advance_to(1)?;
137
138 let mut accumulator = Accumulator::new(vec![1]);
139 assert_eq!(accumulator.advance(), Some(1));
140 assert_eq!(accumulator.accumulated(0), Some(1));
141
142 let mut marker = Marker::new(false);
143 assert!(marker.set());
144
145 let mut counter = Counter::new(0);
146 assert!(counter.try_increment());
147
148 let mut buffer = Buffer::new(1);
149 assert_eq!(buffer.push(1), Ok(()));
150 assert_eq!(buffer.pop(), Some(1));
151
152 assert!(projection_consistent(true, true));
153 assert!(strictly_before(0, 1));
154
155 assert_debuggable!(
156 budget,
157 hierarchy,
158 registry,
159 hard,
160 exclusive,
161 soft,
162 ranked,
163 actuation,
164 propagation,
165 convergence,
166 audit,
167 backtracking,
168 snapshot,
169 federated,
170 bisection,
171 classes,
172 rate_limit,
173 reduction,
174 graph,
175 sampler,
176 select_then_actuate,
177 signal,
178 traversal,
179 sequential,
180 fork_join,
181 step_graph,
182 stream_graph,
183 cursor,
184 accumulator,
185 marker,
186 counter,
187 buffer,
188 );
189
190 println!("all public automation structures constructed and exercised");
191 Ok(())
192}Sourcepub fn seat_count(&self) -> usize
pub fn seat_count(&self) -> usize
Number of allocation seats.
Sourcepub fn candidate_count(&self) -> usize
pub fn candidate_count(&self) -> usize
Number of candidates.
Sourcepub fn allocation(&self, seat: usize) -> Option<usize>
pub fn allocation(&self, seat: usize) -> Option<usize>
Read one seat allocation, or None when the seat is invalid or unallocated.
Sourcepub fn score(&self, seat: usize, candidate: usize) -> Option<u64>
pub fn score(&self, seat: usize, candidate: usize) -> Option<u64>
Read one seat-candidate score.
Sourcepub fn candidate_available(&self, seat: usize, candidate: usize) -> Option<bool>
pub fn candidate_available(&self, seat: usize, candidate: usize) -> Option<bool>
Whether a candidate is free for one seat.
Sourcepub fn update_score(
&mut self,
seat: usize,
candidate: usize,
score: u64,
) -> Result<(), CompetitiveSelectionError>
pub fn update_score( &mut self, seat: usize, candidate: usize, score: u64, ) -> Result<(), CompetitiveSelectionError>
Replace one score and invalidate every coupled seat allocation.
§Errors
Returns CompetitiveSelectionError for an invalid seat, candidate, or score.
Examples found in repository?
examples/catalog.rs (line 42)
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, 1)?;
111 traversal.visit(0)?;
112 traversal.terminate()?;
113
114 // Execution modalities.
115 let mut sequential = Sequential::new(1, 2, 0)?;
116 assert!(sequential.begin_step());
117 assert!(sequential.complete_step(1));
118
119 let mut fork_join = ForkJoin::new(1, 2, 0)?;
120 assert!(fork_join.start_worker(0));
121 assert!(fork_join.complete_worker(0, 1));
122 assert!(fork_join.barrier());
123 assert!(fork_join.produce_output());
124
125 let mut step_graph = StepGraph::new(1, vec![])?;
126 assert!(step_graph.start(0));
127 assert!(step_graph.complete(0));
128
129 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
130 assert!(stream_graph.ingest(1));
131 assert!(stream_graph.advance_first());
132 assert_eq!(stream_graph.consume(), Some(1));
133
134 // Connective roles.
135 let mut cursor = Cursor::new(0);
136 cursor.advance_to(1)?;
137
138 let mut accumulator = Accumulator::new(vec![1]);
139 assert_eq!(accumulator.advance(), Some(1));
140 assert_eq!(accumulator.accumulated(0), Some(1));
141
142 let mut marker = Marker::new(false);
143 assert!(marker.set());
144
145 let mut counter = Counter::new(0);
146 assert!(counter.try_increment());
147
148 let mut buffer = Buffer::new(1);
149 assert_eq!(buffer.push(1), Ok(()));
150 assert_eq!(buffer.pop(), Some(1));
151
152 assert!(projection_consistent(true, true));
153 assert!(strictly_before(0, 1));
154
155 assert_debuggable!(
156 budget,
157 hierarchy,
158 registry,
159 hard,
160 exclusive,
161 soft,
162 ranked,
163 actuation,
164 propagation,
165 convergence,
166 audit,
167 backtracking,
168 snapshot,
169 federated,
170 bisection,
171 classes,
172 rate_limit,
173 reduction,
174 graph,
175 sampler,
176 select_then_actuate,
177 signal,
178 traversal,
179 sequential,
180 fork_join,
181 step_graph,
182 stream_graph,
183 cursor,
184 accumulator,
185 marker,
186 counter,
187 buffer,
188 );
189
190 println!("all public automation structures constructed and exercised");
191 Ok(())
192}Sourcepub fn evaluate(
&mut self,
seat: usize,
) -> Result<usize, CompetitiveSelectionError>
pub fn evaluate( &mut self, seat: usize, ) -> Result<usize, CompetitiveSelectionError>
Select the lowest-index available argmax for one empty seat.
§Errors
Returns CompetitiveSelectionError when the seat is invalid, allocated, or has no candidate.
Examples found in repository?
examples/catalog.rs (line 44)
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, 1)?;
111 traversal.visit(0)?;
112 traversal.terminate()?;
113
114 // Execution modalities.
115 let mut sequential = Sequential::new(1, 2, 0)?;
116 assert!(sequential.begin_step());
117 assert!(sequential.complete_step(1));
118
119 let mut fork_join = ForkJoin::new(1, 2, 0)?;
120 assert!(fork_join.start_worker(0));
121 assert!(fork_join.complete_worker(0, 1));
122 assert!(fork_join.barrier());
123 assert!(fork_join.produce_output());
124
125 let mut step_graph = StepGraph::new(1, vec![])?;
126 assert!(step_graph.start(0));
127 assert!(step_graph.complete(0));
128
129 let mut stream_graph = StreamGraph::new(3, 1, 1, 2)?;
130 assert!(stream_graph.ingest(1));
131 assert!(stream_graph.advance_first());
132 assert_eq!(stream_graph.consume(), Some(1));
133
134 // Connective roles.
135 let mut cursor = Cursor::new(0);
136 cursor.advance_to(1)?;
137
138 let mut accumulator = Accumulator::new(vec![1]);
139 assert_eq!(accumulator.advance(), Some(1));
140 assert_eq!(accumulator.accumulated(0), Some(1));
141
142 let mut marker = Marker::new(false);
143 assert!(marker.set());
144
145 let mut counter = Counter::new(0);
146 assert!(counter.try_increment());
147
148 let mut buffer = Buffer::new(1);
149 assert_eq!(buffer.push(1), Ok(()));
150 assert_eq!(buffer.pop(), Some(1));
151
152 assert!(projection_consistent(true, true));
153 assert!(strictly_before(0, 1));
154
155 assert_debuggable!(
156 budget,
157 hierarchy,
158 registry,
159 hard,
160 exclusive,
161 soft,
162 ranked,
163 actuation,
164 propagation,
165 convergence,
166 audit,
167 backtracking,
168 snapshot,
169 federated,
170 bisection,
171 classes,
172 rate_limit,
173 reduction,
174 graph,
175 sampler,
176 select_then_actuate,
177 signal,
178 traversal,
179 sequential,
180 fork_join,
181 step_graph,
182 stream_graph,
183 cursor,
184 accumulator,
185 marker,
186 counter,
187 buffer,
188 );
189
190 println!("all public automation structures constructed and exercised");
191 Ok(())
192}Trait Implementations§
Auto Trait Implementations§
impl Freeze for CompetitiveSelectionHardExclusive
impl RefUnwindSafe for CompetitiveSelectionHardExclusive
impl Send for CompetitiveSelectionHardExclusive
impl Sync for CompetitiveSelectionHardExclusive
impl Unpin for CompetitiveSelectionHardExclusive
impl UnsafeUnpin for CompetitiveSelectionHardExclusive
impl UnwindSafe for CompetitiveSelectionHardExclusive
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