14#ifndef OR_TOOLS_SAT_ROUTING_CUTS_H_
15#define OR_TOOLS_SAT_ROUTING_CUTS_H_
24#include "absl/container/flat_hash_map.h"
25#include "absl/types/span.h"
26#include "ortools/sat/cp_model.pb.h"
42 const std::vector<int>& heads,
43 const std::vector<Literal>& literals,
Model* model);
62 int GetMinOutgoingFlow(
int subset_size,
int longest_path_length,
63 int max_longest_paths);
65 const std::vector<int>& tails_;
66 const std::vector<int>& heads_;
67 const std::vector<Literal>& literals_;
82 std::vector<bool> in_subset_;
83 std::vector<int> index_in_subset_;
86 std::vector<std::vector<int>> incoming_arc_indices_;
87 std::vector<std::vector<int>> outgoing_arc_indices_;
90 std::vector<bool> reachable_;
91 std::vector<bool> next_reachable_;
97 std::vector<absl::flat_hash_map<IntegerVariable, IntegerValue>>
98 node_var_lower_bounds_;
99 std::vector<absl::flat_hash_map<IntegerVariable, IntegerValue>>
100 next_node_var_lower_bounds_;
121 absl::Span<
const std::pair<int, int>> arcs,
122 int stop_at_num_components,
123 std::vector<int>* subset_data,
124 std::vector<absl::Span<const int>>* subsets);
140 absl::Span<const int> parent, std::vector<int>* subset_data,
141 std::vector<absl::Span<const int>>* subsets,
142 int node_limit = std::numeric_limits<int>::max());
180 int num_nodes, absl::Span<const ArcWithLpValue> relevant_arcs);
190 int num_nodes, absl::Span<const int> tails, absl::Span<const int> heads,
191 absl::Span<const Literal> literals,
Model* model);
198 absl::Span<const int> heads,
199 absl::Span<const Literal> literals,
200 absl::Span<const int64_t> demands,
201 int64_t capacity,
Model* model);
214 int num_nodes,
const std::vector<int>& tails,
const std::vector<int>& heads,
215 const std::vector<AffineExpression>& arc_capacities,
216 std::function<
void(
const std::vector<bool>& in_subset,
217 IntegerValue* min_incoming_flow,
218 IntegerValue* min_outgoing_flow)>
int ComputeTightMinOutgoingFlow(absl::Span< const int > subset)
int ComputeMinOutgoingFlow(absl::Span< const int > subset)
MinOutgoingFlowHelper(int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, Model *model)
CutGenerator CreateStronglyConnectedGraphCutGenerator(int num_nodes, absl::Span< const int > tails, absl::Span< const int > heads, absl::Span< const Literal > literals, Model *model)
std::vector< int > ComputeGomoryHuTree(int num_nodes, absl::Span< const ArcWithLpValue > relevant_arcs)
CutGenerator CreateCVRPCutGenerator(int num_nodes, absl::Span< const int > tails, absl::Span< const int > heads, absl::Span< const Literal > literals, absl::Span< const int64_t > demands, int64_t capacity, Model *model)
CutGenerator CreateFlowCutGenerator(int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< AffineExpression > &arc_capacities, std::function< void(const std::vector< bool > &in_subset, IntegerValue *min_incoming_flow, IntegerValue *min_outgoing_flow)> get_flows, Model *model)
void SymmetrizeArcs(std::vector< ArcWithLpValue > *arcs)
void ExtractAllSubsetsFromForest(absl::Span< const int > parent, std::vector< int > *subset_data, std::vector< absl::Span< const int > > *subsets, int node_limit)
void GenerateInterestingSubsets(int num_nodes, absl::Span< const std::pair< int, int > > arcs, int stop_at_num_components, std::vector< int > *subset_data, std::vector< absl::Span< const int > > *subsets)
In SWIG mode, we don't want anything besides these top-level includes.
bool operator==(const ArcWithLpValue &o) const