OR-Tools  8.0
probing.h
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 #ifndef OR_TOOLS_SAT_PROBING_H_
15 #define OR_TOOLS_SAT_PROBING_H_
16 
17 #include "absl/types/span.h"
18 #include "ortools/sat/model.h"
19 #include "ortools/sat/sat_base.h"
20 
21 namespace operations_research {
22 namespace sat {
23 
24 // Fixes Booleans variables to true/false and see what is propagated. This can:
25 //
26 // - Fix some Boolean variables (if we reach a conflict while probing).
27 //
28 // - Infer new direct implications. We add them directly to the
29 // BinaryImplicationGraph and they can later be used to detect equivalent
30 // literals, expand at most ones clique, etc...
31 //
32 // - Tighten the bounds of integer variables. If we probe the two possible
33 // values of a Boolean (b=0 and b=1), we get for each integer variables two
34 // propagated domain D_0 and D_1. The level zero domain can then be
35 // intersected with D_0 U D_1. This can restrict the lower/upper bounds of a
36 // variable, but it can also create holes in the domain! This will detect
37 // common cases like an integer variable in [0, 10] that actually only take
38 // two values [0] or [10] depending on one Boolean.
39 //
40 // Returns false if the problem was proved INFEASIBLE during probing.
41 //
42 // TODO(user): For now we process the Boolean in their natural order, this is
43 // not the most efficient.
44 //
45 // TODO(user): This might generate a lot of new direct implications. We might
46 // not want to add them directly to the BinaryImplicationGraph and could instead
47 // use them directly to detect equivalent literal like in
48 // ProbeAndFindEquivalentLiteral(). The situation is not clear.
49 //
50 // TODO(user): More generally, we might want to register any literal => bound in
51 // the IntegerEncoder. This would allow to remember them and use them in other
52 // part of the solver (cuts, lifting, ...).
53 //
54 // TODO(user): Rename to include Integer in the name and distinguish better
55 // from FailedLiteralProbing() below.
56 bool ProbeBooleanVariables(double deterministic_time_limit, Model* model,
57  bool log_info = false);
58 
59 // Same as above method except it probes only on the variables given in
60 // 'bool_vars'.
61 bool ProbeBooleanVariables(double deterministic_time_limit,
62  absl::Span<const BooleanVariable> bool_vars,
63  Model* model, bool log_info = false);
64 
65 // Try to randomly tweak the search and stop at the first conflict each time.
66 // This can sometimes find feasible solution, but more importantly, it is a form
67 // of probing that can sometimes find small and interesting conflicts or fix
68 // variables. This seems to work well on the SAT14/app/rook-* problems and
69 // do fix more variables if run before probing.
70 //
71 // If a feasible SAT solution is found (i.e. all Boolean assigned), then this
72 // abort and leave the solver with the full solution assigned.
73 //
74 // Returns false iff the problem is UNSAT.
75 bool LookForTrivialSatSolution(double deterministic_time_limit, Model* model,
76  bool log_info = false);
77 
78 // Options for the FailedLiteralProbing() code below.
79 //
80 // A good reference for the algorithms involved here is the paper "Revisiting
81 // Hyper Binary Resolution" Marijn J. H. Heule, Matti Jarvisalo, Armin Biere,
82 // http://www.cs.utexas.edu/~marijn/cpaior2013.pdf
84  // The probing will consume all this deterministic time or stop if nothing
85  // else can be deduced and everything has been probed until fix-point. The
86  // fix point depend on the extract_binay_clauses option:
87  // - If false, we will just stop when no more failed literal can be found.
88  // - If true, we will do more work and stop when all failed literal have been
89  // found and all hyper binary resolution have been performed.
90  //
91  // TODO(user): We can also provide a middle ground and probe all failed
92  // literal but do not extract all binary clauses.
93  //
94  // Note that the fix-point is unique, modulo the equivalent literal detection
95  // we do. And if we add binary clauses, modulo the transitive reduction of the
96  // binary implication graph.
97  //
98  // To be fast, we only use the binary clauses in the binary implication graph
99  // for the equivalence detection. So the power of the equivalence detection
100  // changes if the extract_binay_clauses option is true or not.
101  //
102  // TODO(user): The fix point is not yet reached since we don't currently
103  // simplify non-binary clauses with these equivalence, but we will.
104  double deterministic_limit = 1.0;
105 
106  // This is also called hyper binary resolution. Basically, we make sure that
107  // the binary implication graph is augmented with all the implication of the
108  // form a => b that can be derived by fixing 'a' at level zero and doing a
109  // propagation using all constraints. Note that we only add clauses that
110  // cannot be derived by the current implication graph.
111  //
112  // With these extra clause the power of the equivalence literal detection
113  // using only the binary implication graph with increase. Note that it is
114  // possible to do exactly the same thing without adding these binary clause
115  // first. This is what is done by yet another probing algorithm (currently in
116  // simplification.cc).
117  //
118  // TODO(user): Note that adding binary clause before/during the SAT presolve
119  // is currently not always a good idea. This is because we don't simplify the
120  // other clause as much as we could. Also, there can be up to a quadratic
121  // number of clauses added this way, which might slow down things a lot. But
122  // then because of the deterministic limit, we usually cannot add too much
123  // clauses, even for huge problems, since we will reach the limit before that.
125 
126  // Use a version of the "Tree look" algorithm as explained in the paper above.
127  // This is usually faster and more efficient. Note that when extracting binary
128  // clauses it might currently produce more "redundant" one in the sense that a
129  // transitive reduction of the binary implication graph after all hyper binary
130  // resolution have been performed may need to do more work.
131  bool use_tree_look = true;
132 
133  // There is two sligthly different implementation of the tree-look algo.
134  //
135  // TODO(user): Decide which one is better, currently the difference seems
136  // small but the queue seems slightly faster.
137  bool use_queue = true;
138 
139  // If we detect as we probe that a new binary clause subsumes one of the
140  // non-binary clause, we will replace the long clause by the binary one. This
141  // is orthogonal to the extract_binary_clauses parameters which will add all
142  // binary clauses but not neceassirly check for subsumption.
144 
145  // We assume this is also true if --v 1 is activated.
146  bool log_info = false;
147 
148  std::string ToString() const {
149  return absl::StrCat("deterministic_limit: ", deterministic_limit,
150  " extract_binary_clauses: ", extract_binary_clauses,
151  " use_tree_look: ", use_tree_look,
152  " use_queue: ", use_queue);
153  }
154 };
155 
156 // Similar to ProbeBooleanVariables() but different :-)
157 //
158 // First, this do not consider integer variable. It doesn't do any disjunctive
159 // reasoning (i.e. changing the domain of an integer variable by intersecting it
160 // with the union of what happen when x is fixed and not(x) is fixed).
161 //
162 // However this should be more efficient and just work better for pure Boolean
163 // problems. On integer problems, we might also want to run this one first, and
164 // then do just one quick pass of ProbeBooleanVariables().
165 //
166 // Note that this by itself just do one "round", look at the code in the
167 // Inprocessing class that call this interleaved with other reductions until a
168 // fix point is reached.
169 //
170 // This can fix a lot of literals via failed literal detection, that is when we
171 // detect that x => not(x) via propagation after taking x as a decision. It also
172 // use the strongly connected component algorithm to detect equivalent literals.
173 //
174 // It will add any detected binary clause (via hyper binary resolution) to
175 // the implication graph. See the option comments for more details.
176 bool FailedLiteralProbingRound(ProbingOptions options, Model* model);
177 
178 } // namespace sat
179 } // namespace operations_research
180 
181 #endif // OR_TOOLS_SAT_PROBING_H_
operations_research::sat::FailedLiteralProbingRound
bool FailedLiteralProbingRound(ProbingOptions options, Model *model)
Definition: probing.cc:338
operations_research::sat::ProbingOptions::ToString
std::string ToString() const
Definition: probing.h:148
operations_research::sat::ProbingOptions::deterministic_limit
double deterministic_limit
Definition: probing.h:104
operations_research::sat::ProbingOptions::subsume_with_binary_clause
bool subsume_with_binary_clause
Definition: probing.h:143
model.h
operations_research
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Definition: dense_doubly_linked_list.h:21
sat_base.h
operations_research::sat::LookForTrivialSatSolution
bool LookForTrivialSatSolution(double deterministic_time_limit, Model *model, bool log_info)
Definition: probing.cc:258
operations_research::sat::ProbingOptions::log_info
bool log_info
Definition: probing.h:146
operations_research::sat::ProbeBooleanVariables
bool ProbeBooleanVariables(const double deterministic_time_limit, Model *model, bool log_info)
Definition: probing.cc:30
model
GRBmodel * model
Definition: gurobi_interface.cc:195
operations_research::sat::ProbingOptions
Definition: probing.h:83
operations_research::sat::ProbingOptions::use_tree_look
bool use_tree_look
Definition: probing.h:131
operations_research::sat::ProbingOptions::use_queue
bool use_queue
Definition: probing.h:137
operations_research::sat::ProbingOptions::extract_binary_clauses
bool extract_binary_clauses
Definition: probing.h:124