66 absl::Span<const int64_t>
GetVarValues()
const {
return var_values_; }
72 const absl::flat_hash_map<int, int64_t>&
solution);
94 int var, absl::Span<
const std::pair<int, int64_t>> linear,
100 absl::Span<const int64_t> coeffs,
117 int var, int64_t value, absl::Span<
const std::pair<int, int64_t>> linear,
124 int literal,
bool value, absl::Span<
const std::pair<int, int64_t>> linear,
142 int64_t value_if_true, int64_t value_if_false);
164 int var,
const Domain& reduced_var_domain,
165 std::optional<int64_t> unique_escape_value,
166 bool push_down_when_not_in_domain,
167 const absl::btree_map<int64_t, int>& encoding);
187 int ref, int64_t min_value, int64_t max_value,
188 absl::Span<
const std::pair<int, Domain>> dominating_refs);
196 absl::Span<
const std::unique_ptr<SparsePermutation>> generators);
203 int row,
int pivot_col,
bool value);
212 absl::Span<const int> enforcement_lits, std::optional<int> var_index,
213 absl::Span<const int> vars, absl::Span<const int64_t> default_values,
214 absl::Span<const int64_t> coeffs, int64_t rhs);
221 int64_t min_level, int64_t max_level,
222 absl::Span<const int> level_vars,
230 int active_i,
int active_j);
239 int prod_var, int64_t default_div_value,
240 int64_t default_prod_value);
251 absl::Span<const int> prod_vars);
259 absl::Span<const int> enforcement_lits);
281 absl::Span<const StateVar> state_vars,
282 absl::Span<const TransitionVar> transition_vars);
298 absl::Span<const int> existing_row_lits,
299 absl::Span<const TableRowLiteral> new_row_lits);
323 const CpModelProto& model, absl::Span<const int> x_intervals,
324 absl::Span<const int> y_intervals,
325 absl::Span<const BoxInAreaLiteral> box_in_area_lits);
328 bool HasValue(
int var)
const {
return var_has_value_[var]; }
330 int64_t GetVarValue(
int var)
const {
return var_values_[var]; }
332 bool GetLiteralValue(
int lit)
const {
334 return RefIsPositive(lit) ? GetVarValue(var) : !GetVarValue(var);
337 std::optional<int64_t> GetRefValue(
int ref)
const {
339 if (!HasValue(var))
return std::nullopt;
340 return RefIsPositive(ref) ? GetVarValue(var) : -GetVarValue(var);
343 std::optional<int64_t> GetExpressionValue(
344 const LinearExpressionProto& expr)
const {
345 int64_t result = expr.offset();
346 for (
int i = 0;
i < expr.vars().size(); ++
i) {
347 if (expr.coeffs(
i) == 0)
continue;
348 if (!HasValue(expr.vars(
i)))
return std::nullopt;
349 result += expr.coeffs(
i) * GetVarValue(expr.vars(
i));
354 void SetVarValue(
int var, int64_t value) {
355 var_has_value_[var] =
true;
356 var_values_[var] = value;
359 void SetLiteralValue(
int lit,
bool value) {
363 void SetRefValue(
int ref,
int value) {
367 void PermuteVariables(
const SparsePermutation& permutation);
369 bool solution_is_loaded_ =
false;
370 std::vector<bool> var_has_value_;
372 std::vector<int64_t> var_values_;