21#include "ortools/sat/cp_model.pb.h"
29 if (!cp_model->has_objective())
return;
31 if (cp_model->objective().vars_size() == 1) {
34 const int old_ref = cp_model->objective().vars(0);
35 const int64_t old_coeff = cp_model->objective().coeffs(0);
36 const double muliplier =
static_cast<double>(std::abs(old_coeff));
38 cp_model->mutable_objective()->set_vars(0,
NegatedRef(old_ref));
40 if (muliplier != 1.0) {
42 CHECK(cp_model->objective().domain().empty());
44 double old_factor = cp_model->objective().scaling_factor();
45 if (old_factor == 0.0) old_factor = 1.0;
46 const double old_offset = cp_model->objective().offset();
47 cp_model->mutable_objective()->set_scaling_factor(old_factor * muliplier);
48 cp_model->mutable_objective()->set_offset(old_offset / muliplier);
50 cp_model->mutable_objective()->set_coeffs(0, 1.0);
60 for (
int i = 0; i < cp_model->objective().vars_size(); ++i) {
61 const int ref = cp_model->objective().vars(i);
64 cp_model->objective().coeffs(i) * (
RefIsPositive(ref) ? 1 : -1);
65 const int64_t value1 = cp_model->variables(
var).domain(0) *
coeff;
66 const int64_t value2 = cp_model->variables(
var).domain(
67 cp_model->variables(
var).domain_size() - 1) *
74 const int obj_ref = cp_model->variables_size();
76 IntegerVariableProto* obj = cp_model->add_variables();
77 Domain obj_domain(min_obj, max_obj);
78 if (!cp_model->objective().domain().empty()) {
86 LinearConstraintProto*
ct = cp_model->add_constraints()->mutable_linear();
89 *(
ct->mutable_vars()) = cp_model->objective().vars();
90 *(
ct->mutable_coeffs()) = cp_model->objective().coeffs();
91 ct->add_vars(obj_ref);
95 cp_model->mutable_objective()->clear_vars();
96 cp_model->mutable_objective()->clear_coeffs();
97 cp_model->mutable_objective()->add_vars(obj_ref);
98 cp_model->mutable_objective()->add_coeffs(1);
99 cp_model->mutable_objective()->clear_domain();
We call domain any subset of Int64 = [kint64min, kint64max].
Domain IntersectionWith(const Domain &domain) const
Returns the intersection of D and domain.
bool RefIsPositive(int ref)
void EncodeObjectiveAsSingleVariable(CpModelProto *cp_model)
void FillDomainInProto(const Domain &domain, ProtoWithDomain *proto)
Domain ReadDomainFromProto(const ProtoWithDomain &proto)
Collection of objects used to extend the Constraint Solver library.