14#ifndef ORTOOLS_GLOP_RANK_ONE_UPDATE_H_
15#define ORTOOLS_GLOP_RANK_ONE_UPDATE_H_
49 ColIndex u_index, ColIndex v_index,
66 -storage_->ColumnScalarProduct(v_index_,
Transpose(*x)) / mu_;
67 storage_->ColumnAddMultipleToDenseColumn(u_index_, multiplier, x);
72 -storage_->ColumnScalarProduct(v_index_,
Transpose(x->values)) / mu_;
73 if (multiplier != 0.0) {
74 storage_->ColumnAddMultipleToSparseScatteredColumn(u_index_, multiplier,
84 -storage_->ColumnScalarProduct(u_index_, *y) / mu_;
85 storage_->ColumnAddMultipleToDenseColumn(v_index_, multiplier,
91 -storage_->ColumnScalarProduct(u_index_, y->
values) / mu_;
92 if (multiplier != 0.0) {
93 storage_->ColumnAddMultipleToSparseScatteredColumn(
101 storage_->ColumnScalarProduct(v_index_,
Transpose(*x));
102 storage_->ColumnAddMultipleToDenseColumn(u_index_, multiplier, x);
107 const Fractional multiplier = storage_->ColumnScalarProduct(u_index_, *y);
108 storage_->ColumnAddMultipleToDenseColumn(v_index_, multiplier,
113 return storage_->column(u_index_).num_entries() +
114 storage_->column(v_index_).num_entries();
127 const CompactSparseMatrix* storage_;
151 elementary_matrices_.clear();
157 elementary_matrices_.push_back(update_matrix);
164 for (
int i = elementary_matrices_.size() - 1; i >= 0; --i) {
165 elementary_matrices_[i].LeftSolve(y);
183 for (
int i = elementary_matrices_.size() - 1; i >= 0; --i) {
185 elementary_matrices_[i].LeftSolve(&y->
values);
187 elementary_matrices_[i].LeftSolveWithNonZeros(y);
199 const size_t end = elementary_matrices_.size();
200 for (
int i = 0; i <
end; ++i) {
201 elementary_matrices_[i].RightSolve(d);
219 const size_t end = elementary_matrices_.size();
220 for (
int i = 0; i <
end; ++i) {
222 elementary_matrices_[i].RightSolve(&d->
values);
224 elementary_matrices_[i].RightSolveWithNonZeros(d);
245 mutable double dtime_ = 0.0;
247 double hypersparse_ratio_;
248 EntryIndex num_entries_;
249 std::vector<RankOneUpdateElementaryMatrix> elementary_matrices_;
void ColumnCopyToDenseColumn(ColIndex col, DenseColumn *dense_column) const
Fractional ColumnScalarProduct(ColIndex col, const DenseRow &vector) const
void LeftMultiply(DenseRow *y) const
void RightSolve(DenseColumn *x) const
void RightSolveWithNonZeros(ScatteredColumn *x) const
void LeftSolveWithNonZeros(ScatteredRow *y) const
void LeftSolve(DenseRow *y) const
EntryIndex num_entries() const
RankOneUpdateElementaryMatrix(const CompactSparseMatrix *storage, ColIndex u_index, ColIndex v_index, Fractional u_dot_v)
void RightMultiply(DenseColumn *x) const
RankOneUpdateFactorization & operator=(const RankOneUpdateFactorization &)=delete
void RightSolve(DenseColumn *d) const
void LeftSolveWithNonZeros(ScatteredRow *y) const
double DeterministicTimeSinceLastReset() const
void ResetDeterministicTime()
EntryIndex num_entries() const
void set_hypersparse_ratio(double value)
void RightSolveWithNonZeros(ScatteredColumn *d) const
void LeftSolve(DenseRow *y) const
void Update(const RankOneUpdateElementaryMatrix &update_matrix)
RankOneUpdateFactorization(const RankOneUpdateFactorization &)=delete
RankOneUpdateFactorization()
const DenseRow & Transpose(const DenseColumn &col)
StrictITIVector< RowIndex, Fractional > DenseColumn
StrictITIVector< ColIndex, Fractional > DenseRow
static double DeterministicTimeForFpOperations(int64_t n)
ClosedInterval::Iterator end(ClosedInterval interval)
#define RETURN_IF_NULL(x)
void ClearNonZerosIfTooDense(double ratio_for_using_dense_representation)
StrictITIVector< Index, Fractional > values
Bitset64< Index > is_non_zero
void RepopulateSparseMask()
bool ShouldUseDenseIteration(double ratio_for_using_dense_representation) const
std::vector< Index > non_zeros