14 #ifndef OR_TOOLS_SAT_CIRCUIT_H_
15 #define OR_TOOLS_SAT_CIRCUIT_H_
22 #include "absl/container/btree_set.h"
23 #include "absl/container/flat_hash_map.h"
58 const std::vector<int>& heads,
59 const std::vector<Literal>& literals,
Options options,
69 void AddArc(
int tail,
int head, LiteralIndex literal_index);
74 void FillReasonForPath(
int start_node, std::vector<
Literal>* reason) const;
87 std::vector<
Literal> self_arcs_;
88 absl::flat_hash_map<std::pair<
int,
int>,
Literal> graph_;
95 std::vector<Literal> watch_index_to_literal_;
96 std::vector<std::vector<Arc>> watch_index_to_arcs_;
99 std::vector<int> next_;
100 std::vector<int> prev_;
101 std::vector<LiteralIndex> next_literal_;
105 std::vector<int> level_ends_;
106 std::vector<Arc> added_arcs_;
110 int rev_must_be_in_cycle_size_ = 0;
111 std::vector<int> must_be_in_cycle_;
114 std::vector<bool> processed_;
115 std::vector<bool> in_current_path_;
124 const std::vector<int>& heads,
125 const std::vector<Literal>& literals,
Model*
model);
134 const int num_nodes_;
139 std::vector<Literal> watch_index_to_literal_;
140 std::vector<std::vector<std::pair<int, int>>> watch_index_to_arcs_;
144 std::vector<std::vector<int>> graph_;
145 std::vector<std::vector<Literal>> graph_literals_;
151 std::vector<std::vector<int>> components_;
153 std::vector<std::vector<int>>>
157 std::vector<int> level_ends_;
158 std::vector<int> touched_nodes_;
175 const std::vector<int>& distinguished_nodes,
187 void FillFixedPathInReason(
int start,
int end, std::vector<Literal>* reason);
190 const std::vector<std::vector<Literal>> graph_;
191 const int num_nodes_;
192 std::vector<bool> node_is_distinguished_;
196 std::vector<std::pair<int, int>> watch_index_to_arc_;
197 std::vector<std::pair<int, int>> fixed_arcs_;
198 std::vector<int> level_ends_;
201 std::vector<int> next_;
202 std::vector<int> prev_;
203 std::vector<bool> visited_;
208 template <
class IntContainer>
210 absl::flat_hash_map<int, int>* mapping_output =
nullptr) {
211 const int num_arcs = tails->size();
212 if (num_arcs == 0)
return 0;
215 absl::btree_set<int>
nodes;
216 for (
int arc = 0;
arc < num_arcs; ++
arc) {
223 absl::flat_hash_map<int, int> mapping;
224 for (
const int node :
nodes) {
225 mapping[node] = new_index++;
229 for (
int arc = 0;
arc < num_arcs; ++
arc) {
230 (*tails)[
arc] = mapping[(*tails)[
arc]];
231 (*heads)[
arc] = mapping[(*heads)[
arc]];
234 if (mapping_output !=
nullptr) {
235 *mapping_output = std::move(mapping);
249 int num_nodes,
const std::vector<int>& tails,
const std::vector<int>& heads,
250 const std::vector<Literal>& literals,
251 bool multiple_subcircuit_through_zero =
false);
255 const std::vector<std::vector<Literal>>& graph);
257 const std::vector<std::vector<Literal>>& graph,
258 const std::vector<int>& distinguished_nodes);
CircuitCoveringPropagator(std::vector< std::vector< Literal >> graph, const std::vector< int > &distinguished_nodes, Model *model)
void SetLevel(int level) final
bool IncrementalPropagate(const std::vector< int > &watch_indices) final
void RegisterWith(GenericLiteralWatcher *watcher)
void SetLevel(int level) final
bool IncrementalPropagate(const std::vector< int > &watch_indices) final
void RegisterWith(GenericLiteralWatcher *watcher)
CircuitPropagator(int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, Options options, Model *model)
Class that owns everything related to a particular optimization model.
void SetLevel(int level) final
bool IncrementalPropagate(const std::vector< int > &watch_indices) final
NoCyclePropagator(int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, Model *model)
std::function< void(Model *)> SubcircuitConstraint(int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, bool multiple_subcircuit_through_zero)
std::function< void(Model *)> CircuitCovering(const std::vector< std::vector< Literal >> &graph, const std::vector< int > &distinguished_nodes)
std::function< void(Model *)> ExactlyOnePerRowAndPerColumn(const std::vector< std::vector< Literal >> &graph)
int ReindexArcs(IntContainer *tails, IntContainer *heads, absl::flat_hash_map< int, int > *mapping_output=nullptr)
Collection of objects used to extend the Constraint Solver library.
std::optional< int64_t > end
bool multiple_subcircuit_through_zero