29 #ifndef OR_TOOLS_LP_DATA_SPARSE_H_ 30 #define OR_TOOLS_LP_DATA_SPARSE_H_ 45 class 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(); }
275 extern template void SparseMatrix::PopulateFromTranspose<SparseMatrix>(
276 const SparseMatrix&
input);
277 extern template void SparseMatrix::PopulateFromPermutedMatrix<SparseMatrix>(
281 SparseMatrix::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];
375 return ColumnView(starts_[
col + 1] - start, rows_.data() + start.value(),
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];
609 void LowerSolveStartingAt(ColIndex start,
DenseColumn* rhs)
const;
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>
749 void LowerSolveStartingAtInternal(ColIndex start,
DenseColumn* rhs)
const;
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_;
854 #endif // OR_TOOLS_LP_DATA_SPARSE_H_ void AppendUnitVector(RowIndex row, Fractional value)
ColIndex RowToColIndex(RowIndex row)
::util::IntegerRange< EntryIndex > Column(ColIndex col) const
Fractional ComputeOneNorm() const
Fractional ComputeOneNorm() const
void Add(Index index, Fractional value)
void PopulateFromBasis(const MatrixView &matrix, const RowToColMapping &basis)
ColIndex num_cols() const
Fractional ComputeInfinityNorm() const
RowIndex EntryRow(EntryIndex i) const
void ApplyRowPermutation(const RowPermutation &row_perm)
CompactSparseMatrixView(const CompactSparseMatrix *compact_matrix, const RowToColMapping *basis)
void PopulateFromZero(RowIndex num_rows, ColIndex num_cols)
void PopulateFromPermutedMatrix(const Matrix &a, const RowPermutation &row_perm, const ColumnPermutation &inverse_col_perm)
Fractional ComputeInfinityNorm() const
EntryIndex ColumnNumEntries(ColIndex col) const
void PopulateFromIdentity(ColIndex num_cols)
StrictITIVector< EntryIndex, Fractional > coefficients_
RowIndex num_rows() const
void PopulateFromSparseMatrix(const SparseMatrix &matrix)
RowIndex num_rows() const
void Swap(SparseMatrix *matrix)
const ColumnView column(ColIndex col) const
Permutation< ColIndex > ColumnPermutation
void PopulateFromProduct(const SparseMatrix &a, const SparseMatrix &b)
ColumnView column(ColIndex col) const
void ColumnCopyToDenseColumn(ColIndex col, DenseColumn *dense_column) const
void PopulateFromMatrix(const SparseMatrix &matrix)
RowIndex num_rows() const
RowIndex num_rows() const
void SetNumRows(RowIndex num_rows)
IntegerValue ComputeInfinityNorm(const LinearConstraint &constraint)
void PopulateFromMatrixPair(const SparseMatrix &matrix_a, const SparseMatrix &matrix_b)
ColIndex num_cols() const
bool ColumnIsDiagonalOnly(ColIndex col) const
void AssignToZero(IntType size)
Fractional EntryCoefficient(EntryIndex i) const
void PopulateFromTranspose(const Matrix &input)
Fractional ColumnScalarProduct(ColIndex col, const DenseRow &vector) const
void ColumnAddMultipleToSparseScatteredColumn(ColIndex col, Fractional multiplier, ScatteredColumn *column) const
static int input(yyscan_t yyscanner)
void ColumnCopyToClearedDenseColumn(ColIndex col, DenseColumn *dense_column) const
const SparseColumn & column(ColIndex col) const
StrictITIVector< ColIndex, EntryIndex > starts_
ColIndex num_cols() const
ColIndex GetFirstNonIdentityColumn() const
std::vector< RowIndex > RowIndexVector
void resize(IntType size)
Fractional GetDiagonalCoefficient(ColIndex col) const
bool CheckNoDuplicates() const
void ComputeMinAndMaxMagnitudes(Fractional *min_magnitude, Fractional *max_magnitude) const
void DeleteColumns(const DenseBooleanRow &columns_to_delete)
bool ColumnIsEmpty(ColIndex col) const
#define DCHECK_EQ(val1, val2)
const SparseColumn & column(ColIndex col) const
SparseColumn * mutable_column(ColIndex col)
MatrixView(const SparseMatrix &matrix)
Fractional LookUpValue(RowIndex row, ColIndex col) const
#define RETURN_IF_NULL(x)
int64_t NumFpOperationsInLastPermutedLowerSparseSolve() const
EntryIndex num_entries() const
Collection of objects used to extend the Constraint Solver library.
void ColumnCopyToClearedDenseColumnWithNonZeros(ColIndex col, DenseColumn *dense_column, RowIndexVector *non_zeros) const
bool Equals(const SparseMatrix &a, Fractional tolerance) const
RowIndex num_rows() const
EntryIndex num_entries() const
Permutation< RowIndex > RowPermutation
bool AppendRowsFromSparseMatrix(const SparseMatrix &matrix)
ColIndex num_cols() const
ColIndex num_cols() const
void DeleteRows(RowIndex num_rows, const RowPermutation &permutation)
ColIndex AppendEmptyColumn()
EntryIndex num_entries() const
CompactSparseMatrix(const SparseMatrix &matrix)
void ColumnAddMultipleToDenseColumn(ColIndex col, Fractional multiplier, DenseColumn *dense_column) const
CompactSparseMatrixView(const CompactSparseMatrix *compact_matrix, const std::vector< ColIndex > *columns)
void PopulateFromLinearCombination(Fractional alpha, const SparseMatrix &a, Fractional beta, const SparseMatrix &b)
StrictITIVector< EntryIndex, RowIndex > rows_
#define DCHECK_LT(val1, val2)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
EntryIndex num_entries() const