25 #include "ortools/sat/sat_parameters.pb.h"
33 : parameters_(*
model->GetOrCreate<SatParameters>()),
37 pseudo_costs_.resize(num_vars);
40 void PseudoCosts::UpdateCostForVar(IntegerVariable
var,
double new_cost) {
41 if (
var >= pseudo_costs_.size()) {
46 DCHECK_LT(
var, pseudo_costs_.size());
47 pseudo_costs_[
var].AddData(new_cost);
51 const std::vector<VariableBoundChange>& bound_changes,
52 const IntegerValue obj_bound_improvement) {
53 DCHECK_GE(obj_bound_improvement, 0);
54 if (obj_bound_improvement == IntegerValue(0))
return;
58 if (decision.lower_bound_change == IntegerValue(0))
continue;
60 const double current_pseudo_cost =
62 UpdateCostForVar(decision.var, current_pseudo_cost);
69 const double epsilon = 1e-6;
71 double best_cost = -std::numeric_limits<double>::infinity();
74 for (IntegerVariable positive_var(0); positive_var < pseudo_costs_.size();
76 const IntegerVariable negative_var =
NegationOf(positive_var);
78 const IntegerValue lb = integer_trail_->
LowerBound(positive_var);
79 const IntegerValue ub = integer_trail_->
UpperBound(positive_var);
80 if (lb >= ub)
continue;
82 parameters_.pseudo_cost_reliability_threshold()) {
87 const double current_merged_cost =
91 if (current_merged_cost > best_cost) {
92 chosen_var = positive_var;
93 best_cost = current_merged_cost;
107 std::vector<PseudoCosts::VariableBoundChange> bound_changes;
112 var_bound_change.
var = l.var;
115 bound_changes.push_back(var_bound_change);
123 var_bound_change.
var =
var;
126 bound_changes.push_back(var_bound_change);
135 bound_changes.push_back(var_bound_change);
139 return bound_changes;
const InlinedIntegerLiteralVector & GetIntegerLiterals(Literal lit) const
const InlinedIntegerValueVector & GetEqualityLiterals(Literal lit) const
bool IsCurrentlyIgnored(IntegerVariable i) const
IntegerValue UpperBound(IntegerVariable i) const
IntegerValue LowerBound(IntegerVariable i) const
IntegerVariable NumIntegerVariables() const
Class that owns everything related to a particular optimization model.
IntegerVariable GetBestDecisionVar()
int GetRecordings(IntegerVariable var) const
std::vector< VariableBoundChange > GetBoundChanges(Literal decision)
PseudoCosts(Model *model)
void UpdateCost(const std::vector< VariableBoundChange > &bound_changes, IntegerValue obj_bound_improvement)
double GetCost(IntegerVariable var) const
const IntegerVariable kNoIntegerVariable(-1)
std::vector< IntegerVariable > NegationOf(const std::vector< IntegerVariable > &vars)
double ToDouble(IntegerValue value)
Collection of objects used to extend the Constraint Solver library.
IntegerValue lower_bound_change