25#include "ortools/sat/sat_parameters.pb.h"
34 parameters_(*
model->GetOrCreate<SatParameters>()) {
36 pseudo_costs_.resize(num_vars);
39void PseudoCosts::UpdateCostForVar(IntegerVariable
var,
double new_cost) {
40 if (
var >= pseudo_costs_.size()) {
46 pseudo_costs_[
var].AddData(new_cost);
50 const std::vector<VariableBoundChange>& bound_changes,
51 const IntegerValue obj_bound_improvement) {
53 if (obj_bound_improvement == IntegerValue(0))
return;
57 if (decision.lower_bound_change == IntegerValue(0))
continue;
59 const double current_pseudo_cost =
61 UpdateCostForVar(decision.var, current_pseudo_cost);
68 const double epsilon = 1e-6;
70 double best_cost = -std::numeric_limits<double>::infinity();
73 for (IntegerVariable positive_var(0); positive_var < pseudo_costs_.size();
75 const IntegerVariable negative_var =
NegationOf(positive_var);
77 const IntegerValue lb = integer_trail_.
LowerBound(positive_var);
78 const IntegerValue ub = integer_trail_.
UpperBound(positive_var);
79 if (lb >= ub)
continue;
81 parameters_.pseudo_cost_reliability_threshold()) {
86 const double current_merged_cost =
90 if (current_merged_cost > best_cost) {
91 chosen_var = positive_var;
92 best_cost = current_merged_cost;
106 std::vector<PseudoCosts::VariableBoundChange> bound_changes;
112 encoder->GetAllIntegerLiterals(
Literal(decision))) {
114 if (integer_trail->IsCurrentlyIgnored(l.var))
continue;
116 var_bound_change.
var = l.var;
118 l.bound - integer_trail->LowerBound(l.var);
119 bound_changes.push_back(var_bound_change);
122 return bound_changes;
#define DCHECK_GE(val1, val2)
#define DCHECK_LT(val1, val2)
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
PseudoCosts(Model *model)
void UpdateCost(const std::vector< VariableBoundChange > &bound_changes, IntegerValue obj_bound_improvement)
double GetCost(IntegerVariable var) const
const LiteralIndex kNoLiteralIndex(-1)
const IntegerVariable kNoIntegerVariable(-1)
std::vector< PseudoCosts::VariableBoundChange > GetBoundChanges(LiteralIndex decision, Model *model)
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