30 variables_info_(variables_info),
31 basis_factorization_(basis_factorization),
32 stats_(
"VariableValues") {}
56 variable_values_[
col] = 0.0;
59 LOG(DFATAL) <<
"SetNonBasicVariableValueFromStatus() shouldn't "
60 <<
"be called on a BASIC variable.";
71 const ColIndex num_cols = matrix_.
num_cols();
72 variable_values_.
resize(num_cols, 0.0);
73 for (ColIndex
col(0);
col < num_cols; ++
col) {
74 switch (statuses[
col]) {
76 ABSL_FALLTHROUGH_INTENDED;
84 variable_values_[
col] = 0.0;
95 const RowIndex num_rows = matrix_.
num_rows();
102 basis_factorization_.
RightSolve(&scratchpad_);
103 for (RowIndex
row(0);
row < num_rows; ++
row) {
104 variable_values_[basis_[
row]] = scratchpad_[
row];
112 const ColIndex num_cols = matrix_.
num_cols();
113 for (ColIndex
col(0);
col < num_cols; ++
col) {
123 const ColIndex num_cols = matrix_.
num_cols();
124 for (ColIndex
col(0);
col < num_cols; ++
col) {
126 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
127 primal_infeasibility =
std::max(primal_infeasibility, col_infeasibility);
129 return primal_infeasibility;
135 const ColIndex num_cols = matrix_.
num_cols();
136 for (ColIndex
col(0);
col < num_cols; ++
col) {
138 GetUpperBoundInfeasibility(
col), GetLowerBoundInfeasibility(
col));
139 sum +=
std::max(0.0, col_infeasibility);
160 for (
const auto e : direction) {
161 const ColIndex
col = basis_[e.row()];
162 variable_values_[
col] -= e.coefficient() * step;
164 variable_values_[entering_col] += step;
168 const std::vector<ColIndex>& cols_to_update,
bool update_basic_variables) {
170 if (!update_basic_variables) {
171 for (ColIndex
col : cols_to_update) {
177 const RowIndex num_rows = matrix_.
num_rows();
178 initially_all_zero_scratchpad_.
values.
resize(num_rows, 0.0);
181 bool use_dense =
false;
182 for (ColIndex
col : cols_to_update) {
187 col, variable_values_[
col] - old_value,
188 &initially_all_zero_scratchpad_.
values);
191 col, variable_values_[
col] - old_value,
192 &initially_all_zero_scratchpad_);
199 basis_factorization_.
RightSolve(&initially_all_zero_scratchpad_);
200 if (initially_all_zero_scratchpad_.
non_zeros.empty()) {
201 for (RowIndex
row(0);
row < num_rows; ++
row) {
202 variable_values_[basis_[
row]] -= initially_all_zero_scratchpad_[
row];
209 for (
const auto e : initially_all_zero_scratchpad_) {
210 variable_values_[basis_[e.row()]] -= e.coefficient();
211 initially_all_zero_scratchpad_[e.row()] = 0.0;
214 initially_all_zero_scratchpad_.non_zeros);
215 initially_all_zero_scratchpad_.non_zeros.clear();
219 return primal_squared_infeasibilities_;
223 return primal_infeasible_positions_;
228 const RowIndex num_rows = matrix_.
num_rows();
229 primal_squared_infeasibilities_.
resize(num_rows, 0.0);
232 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
233 for (RowIndex
row(0);
row < num_rows; ++
row) {
234 const ColIndex
col = basis_[
row];
236 GetLowerBoundInfeasibility(
col));
237 if (infeasibility > tolerance) {
238 primal_squared_infeasibilities_[
row] =
Square(infeasibility);
239 primal_infeasible_positions_.
Set(
row);
245 const std::vector<RowIndex>& rows) {
246 if (primal_squared_infeasibilities_.
size() != matrix_.
num_rows()) {
254 const Fractional tolerance = parameters_.primal_feasibility_tolerance();
255 for (
const RowIndex
row : rows) {
256 const ColIndex
col = basis_[
row];
258 GetLowerBoundInfeasibility(
col));
259 if (infeasibility > tolerance) {
260 primal_squared_infeasibilities_[
row] =
Square(infeasibility);
261 primal_infeasible_positions_.
Set(
row);
263 primal_infeasible_positions_.
Clear(
row);