35 variables_info_(variables_info),
36 basis_factorization_(basis_factorization),
37 dual_edge_norms_(dual_edge_norms),
38 dual_prices_(dual_prices),
39 stats_(
"VariableValues") {}
61 LOG(DFATAL) <<
"SetNonBasicVariableValueFromStatus() shouldn't "
62 <<
"be called on a FREE variable.";
65 LOG(DFATAL) <<
"SetNonBasicVariableValueFromStatus() shouldn't "
66 <<
"be called on a BASIC variable.";
74 const DenseRow& free_initial_value) {
78 const ColIndex num_cols = matrix_.
num_cols();
79 variable_values_.
resize(num_cols, 0.0);
80 for (ColIndex
col(0);
col < num_cols; ++
col) {
81 switch (statuses[
col]) {
83 ABSL_FALLTHROUGH_INTENDED;
91 variable_values_[
col] =
92 col < free_initial_value.
size() ? free_initial_value[
col] : 0.0;
103 const RowIndex num_rows = matrix_.
num_rows();
110 basis_factorization_.
RightSolve(&scratchpad_);
111 for (RowIndex
row(0);
row < num_rows; ++
row) {
112 variable_values_[basis_[
row]] = scratchpad_[
row];
116 dual_prices_->
Clear();
123 const ColIndex num_cols = matrix_.
num_cols();
124 for (ColIndex
col(0);
col < num_cols; ++
col) {
134 const ColIndex num_cols = matrix_.
num_cols();
135 for (ColIndex
col(0);
col < num_cols; ++
col) {
137 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
138 primal_infeasibility =
std::max(primal_infeasibility, col_infeasibility);
140 return primal_infeasibility;
146 const ColIndex num_cols = matrix_.
num_cols();
147 for (ColIndex
col(0);
col < num_cols; ++
col) {
149 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
150 sum +=
std::max(0.0, col_infeasibility);
171 for (
const auto e : direction) {
172 const ColIndex
col = basis_[e.row()];
173 variable_values_[
col] -= e.coefficient() * step;
175 variable_values_[entering_col] += step;
179 const std::vector<ColIndex>& cols_to_update,
bool update_basic_variables) {
181 if (!update_basic_variables) {
182 for (ColIndex
col : cols_to_update) {
188 const RowIndex num_rows = matrix_.
num_rows();
189 initially_all_zero_scratchpad_.
values.
resize(num_rows, 0.0);
192 bool use_dense =
false;
193 for (ColIndex
col : cols_to_update) {
198 col, variable_values_[
col] - old_value,
199 &initially_all_zero_scratchpad_.
values);
202 col, variable_values_[
col] - old_value,
203 &initially_all_zero_scratchpad_);
210 basis_factorization_.
RightSolve(&initially_all_zero_scratchpad_);
211 if (initially_all_zero_scratchpad_.
non_zeros.empty()) {
212 for (RowIndex
row(0);
row < num_rows; ++
row) {
213 variable_values_[basis_[
row]] -= initially_all_zero_scratchpad_[
row];
220 for (
const auto e : initially_all_zero_scratchpad_) {
221 variable_values_[basis_[e.row()]] -= e.coefficient();
222 initially_all_zero_scratchpad_[e.row()] = 0.0;
225 initially_all_zero_scratchpad_.non_zeros.clear();
230 const RowIndex num_rows = matrix_.
num_rows();
234 put_more_importance_on_norm_ = put_more_importance_on_norm;
235 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
237 if (put_more_importance_on_norm) {
238 for (RowIndex
row(0);
row < num_rows; ++
row) {
239 const ColIndex
col = basis_[
row];
241 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
242 if (infeasibility > tolerance) {
244 row, std::abs(infeasibility) / squared_norms[
row]);
248 for (RowIndex
row(0);
row < num_rows; ++
row) {
249 const ColIndex
col = basis_[
row];
251 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
252 if (infeasibility > tolerance) {
269 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
271 if (put_more_importance_on_norm_) {
272 for (
const RowIndex
row : rows) {
273 const ColIndex
col = basis_[
row];
275 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
276 if (infeasibility > tolerance) {
278 std::abs(infeasibility) / squared_norms[
row]);
284 for (
const RowIndex
row : rows) {
285 const ColIndex
col = basis_[
row];
287 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
288 if (infeasibility > tolerance) {
290 Square(infeasibility) / squared_norms[
row]);
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 UpdateDualPrices(absl::Span< const RowIndex > row)
void SetNonBasicVariableValueFromStatus(ColIndex col)
Fractional ComputeMaximumPrimalInfeasibility() const
Fractional ComputeSumOfPrimalInfeasibilities() const
void UpdateGivenNonBasicVariables(const std::vector< ColIndex > &cols_to_update, bool update_basic_variables)
void ResetAllNonBasicVariableValues(const DenseRow &free_initial_values)
void RecomputeDualPrices(bool put_more_importance_on_norm=false)
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
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)
constexpr double kInfinity
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