Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SparseMatrix.h
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cstdint>
5#include <iosfwd>
6#include <iterator>
7#include <vector>
8
9#include <boost/functional/hash.hpp>
10#include <boost/optional.hpp>
11#include <boost/range/irange.hpp>
12
16
20
21// Forward declaration for adapter classes.
22namespace storm {
23namespace adapters {
24template<typename ValueType>
25class GmmxxAdapter;
26class EigenAdapter;
27class StormAdapter;
28} // namespace adapters
29} // namespace storm
30
31namespace storm {
32namespace storage {
33
34// Forward declare matrix class.
35template<typename T>
36class SparseMatrix;
37
39
40template<typename IndexType, typename ValueType>
42 public:
43 typedef IndexType index_type;
44 typedef ValueType value_type;
45
52 MatrixEntry(index_type column, value_type value);
53
59 MatrixEntry(std::pair<index_type, value_type>&& pair);
60
61 MatrixEntry() = default;
62 MatrixEntry(MatrixEntry const& other) = default;
63 MatrixEntry& operator=(MatrixEntry const& other) = default;
64#ifndef WINDOWS
65 MatrixEntry(MatrixEntry&& other) = default;
66 MatrixEntry& operator=(MatrixEntry&& other) = default;
67#endif
68
74 index_type const& getColumn() const;
75
81 void setColumn(index_type const& column);
82
88 value_type const& getValue() const;
89
95 void setValue(value_type const& value);
96
102 std::pair<index_type, value_type> const& getColumnValuePair() const;
103
109 MatrixEntry operator*(value_type factor) const;
110
111 bool operator==(MatrixEntry const& other) const;
112 bool operator!=(MatrixEntry const& other) const;
113
114 template<typename IndexTypePrime, typename ValueTypePrime>
115 friend std::ostream& operator<<(std::ostream& out, MatrixEntry<IndexTypePrime, ValueTypePrime> const& entry);
116
117 private:
118 // The actual matrix entry.
119 std::pair<index_type, value_type> entry;
120};
121
125template<typename IndexType, typename ValueType>
126std::size_t hash_value(MatrixEntry<IndexType, ValueType> const& matrixEntry) {
127 std::size_t seed = 0;
128 boost::hash_combine(seed, matrixEntry.getColumn());
129 boost::hash_combine(seed, matrixEntry.getValue());
130 return seed;
131}
132
136template<typename ValueType>
138 public:
140 typedef ValueType value_type;
141
157 SparseMatrixBuilder(index_type rows = 0, index_type columns = 0, index_type entries = 0, bool forceDimensions = true, bool hasCustomRowGrouping = false,
158 index_type rowGroups = 0);
159
167
181 void addNextValue(index_type row, index_type column, value_type const& value);
182
189 void newRowGroup(index_type startingRow);
190
191 /*
192 * Finalizes the sparse matrix to indicate that initialization process has been completed and the matrix
193 * may now be used. This must be called after all entries have been added to the matrix via addNextValue.
194 *
195 * @param overriddenRowCount If this is set to a value that is greater than the current number of rows,
196 * this will cause the finalize method to add empty rows at the end of the matrix until the given row count
197 * has been matched. Note that this will *not* override the row count that has been given upon construction
198 * (if any), but will only take effect if the matrix has been created without the number of rows given.
199 * @param overriddenColumnCount If this is set to a value that is greater than the current number of columns,
200 * this will cause the finalize method to set the number of columns to the given value. Note that this will
201 * *not* override the column count that has been given upon construction (if any), but will only take effect
202 * if the matrix has been created without the number of columns given. By construction, the matrix will have
203 * no entries in the columns that have been added this way.
204 * @param overriddenRowGroupCount If this is set to a value that is greater than the current number of row
205 * groups, this will cause the method to set the number of row groups to the given value. Note that this will
206 * *not* override the row group count that has been given upon construction (if any), but will only take
207 * effect if the matrix has been created without the number of row groups given. By construction, the row
208 * groups added this way will be empty.
209 */
210 SparseMatrix<value_type> build(index_type overriddenRowCount = 0, index_type overriddenColumnCount = 0, index_type overriddenRowGroupCount = 0);
211
217 index_type getLastRow() const;
218
225
232
241 void replaceColumns(std::vector<index_type> const& replacements, index_type offset);
242
250 void addDiagonalEntry(index_type row, ValueType const& value);
251
252 private:
253 // A flag indicating whether a row count was set upon construction.
254 bool initialRowCountSet;
255
256 // The row count that was initially set (if any).
257 index_type initialRowCount;
258
259 // A flag indicating whether a column count was set upon construction.
260 bool initialColumnCountSet;
261
262 // The column count that was initially set (if any).
263 index_type initialColumnCount;
264
265 // A flag indicating whether an entry count was set upon construction.
266 bool initialEntryCountSet;
267
268 // The number of entries in the matrix.
269 index_type initialEntryCount;
270
271 // A flag indicating whether the initially given dimensions are to be enforced on the resulting matrix.
272 bool forceInitialDimensions;
273
274 // A flag indicating whether the builder is to construct a custom row grouping for the matrix.
275 bool hasCustomRowGrouping;
276
277 // A flag indicating whether the number of row groups was set upon construction.
278 bool initialRowGroupCountSet;
279
280 // The number of row groups in the matrix.
281 index_type initialRowGroupCount;
282
283 // The vector that stores the row-group indices (if they are non-trivial).
284 boost::optional<std::vector<index_type>> rowGroupIndices;
285
286 // The storage for the columns and values of all entries in the matrix.
287 std::vector<MatrixEntry<index_type, value_type>> columnsAndValues;
288
289 // A vector containing the indices at which each given row begins. This index is to be interpreted as an
290 // index in the valueStorage and the columnIndications vectors. Put differently, the values of the entries
291 // in row i are valueStorage[rowIndications[i]] to valueStorage[rowIndications[i + 1]] where the last
292 // entry is not included anymore.
293 std::vector<index_type> rowIndications;
294
295 // Stores the current number of entries in the matrix. This is used for inserting an entry into a matrix
296 // with preallocated storage.
297 index_type currentEntryCount;
298
299 // Stores the row of the last entry in the matrix. This is used for correctly inserting an entry into a
300 // matrix.
301 index_type lastRow;
302
303 // Stores the column of the currently last entry in the matrix. This is used for correctly inserting an
304 // entry into a matrix.
305 index_type lastColumn;
306
307 // Stores the highest column at which an entry was inserted into the matrix.
308 index_type highestColumn;
309
310 // Stores the currently active row group. This is used for correctly constructing the row grouping of the
311 // matrix.
312 index_type currentRowGroupCount;
313
314 boost::optional<ValueType> pendingDiagonalEntry;
315};
316
331template<typename ValueType>
333 public:
334 // Declare adapter classes as friends to use internal data.
335 friend class storm::adapters::GmmxxAdapter<ValueType>;
338 friend class SparseMatrixBuilder<ValueType>;
339
341 typedef ValueType value_type;
342 typedef typename std::vector<MatrixEntry<index_type, value_type>>::iterator iterator;
343 typedef typename std::vector<MatrixEntry<index_type, value_type>>::const_iterator const_iterator;
344
348 class rows {
349 public:
357 rows(iterator begin, index_type entryCount);
358
364 iterator begin();
365
371 iterator end();
372
379
380 private:
381 // The pointer to the columnd and value of the first entry.
382 iterator beginIterator;
383
384 // The number of non-zero entries in the rows.
385 index_type entryCount;
386 };
387
392 public:
401
407 const_iterator begin() const;
408
414 const_iterator end() const;
415
422
423 private:
424 // The pointer to the column and value of the first entry.
425 const_iterator beginIterator;
426
427 // The number of non-zero entries in the rows.
428 index_type entryCount;
429 };
430
437
441 SparseMatrix();
442
449
457 SparseMatrix(SparseMatrix<value_type> const& other, bool insertDiagonalElements);
458
465
474 SparseMatrix(index_type columnCount, std::vector<index_type> const& rowIndications,
475 std::vector<MatrixEntry<index_type, value_type>> const& columnsAndValues, boost::optional<std::vector<index_type>> const& rowGroupIndices);
476
485 SparseMatrix(index_type columnCount, std::vector<index_type>&& rowIndications, std::vector<MatrixEntry<index_type, value_type>>&& columnsAndValues,
486 boost::optional<std::vector<index_type>>&& rowGroupIndices);
487
494
501
508 bool operator==(SparseMatrix<value_type> const& other) const;
509
515 index_type getRowCount() const;
516
523
530
537
546
550 void updateNonzeroEntryCount() const;
551
555 void updateDimensions() const;
556
562 void updateNonzeroEntryCount(std::make_signed<index_type>::type difference);
563
570
578
583
587 index_type getNumRowsInRowGroups(storm::storage::BitVector const& groupConstraint) const;
588
594 std::vector<index_type> const& getRowGroupIndices() const;
595
599 boost::integer_range<index_type> getRowGroupIndices(index_type group) const;
600
606 std::vector<index_type> swapRowGroupIndices(std::vector<index_type>&& newRowGrouping);
607
614 void setRowGroupIndices(std::vector<index_type> const& newRowGroupIndices);
615
621 bool hasTrivialRowGrouping() const;
622
628
637
647 storm::storage::BitVector getRowFilter(storm::storage::BitVector const& groupConstraint, storm::storage::BitVector const& columnConstraints) const;
648
657 storm::storage::BitVector getRowGroupFilter(storm::storage::BitVector const& rowConstraint, bool setIfForAllRowsInGroup) const;
658
666 void makeRowsAbsorbing(storm::storage::BitVector const& rows, bool dropZeroEntries = false);
667
675 void makeRowGroupsAbsorbing(storm::storage::BitVector const& rowGroupConstraint, bool dropZeroEntries = false);
676
686 void makeRowDirac(index_type row, index_type column, bool dropZeroEntries = false);
687
693 std::vector<ValueType> getRowSumVector() const;
694
703
713 std::vector<value_type> getConstrainedRowSumVector(storm::storage::BitVector const& rowConstraint, storm::storage::BitVector const& columnConstraint) const;
714
724 std::vector<value_type> getConstrainedRowGroupSumVector(storm::storage::BitVector const& rowGroupConstraint,
725 storm::storage::BitVector const& columnConstraint) const;
726
742 SparseMatrix getSubmatrix(bool useGroups, storm::storage::BitVector const& rowConstraint, storm::storage::BitVector const& columnConstraint,
743 bool insertDiagonalEntries = false, storm::storage::BitVector const& makeZeroColumns = storm::storage::BitVector()) const;
744
755 SparseMatrix restrictRows(storm::storage::BitVector const& rowsToKeep, bool allowEmptyRowGroups = false) const;
756
763 SparseMatrix permuteRows(std::vector<index_type> const& inversePermutation) const;
764
772 SparseMatrix permuteRowGroupsAndColumns(std::vector<index_type> const& inverseRowGroupPermutation, std::vector<index_type> const& columnPermutation) const;
773
782
786 void dropZeroEntries();
787
794 bool compareRows(index_type i1, index_type i2) const;
795
800
806 void swapRows(index_type const& row1, index_type const& row2);
807
815 SparseMatrix selectRowsFromRowGroups(std::vector<index_type> const& rowGroupToRowIndexMapping, bool insertDiagonalEntries = true) const;
816
826 SparseMatrix selectRowsFromRowIndexSequence(std::vector<index_type> const& rowIndexSequence, bool insertDiagonalEntries = true) const;
827
836 storm::storage::SparseMatrix<value_type> transpose(bool joinGroups = false, bool keepZeros = false) const;
837
846 SparseMatrix<ValueType> transposeSelectedRowsFromRowGroups(std::vector<uint64_t> const& rowGroupChoices, bool keepZeros = false) const;
847
852
857 void invertDiagonal();
858
863
869 void deleteDiagonalEntries(bool dropZeroEntries = false);
870
876 std::pair<storm::storage::SparseMatrix<value_type>, std::vector<value_type>> getJacobiDecomposition() const;
877
887 template<typename OtherValueType, typename ResultValueType = OtherValueType>
888 ResultValueType getPointwiseProductRowSum(storm::storage::SparseMatrix<OtherValueType> const& otherMatrix, index_type const& row) const;
889
900 template<typename OtherValueType, typename ResultValueType = OtherValueType>
901 std::vector<ResultValueType> getPointwiseProductRowSumVector(storm::storage::SparseMatrix<OtherValueType> const& otherMatrix) const;
902
911 void multiplyWithVector(std::vector<value_type> const& vector, std::vector<value_type>& result, std::vector<value_type> const* summand = nullptr) const;
912
913 void multiplyWithVectorForward(std::vector<value_type> const& vector, std::vector<value_type>& result,
914 std::vector<value_type> const* summand = nullptr) const;
915 void multiplyWithVectorBackward(std::vector<value_type> const& vector, std::vector<value_type>& result,
916 std::vector<value_type> const* summand = nullptr) const;
917#ifdef STORM_HAVE_INTELTBB
918 void multiplyWithVectorParallel(std::vector<value_type> const& vector, std::vector<value_type>& result,
919 std::vector<value_type> const* summand = nullptr) const;
920#endif
921
936 void multiplyAndReduce(storm::solver::OptimizationDirection const& dir, std::vector<uint64_t> const& rowGroupIndices, std::vector<ValueType> const& vector,
937 std::vector<ValueType> const* summand, std::vector<ValueType>& result, std::vector<uint64_t>* choices) const;
938
939 void multiplyAndReduceForward(storm::solver::OptimizationDirection const& dir, std::vector<uint64_t> const& rowGroupIndices,
940 std::vector<ValueType> const& vector, std::vector<ValueType> const* b, std::vector<ValueType>& result,
941 std::vector<uint64_t>* choices) const;
942 template<typename Compare>
943 void multiplyAndReduceForward(std::vector<uint64_t> const& rowGroupIndices, std::vector<ValueType> const& vector, std::vector<ValueType> const* summand,
944 std::vector<ValueType>& result, std::vector<uint64_t>* choices) const;
945
946 void multiplyAndReduceBackward(storm::solver::OptimizationDirection const& dir, std::vector<uint64_t> const& rowGroupIndices,
947 std::vector<ValueType> const& vector, std::vector<ValueType> const* b, std::vector<ValueType>& result,
948 std::vector<uint64_t>* choices) const;
949 template<typename Compare>
950 void multiplyAndReduceBackward(std::vector<uint64_t> const& rowGroupIndices, std::vector<ValueType> const& vector, std::vector<ValueType> const* b,
951 std::vector<ValueType>& result, std::vector<uint64_t>* choices) const;
952#ifdef STORM_HAVE_INTELTBB
953 void multiplyAndReduceParallel(storm::solver::OptimizationDirection const& dir, std::vector<uint64_t> const& rowGroupIndices,
954 std::vector<ValueType> const& vector, std::vector<ValueType> const* b, std::vector<ValueType>& result,
955 std::vector<uint64_t>* choices) const;
956 template<typename Compare>
957 void multiplyAndReduceParallel(std::vector<uint64_t> const& rowGroupIndices, std::vector<ValueType> const& vector, std::vector<ValueType> const* b,
958 std::vector<ValueType>& result, std::vector<uint64_t>* choices) const;
959#endif
960
968 value_type multiplyRowWithVector(index_type row, std::vector<value_type> const& vector) const;
969
979 void multiplyVectorWithMatrix(std::vector<value_type> const& vector, std::vector<value_type>& result) const;
980
986 void scaleRowsInPlace(std::vector<value_type> const& factors);
987
993 void divideRowsInPlace(std::vector<value_type> const& divisors);
994
1002 void performSuccessiveOverRelaxationStep(ValueType omega, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
1003
1013 void performWalkerChaeStep(std::vector<ValueType> const& x, std::vector<ValueType> const& columnSums, std::vector<ValueType> const& b,
1014 std::vector<ValueType> const& ax, std::vector<ValueType>& result) const;
1015
1022 value_type getRowSum(index_type row) const;
1023
1028
1033
1037 bool isProbabilistic() const;
1038
1042 bool hasOnlyPositiveEntries() const;
1043
1051 template<typename OtherValueType>
1052 bool isSubmatrixOf(SparseMatrix<OtherValueType> const& matrix) const;
1053
1054 // Returns true if the matrix is the identity matrix
1055 bool isIdentityMatrix() const;
1056
1057 template<typename TPrime>
1058 friend std::ostream& operator<<(std::ostream& out, SparseMatrix<TPrime> const& matrix);
1059
1063 std::string getDimensionsAsString() const;
1064
1071 void printAsMatlabMatrix(std::ostream& out) const;
1072
1078 std::size_t hash() const;
1079
1087 const_rows getRows(index_type startRow, index_type endRow) const;
1088
1096 rows getRows(index_type startRow, index_type endRow);
1097
1104 const_rows getRow(index_type row) const;
1105
1112 rows getRow(index_type row);
1113
1120 const_rows getRow(index_type rowGroup, index_type offset) const;
1121
1128 rows getRow(index_type rowGroup, index_type offset);
1129
1136 const_rows getRowGroup(index_type rowGroup) const;
1137
1144 rows getRowGroup(index_type rowGroup);
1145
1152 const_iterator begin(index_type row) const;
1153
1161
1167 const_iterator begin() const;
1168
1174 iterator begin();
1175
1182 const_iterator end(index_type row) const;
1183
1190 iterator end(index_type row);
1191
1197 const_iterator end() const;
1198
1204 iterator end();
1205
1209 template<typename NewValueType>
1211 std::vector<MatrixEntry<SparseMatrix::index_type, NewValueType>> newColumnsAndValues;
1212 std::vector<SparseMatrix::index_type> newRowIndications(rowIndications);
1213 boost::optional<std::vector<SparseMatrix::index_type>> newRowGroupIndices(rowGroupIndices);
1214
1215 newColumnsAndValues.resize(columnsAndValues.size());
1216 std::transform(
1217 columnsAndValues.begin(), columnsAndValues.end(), newColumnsAndValues.begin(), [](MatrixEntry<SparseMatrix::index_type, ValueType> const& a) {
1218 return MatrixEntry<SparseMatrix::index_type, NewValueType>(a.getColumn(), storm::utility::convertNumber<NewValueType, ValueType>(a.getValue()));
1219 });
1220
1221 return SparseMatrix<NewValueType>(columnCount, std::move(newRowIndications), std::move(newColumnsAndValues), std::move(newRowGroupIndices));
1222 }
1223
1224 private:
1237 SparseMatrix getSubmatrix(storm::storage::BitVector const& rowGroupConstraint, storm::storage::BitVector const& columnConstraint,
1238 std::vector<index_type> const& rowGroupIndices, bool insertDiagonalEntries = false,
1239 storm::storage::BitVector const& makeZeroColumns = storm::storage::BitVector()) const;
1240
1241 // The number of rows of the matrix.
1242 index_type rowCount;
1243
1244 // The number of columns of the matrix.
1245 mutable index_type columnCount;
1246
1247 // The number of entries in the matrix.
1248 index_type entryCount;
1249
1250 // The number of nonzero entries in the matrix.
1251 mutable index_type nonzeroEntryCount;
1252
1253 // The storage for the columns and values of all entries in the matrix.
1254 std::vector<MatrixEntry<index_type, value_type>> columnsAndValues;
1255
1256 // A vector containing the indices at which each given row begins. This index is to be interpreted as an
1257 // index in the valueStorage and the columnIndications vectors. Put differently, the values of the entries
1258 // in row i are valueStorage[rowIndications[i]] to valueStorage[rowIndications[i + 1]] where the last
1259 // entry is not included anymore.
1260 std::vector<index_type> rowIndications;
1261
1262 // A flag indicating whether the matrix has a trivial row grouping. Note that this may be true and yet
1263 // there may be row group indices, because they were requested from the outside.
1264 bool trivialRowGrouping;
1265
1266 // A vector indicating the row groups of the matrix. This needs to be mutible in case we create it on-the-fly.
1267 mutable boost::optional<std::vector<index_type>> rowGroupIndices;
1268};
1269
1270} // namespace storage
1271} // namespace storm
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:18
MatrixEntry operator*(value_type factor) const
Multiplies the entry with the given factor and returns the result.
value_type const & getValue() const
Retrieves the value of the matrix entry.
std::pair< index_type, value_type > const & getColumnValuePair() const
Retrieves a pair of column and value that characterizes this entry.
MatrixEntry(MatrixEntry &&other)=default
void setColumn(index_type const &column)
Sets the column of the current entry.
MatrixEntry()=default
MatrixEntry(MatrixEntry const &other)=default
index_type const & getColumn() const
Retrieves the column of the matrix entry.
bool operator!=(MatrixEntry const &other) const
void setValue(value_type const &value)
Sets the value of the entry in the matrix.
MatrixEntry & operator=(MatrixEntry &&other)=default
MatrixEntry & operator=(MatrixEntry const &other)=default
ValueType value_type
IndexType index_type
friend std::ostream & operator<<(std::ostream &out, MatrixEntry< IndexTypePrime, ValueTypePrime > const &entry)
bool operator==(MatrixEntry const &other) const
This class represents a number of consecutive rows of the matrix.
const_iterator end() const
Retrieves an iterator that points past the last entry of the rows.
index_type getNumberOfEntries() const
Retrieves the number of entries in the rows.
const_iterator begin() const
Retrieves an iterator that points to the beginning of the rows.
This class represents a number of consecutive rows of the matrix.
iterator end()
Retrieves an iterator that points past the last entry of the rows.
iterator begin()
Retrieves an iterator that points to the beginning of the rows.
index_type getNumberOfEntries() const
Retrieves the number of entries in the rows.
A class that can be used to build a sparse matrix by adding value by value.
index_type getCurrentRowGroupCount() const
Retrieves the current row group count.
index_type getLastRow() const
Retrieves the most recently used row.
void addNextValue(index_type row, index_type column, value_type const &value)
Sets the matrix entry at the given row and column to the given value.
void replaceColumns(std::vector< index_type > const &replacements, index_type offset)
Replaces all columns with id > offset according to replacements.
void newRowGroup(index_type startingRow)
Starts a new row group in the matrix.
index_type getLastColumn() const
Retrieves the most recently used row.
void addDiagonalEntry(index_type row, ValueType const &value)
Makes sure that a diagonal entry will be inserted at the given row.
SparseMatrix< value_type > build(index_type overriddenRowCount=0, index_type overriddenColumnCount=0, index_type overriddenRowGroupCount=0)
A class that holds a possibly non-square matrix in the compressed row storage format.
void divideRowsInPlace(std::vector< value_type > const &divisors)
Divides each row of the matrix, i.e., divides each element in row i with divisors[i].
void convertToEquationSystem()
Transforms the matrix into an equation system.
SparseMatrix()
Constructs an empty sparse matrix.
void swapRows(index_type const &row1, index_type const &row2)
Swaps the two rows.
bool operator==(SparseMatrix< value_type > const &other) const
Determines whether the current and the given matrix are semantically equal.
const_rows getRow(index_type row) const
Returns an object representing the given row.
index_type getSizeOfLargestRowGroup() const
Returns the size of the largest row group of the matrix.
SparseMatrix selectRowsFromRowGroups(std::vector< index_type > const &rowGroupToRowIndexMapping, bool insertDiagonalEntries=true) const
Selects exactly one row from each row group of this matrix and returns the resulting matrix.
void multiplyWithVectorForward(std::vector< value_type > const &vector, std::vector< value_type > &result, std::vector< value_type > const *summand=nullptr) const
index_type getEntryCount() const
Returns the number of entries in the matrix.
const_rows getRows(index_type startRow, index_type endRow) const
Returns an object representing the consecutive rows given by the parameters.
index_type getNonconstantEntryCount() const
Returns the number of non-constant entries.
void multiplyVectorWithMatrix(std::vector< value_type > const &vector, std::vector< value_type > &result) const
Multiplies the vector to the matrix from the left and writes the result to the given result vector.
void multiplyAndReduceBackward(storm::solver::OptimizationDirection const &dir, std::vector< uint64_t > const &rowGroupIndices, std::vector< ValueType > const &vector, std::vector< ValueType > const *b, std::vector< ValueType > &result, std::vector< uint64_t > *choices) const
index_type getNumRowsInRowGroups(storm::storage::BitVector const &groupConstraint) const
Returns the total number of rows that are in one of the specified row groups.
void makeRowsAbsorbing(storm::storage::BitVector const &rows, bool dropZeroEntries=false)
This function makes the given rows absorbing.
std::vector< ResultValueType > getPointwiseProductRowSumVector(storm::storage::SparseMatrix< OtherValueType > const &otherMatrix) const
Performs a pointwise matrix multiplication of the matrix with the given matrix and returns a vector c...
void multiplyWithVector(std::vector< value_type > const &vector, std::vector< value_type > &result, std::vector< value_type > const *summand=nullptr) const
Multiplies the matrix with the given vector and writes the result to the given result vector.
void updateNonzeroEntryCount() const
Recompute the nonzero entry count.
bool isProbabilistic() const
Checks for each row whether it sums to one.
void multiplyWithVectorBackward(std::vector< value_type > const &vector, std::vector< value_type > &result, std::vector< value_type > const *summand=nullptr) const
SparseMatrix getSubmatrix(bool useGroups, storm::storage::BitVector const &rowConstraint, storm::storage::BitVector const &columnConstraint, bool insertDiagonalEntries=false, storm::storage::BitVector const &makeZeroColumns=storm::storage::BitVector()) const
Creates a submatrix of the current matrix by dropping all rows and columns whose bits are not set to ...
void performWalkerChaeStep(std::vector< ValueType > const &x, std::vector< ValueType > const &columnSums, std::vector< ValueType > const &b, std::vector< ValueType > const &ax, std::vector< ValueType > &result) const
Performs one step of the Walker-Chae technique.
void updateDimensions() const
Recomputes the number of columns and the number of non-zero entries.
void printAsMatlabMatrix(std::ostream &out) const
Prints the matrix in a dense format, as also used by e.g.
void performSuccessiveOverRelaxationStep(ValueType omega, std::vector< ValueType > &x, std::vector< ValueType > const &b) const
Performs one step of the successive over-relaxation technique.
std::vector< value_type > getConstrainedRowSumVector(storm::storage::BitVector const &rowConstraint, storm::storage::BitVector const &columnConstraint) const
Computes a vector whose i-th entry is the sum of the entries in the i-th selected row where only thos...
BitVector duplicateRowsInRowgroups() const
Finds duplicate rows in a rowgroup.
bool compareRows(index_type i1, index_type i2) const
Compares two rows.
const_rows getRowGroup(index_type rowGroup) const
Returns an object representing the given row group.
SparseMatrix permuteRows(std::vector< index_type > const &inversePermutation) const
Permute rows of the matrix according to the vector.
void setRowGroupIndices(std::vector< index_type > const &newRowGroupIndices)
Sets the row grouping to the given one.
void negateAllNonDiagonalEntries()
Negates (w.r.t.
const_iterator begin() const
Retrieves an iterator that points to the beginning of the first row of the matrix.
std::vector< index_type > swapRowGroupIndices(std::vector< index_type > &&newRowGrouping)
Swaps the grouping of rows of this matrix.
SparseMatrix restrictRows(storm::storage::BitVector const &rowsToKeep, bool allowEmptyRowGroups=false) const
Restrict rows in grouped rows matrix.
std::vector< ValueType > getRowSumVector() const
Sums the entries in all rows.
friend class storm::adapters::StormAdapter
SparseMatrix< NewValueType > toValueType() const
Returns a copy of the matrix with the chosen internal data type.
value_type multiplyRowWithVector(index_type row, std::vector< value_type > const &vector) const
Multiplies a single row of the matrix with the given vector and returns the result.
MatrixStatus
An enum representing the internal state of the matrix.
SparseMatrix< ValueType > transposeSelectedRowsFromRowGroups(std::vector< uint64_t > const &rowGroupChoices, bool keepZeros=false) const
Transposes the matrix w.r.t.
void multiplyAndReduceForward(storm::solver::OptimizationDirection const &dir, std::vector< uint64_t > const &rowGroupIndices, std::vector< ValueType > const &vector, std::vector< ValueType > const *b, std::vector< ValueType > &result, std::vector< uint64_t > *choices) const
value_type getRowSum(index_type row) const
Computes the sum of the entries in a given row.
SparseMatrix permuteRowGroupsAndColumns(std::vector< index_type > const &inverseRowGroupPermutation, std::vector< index_type > const &columnPermutation) const
Permutes row groups and columns of the matrix according to the given permutations.
void multiplyAndReduce(storm::solver::OptimizationDirection const &dir, std::vector< uint64_t > const &rowGroupIndices, std::vector< ValueType > const &vector, std::vector< ValueType > const *summand, std::vector< ValueType > &result, std::vector< uint64_t > *choices) const
Multiplies the matrix with the given vector, reduces it according to the given direction and and writ...
index_type getRowGroupCount() const
Returns the number of row groups in the matrix.
void dropZeroEntries()
Removes all zero entries from this.
bool isSubmatrixOf(SparseMatrix< OtherValueType > const &matrix) const
Checks if the current matrix is a submatrix of the given matrix, where a matrix A is called a submatr...
ResultValueType getPointwiseProductRowSum(storm::storage::SparseMatrix< OtherValueType > const &otherMatrix, index_type const &row) const
Performs a pointwise multiplication of the entries in the given row of this matrix and the entries of...
SparseMatrix< value_type > & operator=(SparseMatrix< value_type > const &other)
Assigns the contents of the given matrix to the current one by deep-copying its contents.
void makeRowGroupsAbsorbing(storm::storage::BitVector const &rowGroupConstraint, bool dropZeroEntries=false)
This function makes the groups of rows given by the bit vector absorbing.
std::string getDimensionsAsString() const
Returns a string describing the dimensions of the matrix.
index_type getColumnCount() const
Returns the number of columns of the matrix.
std::pair< storm::storage::SparseMatrix< value_type >, std::vector< value_type > > getJacobiDecomposition() const
Calculates the Jacobi decomposition of this sparse matrix.
void makeRowDirac(index_type row, index_type column, bool dropZeroEntries=false)
This function makes the given row Dirac.
std::vector< MatrixEntry< index_type, value_type > >::const_iterator const_iterator
value_type getConstrainedRowSum(index_type row, storm::storage::BitVector const &columns) const
Sums the entries in the given row and columns.
void deleteDiagonalEntries(bool dropZeroEntries=false)
Sets all diagonal elements to zero.
bool hasTrivialRowGrouping() const
Retrieves whether the matrix has a trivial row grouping.
void invertDiagonal()
Inverts all entries on the diagonal, i.e.
storm::storage::BitVector getRowGroupFilter(storm::storage::BitVector const &rowConstraint, bool setIfForAllRowsInGroup) const
Returns the indices of all row groups selected by the row constraints.
void makeRowGroupingTrivial()
Makes the row grouping of this matrix trivial.
SparseMatrix selectRowsFromRowIndexSequence(std::vector< index_type > const &rowIndexSequence, bool insertDiagonalEntries=true) const
Selects the rows that are given by the sequence of row indices, allowing to select rows arbitrarily o...
std::size_t hash() const
Calculates a hash value over all values contained in the matrix.
std::vector< index_type > const & getRowGroupIndices() const
Returns the grouping of rows of this matrix.
std::vector< MatrixEntry< index_type, value_type > >::iterator iterator
index_type getRowGroupSize(index_type group) const
Returns the size of the given row group.
std::vector< value_type > getConstrainedRowGroupSumVector(storm::storage::BitVector const &rowGroupConstraint, storm::storage::BitVector const &columnConstraint) const
Computes a vector whose entries represent the sums of selected columns for all rows in selected row g...
storm::storage::SparseMatrix< value_type > transpose(bool joinGroups=false, bool keepZeros=false) const
Transposes the matrix.
bool hasOnlyPositiveEntries() const
Checks whether each present entry is strictly positive (omitted entries are not considered).
friend std::ostream & operator<<(std::ostream &out, SparseMatrix< TPrime > const &matrix)
index_type getRowCount() const
Returns the number of rows of the matrix.
SparseMatrixIndexType index_type
index_type getNonzeroEntryCount() const
Returns the cached number of nonzero entries in the matrix.
const_iterator end() const
Retrieves an iterator that points past the end of the last row of the matrix.
index_type getNonconstantRowGroupCount() const
Returns the number of rowGroups that contain a non-constant value.
void scaleRowsInPlace(std::vector< value_type > const &factors)
Scales each row of the matrix, i.e., multiplies each element in row i with factors[i].
index_type getRowGroupEntryCount(index_type const group) const
Returns the number of entries in the given row group of the matrix.
storm::storage::BitVector getRowFilter(storm::storage::BitVector const &groupConstraint) const
Returns a bitvector representing the set of rows, with all indices set that correspond to one of the ...
SparseMatrix filterEntries(storm::storage::BitVector const &rowFilter) const
Returns a copy of this matrix that only considers entries in the selected rows.
std::size_t hash_value(MatrixEntry< IndexType, ValueType > const &matrixEntry)
Computes the hash value of a matrix entry.
storm::storage::sparse::state_type SparseMatrixIndexType
LabParser.cpp.
Definition cli.cpp:18