29#ifndef OR_TOOLS_LP_DATA_SPARSE_H_
30#define OR_TOOLS_LP_DATA_SPARSE_H_
45class CompactSparseMatrixView;
71#if (!defined(_MSC_VER) || _MSC_VER >= 1800)
73 std::initializer_list<std::initializer_list<Fractional>> init_list);
122 template <
typename Matrix>
131 template <
typename Matrix>
178 ColIndex
num_cols()
const {
return ColIndex(columns_.size()); }
199 std::string
Dump()
const;
262 bool IsEmpty()
const {
return columns_.empty(); }
264 ColIndex
num_cols()
const {
return columns_.size(); }
275extern template void SparseMatrix::PopulateFromTranspose<SparseMatrix>(
276 const SparseMatrix&
input);
277extern template void SparseMatrix::PopulateFromPermutedMatrix<SparseMatrix>(
281SparseMatrix::PopulateFromPermutedMatrix<CompactSparseMatrixView>(
316 void Reset(RowIndex num_rows);
321 ColIndex AddDenseColumn(
const DenseColumn& dense_column);
324 ColIndex AddDenseColumnPrefix(
const DenseColumn& dense_column,
329 ColIndex AddDenseColumnWithNonZeros(
const DenseColumn& dense_column,
330 const std::vector<RowIndex>& non_zeros);
336 ColIndex AddAndClearColumnWithNonZeros(
DenseColumn* column,
337 std::vector<RowIndex>* non_zeros);
341 return starts_[
col + 1] - starts_[
col];
346 DCHECK_EQ(coefficients_.size(), rows_.size());
347 return coefficients_.size();
354 DCHECK_EQ(coefficients_.size(), rows_.size());
355 return coefficients_.empty();
364 return ::util::IntegerRange<EntryIndex>(starts_[
col], starts_[
col + 1]);
367 RowIndex
EntryRow(EntryIndex i)
const {
return rows_[i]; }
374 const EntryIndex
start = starts_[
col];
376 coefficients_.data() +
start.value());
382 return starts_[
col + 1] == starts_[
col];
389 for (
const EntryIndex i : Column(
col)) {
390 result += EntryCoefficient(i) * vector[
RowToColIndex(EntryRow(i))];
400 if (multiplier == 0.0)
return;
402 for (
const EntryIndex i : Column(
col)) {
403 (*dense_column)[EntryRow(i)] += multiplier * EntryCoefficient(i);
413 if (multiplier == 0.0)
return;
415 for (
const EntryIndex i : Column(
col)) {
416 const RowIndex
row = EntryRow(i);
417 column->
Add(
row, multiplier * EntryCoefficient(i));
426 ColumnCopyToClearedDenseColumn(
col, dense_column);
434 dense_column->
resize(num_rows_, 0.0);
435 for (
const EntryIndex i : Column(
col)) {
436 (*dense_column)[EntryRow(i)] = EntryCoefficient(i);
445 dense_column->
resize(num_rows_, 0.0);
447 for (
const EntryIndex i : Column(
col)) {
448 const RowIndex
row = EntryRow(i);
449 (*dense_column)[
row] = EntryCoefficient(i);
450 non_zeros->push_back(
row);
480 : compact_matrix_(*compact_matrix),
481 columns_(basis->data(), basis->size().
value()) {}
483 const std::vector<ColIndex>* columns)
484 : compact_matrix_(*compact_matrix), columns_(*columns) {}
487 bool IsEmpty()
const {
return compact_matrix_.IsEmpty(); }
488 RowIndex
num_rows()
const {
return compact_matrix_.num_rows(); }
489 ColIndex
num_cols()
const {
return ColIndex(columns_.size()); }
491 return compact_matrix_.column(columns_[
col.value()]);
501 const absl::Span<const ColIndex> columns_;
520 bool IsEmpty()
const {
return diagonal_coefficients_.empty(); }
524 return EntryIndex(num_cols_.value()) + coefficients_.size();
533 void Reset(RowIndex num_rows, ColIndex col_capacity);
550 void AddTriangularColumn(
const ColumnView& column, RowIndex diagonal_row);
551 void AddTriangularColumnWithGivenDiagonalEntry(
const SparseColumn& column,
552 RowIndex diagonal_row,
554 void AddDiagonalOnlyColumn(
Fractional diagonal_value);
560 void AddAndNormalizeTriangularColumn(
const SparseColumn& column,
561 RowIndex diagonal_row,
565 void ApplyRowPermutationToNonDiagonalEntries(
const RowPermutation& row_perm);
568 void CopyColumnToSparseColumn(ColIndex
col,
SparseColumn* output)
const;
577 return first_non_identity_column_;
582 return diagonal_coefficients_[
col];
645 void HyperSparseSolveWithReversedNonZeros(
649 void TransposeHyperSparseSolveWithReversedNonZeros(
657 void ComputeRowsToConsiderWithDfs(
RowIndexVector* non_zero_rows)
const;
663 void ComputeRowsToConsiderInSortedOrder(
RowIndexVector* non_zero_rows,
666 void ComputeRowsToConsiderInSortedOrder(
RowIndexVector* non_zero_rows)
const;
704 void PermutedLowerSparseSolve(
const ColumnView& rhs,
710 return num_fp_operations_;
717 bool IsLowerTriangular()
const;
718 bool IsUpperTriangular()
const;
735 void PermutedComputeRowsToConsider(
const ColumnView& rhs,
743 Fractional ComputeInverseInfinityNormUpperBound()
const;
744 Fractional ComputeInverseInfinityNorm()
const;
748 template <
bool diagonal_of_ones>
750 template <
bool diagonal_of_ones>
752 template <
bool diagonal_of_ones>
753 void TransposeLowerSolveInternal(
DenseColumn* rhs)
const;
754 template <
bool diagonal_of_ones>
755 void TransposeUpperSolveInternal(
DenseColumn* rhs)
const;
756 template <
bool diagonal_of_ones>
759 template <
bool diagonal_of_ones>
760 void HyperSparseSolveWithReversedNonZerosInternal(
762 template <
bool diagonal_of_ones>
763 void TransposeHyperSparseSolveInternal(
DenseColumn* rhs,
765 template <
bool diagonal_of_ones>
766 void TransposeHyperSparseSolveWithReversedNonZerosInternal(
771 void CloseCurrentColumn(
Fractional diagonal_value);
779 ColIndex first_non_identity_column_;
783 bool all_diagonal_coefficients_are_one_;
788 mutable std::vector<RowIndex> nodes_to_explore_;
791 int64_t num_fp_operations_;
792 mutable std::vector<RowIndex> lower_column_rows_;
793 mutable std::vector<RowIndex> upper_column_rows_;
794 mutable DenseColumn initially_all_zero_scratchpad_;
#define DCHECK_LT(val1, val2)
#define DCHECK_EQ(val1, val2)
bool ColumnIsEmpty(ColIndex col) const
void ColumnCopyToDenseColumn(ColIndex col, DenseColumn *dense_column) const
StrictITIVector< ColIndex, EntryIndex > starts_
ColIndex num_cols() const
void ColumnAddMultipleToSparseScatteredColumn(ColIndex col, Fractional multiplier, ScatteredColumn *column) const
void ColumnCopyToClearedDenseColumnWithNonZeros(ColIndex col, DenseColumn *dense_column, RowIndexVector *non_zeros) const
StrictITIVector< EntryIndex, RowIndex > rows_
RowIndex num_rows() const
CompactSparseMatrix(const SparseMatrix &matrix)
Fractional EntryCoefficient(EntryIndex i) const
StrictITIVector< EntryIndex, Fractional > coefficients_
void ColumnCopyToClearedDenseColumn(ColIndex col, DenseColumn *dense_column) const
Fractional ColumnScalarProduct(ColIndex col, const DenseRow &vector) const
::util::IntegerRange< EntryIndex > Column(ColIndex col) const
void ColumnAddMultipleToDenseColumn(ColIndex col, Fractional multiplier, DenseColumn *dense_column) const
RowIndex EntryRow(EntryIndex i) const
EntryIndex num_entries() const
ColumnView column(ColIndex col) const
EntryIndex ColumnNumEntries(ColIndex col) const
ColIndex num_cols() const
const ColumnView column(ColIndex col) const
CompactSparseMatrixView(const CompactSparseMatrix *compact_matrix, const RowToColMapping *basis)
CompactSparseMatrixView(const CompactSparseMatrix *compact_matrix, const std::vector< ColIndex > *columns)
RowIndex num_rows() const
Fractional ComputeInfinityNorm() const
ColIndex num_cols() const
void PopulateFromMatrix(const SparseMatrix &matrix)
Fractional ComputeOneNorm() const
const SparseColumn & column(ColIndex col) const
void PopulateFromMatrixPair(const SparseMatrix &matrix_a, const SparseMatrix &matrix_b)
RowIndex num_rows() const
MatrixView(const SparseMatrix &matrix)
void PopulateFromBasis(const MatrixView &matrix, const RowToColMapping &basis)
EntryIndex num_entries() const
void AppendUnitVector(RowIndex row, Fractional value)
void PopulateFromLinearCombination(Fractional alpha, const SparseMatrix &a, Fractional beta, const SparseMatrix &b)
void PopulateFromPermutedMatrix(const Matrix &a, const RowPermutation &row_perm, const ColumnPermutation &inverse_col_perm)
bool CheckNoDuplicates() const
void PopulateFromTranspose(const Matrix &input)
void PopulateFromIdentity(ColIndex num_cols)
Fractional ComputeInfinityNorm() const
ColIndex num_cols() const
void SetNumRows(RowIndex num_rows)
SparseColumn * mutable_column(ColIndex col)
Fractional LookUpValue(RowIndex row, ColIndex col) const
void Swap(SparseMatrix *matrix)
Fractional ComputeOneNorm() const
void ComputeMinAndMaxMagnitudes(Fractional *min_magnitude, Fractional *max_magnitude) const
const SparseColumn & column(ColIndex col) const
void DeleteRows(RowIndex num_rows, const RowPermutation &permutation)
ColIndex AppendEmptyColumn()
RowIndex num_rows() const
void PopulateFromProduct(const SparseMatrix &a, const SparseMatrix &b)
bool AppendRowsFromSparseMatrix(const SparseMatrix &matrix)
void DeleteColumns(const DenseBooleanRow &columns_to_delete)
void PopulateFromSparseMatrix(const SparseMatrix &matrix)
void ApplyRowPermutation(const RowPermutation &row_perm)
void PopulateFromZero(RowIndex num_rows, ColIndex num_cols)
EntryIndex num_entries() const
bool Equals(const SparseMatrix &a, Fractional tolerance) const
void AssignToZero(IntType size)
void resize(IntType size)
ColIndex GetFirstNonIdentityColumn() const
ColIndex num_cols() const
Fractional GetDiagonalCoefficient(ColIndex col) const
RowIndex num_rows() const
int64_t NumFpOperationsInLastPermutedLowerSparseSolve() const
bool ColumnIsDiagonalOnly(ColIndex col) const
EntryIndex num_entries() const
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Permutation< ColIndex > ColumnPermutation
ColIndex RowToColIndex(RowIndex row)
std::vector< RowIndex > RowIndexVector
Permutation< RowIndex > RowPermutation
IntegerValue ComputeInfinityNorm(const LinearConstraint &constraint)
Collection of objects used to extend the Constraint Solver library.
static int input(yyscan_t yyscanner)
#define RETURN_IF_NULL(x)
void Add(Index index, Fractional value)