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"
57 const std::vector<int>& heads,
58 const std::vector<Literal>& literals,
Options options,
68 void AddArc(
int tail,
int head, LiteralIndex literal_index);
73 void FillReasonForPath(
int start_node,
std::vector<
Literal>* reason) const;
94 std::vector<Literal> watch_index_to_literal_;
95 std::vector<std::vector<Arc>> watch_index_to_arcs_;
98 int propagation_trail_index_ = 0;
101 std::vector<int> next_;
102 std::vector<int> prev_;
103 std::vector<LiteralIndex> next_literal_;
107 std::vector<int> level_ends_;
108 std::vector<Arc> added_arcs_;
112 int rev_must_be_in_cycle_size_ = 0;
113 std::vector<int> must_be_in_cycle_;
116 std::vector<bool> processed_;
117 std::vector<bool> in_current_path_;
136 const std::vector<int>& distinguished_nodes,
148 void FillFixedPathInReason(
int start,
int end, std::vector<Literal>* reason);
151 const std::vector<std::vector<Literal>> graph_;
152 const int num_nodes_;
153 std::vector<bool> node_is_distinguished_;
157 std::vector<std::pair<int, int>> watch_index_to_arc_;
158 std::vector<std::pair<int, int>> fixed_arcs_;
159 std::vector<int> level_ends_;
162 std::vector<int> next_;
163 std::vector<int> prev_;
164 std::vector<bool> visited_;
169template <
class IntContainer>
171 const int num_arcs = tails->size();
172 if (num_arcs == 0)
return 0;
175 absl::btree_set<int>
nodes;
176 for (
int arc = 0;
arc < num_arcs; ++
arc) {
183 absl::flat_hash_map<int, int> mapping;
184 for (
const int node :
nodes) {
185 mapping[node] = new_index++;
189 for (
int arc = 0;
arc < num_arcs; ++
arc) {
190 (*tails)[
arc] = mapping[(*tails)[
arc]];
191 (*heads)[
arc] = mapping[(*heads)[
arc]];
204 int num_nodes,
const std::vector<int>& tails,
const std::vector<int>& heads,
205 const std::vector<Literal>& literals,
206 bool multiple_subcircuit_through_zero =
false);
210 const std::vector<std::vector<Literal>>& graph);
212 const std::vector<std::vector<Literal>>& graph,
213 const std::vector<int>& distinguished_nodes);
void SetLevel(int level) final
CircuitCoveringPropagator(std::vector< std::vector< Literal > > graph, const std::vector< int > &distinguished_nodes, Model *model)
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.
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)
Collection of objects used to extend the Constraint Solver library.
std::pair< int64_t, int64_t > Arc
std::optional< int64_t > end
bool multiple_subcircuit_through_zero