65 absl::Span<const int64_t>
GetVarValues()
const {
return var_values_; }
71 const absl::flat_hash_map<int, int64_t>&
solution);
88 int var, absl::Span<
const std::pair<int, int64_t>> linear,
94 absl::Span<const int64_t> coeffs,
111 int var, int64_t value, absl::Span<
const std::pair<int, int64_t>> linear,
118 int literal,
bool value, absl::Span<
const std::pair<int, int64_t>> linear,
136 int64_t value_if_true, int64_t value_if_false);
166 int ref, int64_t min_value, int64_t max_value,
167 absl::Span<
const std::pair<int, Domain>> dominating_refs);
175 absl::Span<
const std::unique_ptr<SparsePermutation>> generators);
183 absl::Span<const int> vars,
184 absl::Span<const int64_t> coeffs,
192 int64_t min_level, int64_t max_level,
193 absl::Span<const int> level_vars,
194 const CircuitConstraintProto& circuit);
199 const LinearExpressionProto& time_i,
200 const LinearExpressionProto& time_j,
201 int active_i,
int active_j);
210 int prod_var, int64_t default_div_value,
211 int64_t default_prod_value);
222 absl::Span<const int> prod_vars);
230 absl::Span<const int> enforcement_lits);
251 const AutomatonConstraintProto& automaton,
252 absl::Span<const StateVar> state_vars,
253 absl::Span<const TransitionVar> transition_vars);
269 absl::Span<const int> existing_row_lits,
270 absl::Span<const TableRowLiteral> new_row_lits);
278 const LinearConstraintProto& linear, absl::Span<const int> bucket_lits);
294 const CpModelProto& model, absl::Span<const int> x_intervals,
295 absl::Span<const int> y_intervals,
296 absl::Span<const BoxInAreaLiteral> box_in_area_lits);
299 bool HasValue(
int var)
const {
return var_has_value_[var]; }
301 int64_t GetVarValue(
int var)
const {
return var_values_[var]; }
303 bool GetLiteralValue(
int lit)
const {
305 return RefIsPositive(lit) ? GetVarValue(var) : !GetVarValue(var);
308 std::optional<int64_t> GetRefValue(
int ref)
const {
310 if (!HasValue(var))
return std::nullopt;
311 return RefIsPositive(ref) ? GetVarValue(var) : -GetVarValue(var);
314 std::optional<int64_t> GetExpressionValue(
315 const LinearExpressionProto& expr)
const {
316 int64_t result = expr.offset();
317 for (
int i = 0;
i < expr.vars().size(); ++
i) {
318 if (expr.coeffs(
i) == 0)
continue;
319 if (!HasValue(expr.vars(
i)))
return std::nullopt;
320 result += expr.coeffs(
i) * GetVarValue(expr.vars(
i));
325 void SetVarValue(
int var, int64_t value) {
326 var_has_value_[var] =
true;
327 var_values_[var] = value;
330 void SetLiteralValue(
int lit,
bool value) {
334 void SetRefValue(
int ref,
int value) {
338 void PermuteVariables(
const SparsePermutation& permutation);
340 bool solution_is_loaded_ =
false;
341 std::vector<bool> var_has_value_;
343 std::vector<int64_t> var_values_;