pub struct Literal { /* private fields */ }Implementations§
Source§impl Literal
impl Literal
pub fn get_integer_variable(&self) -> AffineView<DomainId>
Sourcepub fn get_true_predicate(&self) -> Predicate
pub fn get_true_predicate(&self) -> Predicate
Examples found in repository?
examples/disjunctive_scheduling.rs (line 82)
20fn main() {
21 let mut args = std::env::args();
22
23 let n_tasks = args
24 .nth(1)
25 .expect("Please provide a number of tasks")
26 .parse::<usize>()
27 .expect("Not a valid usized");
28 let processing_times = args
29 .take(n_tasks)
30 .map(|arg| arg.parse::<usize>())
31 .collect::<Result<Vec<_>, _>>()
32 .expect("The provided processing times are not valid unsigned integers");
33 assert_eq!(
34 processing_times.len(),
35 n_tasks,
36 "Provided fewer than `n_tasks` processing times."
37 );
38
39 let horizon = processing_times.iter().sum::<usize>();
40
41 let mut solver = Solver::default();
42
43 // Creates a dummy constraint tag; since this example does not support proof logging the
44 // constraint tag does not matter.
45 let constraint_tag = solver.new_constraint_tag();
46
47 let start_variables = (0..n_tasks)
48 .map(|i| solver.new_bounded_integer(0, (horizon - processing_times[i]) as i32))
49 .collect::<Vec<_>>();
50
51 // Literal which indicates precedence (i.e. precedence_literals[x][y] <=> x ends before y
52 // starts)
53 let precedence_literals = (0..n_tasks)
54 .map(|_| {
55 (0..n_tasks)
56 .map(|_| solver.new_literal())
57 .collect::<Vec<_>>()
58 })
59 .collect::<Vec<_>>();
60
61 for x in 0..n_tasks {
62 for y in 0..n_tasks {
63 if x == y {
64 continue;
65 }
66 // precedence_literals[x][y] <=> x ends before y starts
67 let literal = precedence_literals[x][y];
68 // literal <=> (s_x + p_x <= s_y)
69 // equivelent to literal <=> (s_x - s_y <= -p_x)
70 // So the variables are -s_y and s_x, and the rhs is -p_x
71 let variables = vec![start_variables[y].scaled(-1), start_variables[x].scaled(1)];
72 let _ = constraints::less_than_or_equals(
73 variables,
74 -(processing_times[x] as i32),
75 constraint_tag,
76 )
77 .reify(&mut solver, literal);
78
79 // Either x starts before y or y start before x
80 let _ = solver.add_clause(
81 [
82 literal.get_true_predicate(),
83 precedence_literals[y][x].get_true_predicate(),
84 ],
85 constraint_tag,
86 );
87 }
88 }
89
90 let mut brancher = solver.default_brancher();
91 if matches!(
92 solver.satisfy(&mut brancher, &mut Indefinite),
93 SatisfactionResult::Unsatisfiable(_),
94 ) {
95 panic!("Infeasibility Detected")
96 }
97 match solver.satisfy(&mut brancher, &mut Indefinite) {
98 SatisfactionResult::Satisfiable(satisfiable) => {
99 let solution = satisfiable.solution();
100
101 let mut start_variables_and_processing_times = start_variables
102 .iter()
103 .zip(processing_times)
104 .collect::<Vec<_>>();
105 start_variables_and_processing_times.sort_by(|(s1, _), (s2, _)| {
106 solution
107 .get_integer_value(**s1)
108 .cmp(&solution.get_integer_value(**s2))
109 });
110
111 println!(
112 "{}",
113 start_variables_and_processing_times
114 .iter()
115 .map(|(var, processing_time)| format!(
116 "[{}, {}]",
117 solution.get_integer_value(**var),
118 solution.get_integer_value(**var) + *processing_time as i32
119 ))
120 .collect::<Vec<_>>()
121 .join(" - ")
122 );
123 }
124 SatisfactionResult::Unsatisfiable(_) => panic!("Infeasibility Detected"),
125 SatisfactionResult::Unknown(_) => println!("Timeout."),
126 };
127}pub fn get_false_predicate(&self) -> Predicate
Trait Implementations§
Source§impl IntegerVariable for Literal
impl IntegerVariable for Literal
Source§fn lower_bound(&self, assignment: &Assignments) -> i32
fn lower_bound(&self, assignment: &Assignments) -> i32
Returns the lower bound represented as a 0-1 value. Literals that evaluate to true have a lower bound of 1. Literal that evaluate to false have a lower bound of 0. Unassigned literals have a lower bound of 0.
Source§fn upper_bound(&self, assignment: &Assignments) -> i32
fn upper_bound(&self, assignment: &Assignments) -> i32
Returns the upper bound represented as a 0-1 value. Literals that evaluate to true have an upper bound of 1. Literal that evaluate to false have a upper bound of 0. Unassigned literals have a upper bound of 1.
Source§fn contains(&self, assignment: &Assignments, value: i32) -> bool
fn contains(&self, assignment: &Assignments, value: i32) -> bool
Returns whether the input value, when interpreted as a bool, can be considered for the literal. Literals that evaluate to true only contain value 1. Literals that evaluate to false only contain value 0. Unassigned literals contain both values 0 and 1.
type AffineView = AffineView<Literal>
Source§fn lower_bound_at_trail_position(
&self,
assignment: &Assignments,
trail_position: usize,
) -> i32
fn lower_bound_at_trail_position( &self, assignment: &Assignments, trail_position: usize, ) -> i32
Get the lower bound of the variable at the given trail position.
Source§fn upper_bound_at_trail_position(
&self,
assignment: &Assignments,
trail_position: usize,
) -> i32
fn upper_bound_at_trail_position( &self, assignment: &Assignments, trail_position: usize, ) -> i32
Get the upper bound of the variable at the given trail position.
Source§fn contains_at_trail_position(
&self,
assignment: &Assignments,
value: i32,
trail_position: usize,
) -> bool
fn contains_at_trail_position( &self, assignment: &Assignments, value: i32, trail_position: usize, ) -> bool
Determine whether the value is in the domain of this variable at the given trail position.
Source§fn iterate_domain(&self, assignment: &Assignments) -> impl Iterator<Item = i32>
fn iterate_domain(&self, assignment: &Assignments) -> impl Iterator<Item = i32>
Iterate over the values of the domain.
Source§fn watch_all(&self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>)
fn watch_all(&self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>)
Register a watch for this variable on the given domain events.
Source§fn unpack_event(&self, event: OpaqueDomainEvent) -> DomainEvent
fn unpack_event(&self, event: OpaqueDomainEvent) -> DomainEvent
Decode a domain event for this variable.
fn watch_all_backtrack( &self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>, )
Source§fn get_holes_on_current_decision_level(
&self,
assignments: &Assignments,
) -> impl Iterator<Item = i32>
fn get_holes_on_current_decision_level( &self, assignments: &Assignments, ) -> impl Iterator<Item = i32>
Returns all of the holes in the domain which were created at the current decision level
Source§impl PredicateConstructor for Literal
impl PredicateConstructor for Literal
Source§fn lower_bound_predicate(
&self,
bound: <Literal as PredicateConstructor>::Value,
) -> Predicate
fn lower_bound_predicate( &self, bound: <Literal as PredicateConstructor>::Value, ) -> Predicate
Creates a lower-bound predicate (e.g.
[x >= v]).Source§fn upper_bound_predicate(
&self,
bound: <Literal as PredicateConstructor>::Value,
) -> Predicate
fn upper_bound_predicate( &self, bound: <Literal as PredicateConstructor>::Value, ) -> Predicate
Creates an upper-bound predicate (e.g.
[x <= v]).Source§fn equality_predicate(
&self,
bound: <Literal as PredicateConstructor>::Value,
) -> Predicate
fn equality_predicate( &self, bound: <Literal as PredicateConstructor>::Value, ) -> Predicate
Creates an equality predicate (e.g.
[x == v]).Source§fn disequality_predicate(
&self,
bound: <Literal as PredicateConstructor>::Value,
) -> Predicate
fn disequality_predicate( &self, bound: <Literal as PredicateConstructor>::Value, ) -> Predicate
Creates a disequality predicate (e.g.
[x != v]).Source§impl TransformableVariable<AffineView<Literal>> for Literal
impl TransformableVariable<AffineView<Literal>> for Literal
Source§impl ValueSelector<Literal> for InDomainRandom
impl ValueSelector<Literal> for InDomainRandom
Source§fn select_value(
&mut self,
context: &mut SelectionContext<'_>,
decision_variable: Literal,
) -> Predicate
fn select_value( &mut self, context: &mut SelectionContext<'_>, decision_variable: Literal, ) -> Predicate
Determines which value in the domain of
decision_variable to branch next on.
The domain of the decision_variable variable should have at least 2 values in it (as it
otherwise should not have been selected as decision_variable). Returns a
Predicate specifying the required change in the domain.Source§fn is_restart_pointless(&mut self) -> bool
fn is_restart_pointless(&mut self) -> bool
This method returns whether a restart is currently pointless for the
ValueSelector. Read moreSource§fn subscribe_to_events(&self) -> Vec<BrancherEvent>
fn subscribe_to_events(&self) -> Vec<BrancherEvent>
Source§fn on_unassign_integer(&mut self, _variable: DomainId, _value: i32)
fn on_unassign_integer(&mut self, _variable: DomainId, _value: i32)
A function which is called after a
DomainId is unassigned during backtracking (i.e. when
it was fixed but is no longer), specifically, it provides variable which is the
DomainId which has been reset and value which is the value to which the variable was
previously fixed. This method could thus be called multiple times in a single
backtracking operation by the solver. Read moreSource§fn on_solution(&mut self, _solution: SolutionReference<'_>)
fn on_solution(&mut self, _solution: SolutionReference<'_>)
This method is called when a solution is found; either when iterating over all solutions in
the case of a satisfiable problem or on solutions of increasing quality when solving an
optimisation problem. Read more
Source§impl VariableSelector<Literal> for InputOrder<Literal>
impl VariableSelector<Literal> for InputOrder<Literal>
Source§fn select_variable(
&mut self,
context: &mut SelectionContext<'_>,
) -> Option<Literal>
fn select_variable( &mut self, context: &mut SelectionContext<'_>, ) -> Option<Literal>
Determines which variable to select next if there are any left to branch on.
Should only return
None when all variables which have been passed to the
VariableSelector have been assigned. Otherwise it should return the variable to
branch on next.Source§fn subscribe_to_events(&self) -> Vec<BrancherEvent>
fn subscribe_to_events(&self) -> Vec<BrancherEvent>
Source§fn on_conflict(&mut self)
fn on_conflict(&mut self)
A function which is called after a conflict has been found and processed but (currently)
does not provide any additional information. Read more
Source§fn on_backtrack(&mut self)
fn on_backtrack(&mut self)
A function which is called whenever a backtrack occurs in the solver. Read more
Source§fn on_unassign_integer(&mut self, _variable: DomainId, _value: i32)
fn on_unassign_integer(&mut self, _variable: DomainId, _value: i32)
A function which is called after a
DomainId is unassigned during backtracking (i.e. when
it was fixed but is no longer), specifically, it provides variable which is the
DomainId which has been reset. This method could thus be called multiple times in a
single backtracking operation by the solver. Read moreSource§fn on_appearance_in_conflict_predicate(&mut self, _predicate: Predicate)
fn on_appearance_in_conflict_predicate(&mut self, _predicate: Predicate)
Source§fn is_restart_pointless(&mut self) -> bool
fn is_restart_pointless(&mut self) -> bool
This method returns whether a restart is currently pointless for the
VariableSelector. Read moreimpl Copy for Literal
impl Eq for Literal
impl StructuralPartialEq for Literal
Auto Trait Implementations§
impl Freeze for Literal
impl RefUnwindSafe for Literal
impl Send for Literal
impl Sync for Literal
impl Unpin for Literal
impl UnwindSafe for Literal
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key and return true if they are equal.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more