32 variables_info_(variables_info),
33 basis_factorization_(basis_factorization),
34 dual_edge_norms_(dual_edge_norms),
35 dual_prices_(dual_prices),
36 stats_(
"VariableValues") {}
60 variable_values_[
col] = 0.0;
63 LOG(DFATAL) <<
"SetNonBasicVariableValueFromStatus() shouldn't "
64 <<
"be called on a BASIC variable.";
75 const ColIndex num_cols = matrix_.
num_cols();
76 variable_values_.
resize(num_cols, 0.0);
77 for (ColIndex
col(0);
col < num_cols; ++
col) {
78 switch (statuses[
col]) {
80 ABSL_FALLTHROUGH_INTENDED;
88 variable_values_[
col] = 0.0;
99 const RowIndex num_rows = matrix_.
num_rows();
106 basis_factorization_.
RightSolve(&scratchpad_);
107 for (RowIndex
row(0);
row < num_rows; ++
row) {
108 variable_values_[basis_[
row]] = scratchpad_[
row];
112 dual_prices_->
Clear();
119 const ColIndex num_cols = matrix_.
num_cols();
120 for (ColIndex
col(0);
col < num_cols; ++
col) {
130 const ColIndex num_cols = matrix_.
num_cols();
131 for (ColIndex
col(0);
col < num_cols; ++
col) {
133 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
134 primal_infeasibility =
std::max(primal_infeasibility, col_infeasibility);
136 return primal_infeasibility;
142 const ColIndex num_cols = matrix_.
num_cols();
143 for (ColIndex
col(0);
col < num_cols; ++
col) {
145 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
146 sum +=
std::max(0.0, col_infeasibility);
167 for (
const auto e : direction) {
168 const ColIndex
col = basis_[e.row()];
169 variable_values_[
col] -= e.coefficient() * step;
171 variable_values_[entering_col] += step;
175 const std::vector<ColIndex>& cols_to_update,
bool update_basic_variables) {
177 if (!update_basic_variables) {
178 for (ColIndex
col : cols_to_update) {
184 const RowIndex num_rows = matrix_.
num_rows();
185 initially_all_zero_scratchpad_.
values.
resize(num_rows, 0.0);
188 bool use_dense =
false;
189 for (ColIndex
col : cols_to_update) {
194 col, variable_values_[
col] - old_value,
195 &initially_all_zero_scratchpad_.
values);
198 col, variable_values_[
col] - old_value,
199 &initially_all_zero_scratchpad_);
206 basis_factorization_.
RightSolve(&initially_all_zero_scratchpad_);
207 if (initially_all_zero_scratchpad_.
non_zeros.empty()) {
208 for (RowIndex
row(0);
row < num_rows; ++
row) {
209 variable_values_[basis_[
row]] -= initially_all_zero_scratchpad_[
row];
216 for (
const auto e : initially_all_zero_scratchpad_) {
217 variable_values_[basis_[e.row()]] -= e.coefficient();
218 initially_all_zero_scratchpad_[e.row()] = 0.0;
221 initially_all_zero_scratchpad_.non_zeros.clear();
226 const RowIndex num_rows = matrix_.
num_rows();
230 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
232 for (RowIndex
row(0);
row < num_rows; ++
row) {
233 const ColIndex
col = basis_[
row];
235 GetLowerBoundInfeasibility(
col));
236 if (infeasibility > tolerance) {
252 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
254 for (
const RowIndex
row : rows) {
255 const ColIndex
col = basis_[
row];
257 GetLowerBoundInfeasibility(
col));
258 if (infeasibility > tolerance) {
260 Square(infeasibility) / squared_norms[
row]);
#define DCHECK_NE(val1, val2)
#define DCHECK(condition)
#define DCHECK_EQ(val1, val2)
bool IsRefactorized() const
void RightSolve(ScatteredColumn *d) const
ColIndex num_cols() const
void ColumnAddMultipleToSparseScatteredColumn(ColIndex col, Fractional multiplier, ScatteredColumn *column) const
RowIndex num_rows() const
void ColumnAddMultipleToDenseColumn(ColIndex col, Fractional multiplier, DenseColumn *dense_column) const
const DenseColumn & GetEdgeSquaredNorms()
void AddOrUpdate(Index position, Fractional value)
void Remove(Index position)
void DenseAddOrUpdate(Index position, Fractional value)
void ClearAndResize(Index n)
void AssignToZero(IntType size)
void resize(IntType size)
void SetNonBasicVariableValueFromStatus(ColIndex col)
Fractional ComputeMaximumPrimalInfeasibility() const
Fractional ComputeSumOfPrimalInfeasibilities() const
void UpdateGivenNonBasicVariables(const std::vector< ColIndex > &cols_to_update, bool update_basic_variables)
void UpdateDualPrices(const std::vector< RowIndex > &row)
void UpdateOnPivoting(const ScatteredColumn &direction, ColIndex entering_col, Fractional step)
VariableValues(const GlopParameters ¶meters, const CompactSparseMatrix &matrix, const RowToColMapping &basis, const VariablesInfo &variables_info, const BasisFactorization &basis_factorization, DualEdgeNorms *dual_edge_norms, DynamicMaximum< RowIndex > *dual_prices)
void RecomputeBasicVariableValues()
Fractional ComputeMaximumPrimalResidual() const
void RecomputeDualPrices()
void ResetAllNonBasicVariableValues()
const DenseRow & GetVariableUpperBounds() const
const DenseRow & GetVariableLowerBounds() const
const DenseBitRow & GetNotBasicBitRow() const
const VariableStatusRow & GetStatusRow() const
Fractional Square(Fractional f)
Fractional InfinityNorm(const DenseColumn &v)
bool IsAllZero(const Container &input)
bool IsFinite(Fractional value)
Collection of objects used to extend the Constraint Solver library.
std::vector< double > lower_bounds
std::vector< double > upper_bounds
#define SCOPED_TIME_STAT(stats)
bool ShouldUseDenseIteration(double ratio_for_using_dense_representation) const
void ClearNonZerosIfTooDense(double ratio_for_using_dense_representation)
std::vector< Index > non_zeros
StrictITIVector< Index, Fractional > values