1#include "storm-config.h"
11TEST(SparseMatrixBuilder, CreationEmpty) {
14 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
21TEST(SparseMatrixBuilder, CreationWithDimensions) {
30 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
37TEST(SparseMatrixBuilder, CreationWithoutNumberOfEntries) {
46 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
53TEST(SparseMatrixBuilder, CreationWithNumberOfRows) {
62 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
69TEST(SparseMatrixBuilder, CreationWithoutDimensions) {
78 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
85TEST(SparseMatrixBuilder, AddNextValue) {
100 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 2, 1.2));
101 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 4, 0.5));
105 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 1, 1.0));
106 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 2, 1.2));
107 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(2, 4, 0.5));
108 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(3, 1, 0.2));
113 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 1, 1.0));
114 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 2, 1.2));
115 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 0, 0.5));
116 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 1, 0.7));
117 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 3, 0.2));
118 ASSERT_NO_THROW(matrixBuilder1.
build());
121 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
122 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
123 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
124 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
128 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 1, 1.0));
129 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 2, 1.2));
130 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
131 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 0.7));
132 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 3, 0.2));
134 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
140 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 1, 1.0));
141 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 2, 1.2));
142 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 0, 0.5));
143 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 1, 0.7));
144 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 3, 0.2));
146 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build(4));
152 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 1, 1.0));
153 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 2, 1.2));
154 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 0, 0.5));
155 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 1, 0.7));
156 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 3, 0.2));
158 ASSERT_NO_THROW(matrix5 = matrixBuilder5.
build(0, 6));
164TEST(SparseMatrix, DiagonalEntries) {
169 for (uint64_t i = 0; i < 4; ++i) {
174 ASSERT_NO_THROW(builderCmp.
addNextValue(i, 2, 100.0 + i));
176 ASSERT_NO_THROW(builderCmp.
addNextValue(i, 2, 100.0 + i));
180 auto matrix = builder.
build();
181 auto matrixCmp = builderCmp.
build();
182 EXPECT_EQ(matrix, matrixCmp);
188 for (uint64_t i = 0; i < 4; ++i) {
189 uint64_t row = 3 * i;
192 for (; row < 3 * (i + 1); ++row) {
194 ASSERT_NO_THROW(builder.
addNextValue(row, 2, 100 + row));
197 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
199 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
204 auto matrix = builder.
build();
205 auto matrixCmp = builderCmp.
build();
206 EXPECT_EQ(matrix, matrixCmp);
212 for (uint64_t i = 0; i < 4; ++i) {
213 uint64_t row = 3 * i;
216 for (; row < 3 * (i + 1); ++row) {
221 ASSERT_NO_THROW(builder.
addNextValue(row, 2, 100 + row));
224 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
227 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
231 auto matrix = builder.
build();
232 auto matrixCmp = builderCmp.
build();
233 EXPECT_EQ(matrix, matrixCmp);
237TEST(SparseMatrix, CreationWithMovingContents) {
238 std::vector<storm::storage::MatrixEntry<uint_fast64_t, double>> columnsAndValues;
239 columnsAndValues.emplace_back(1, 1.0);
240 columnsAndValues.emplace_back(2, 1.2);
241 columnsAndValues.emplace_back(0, 0.5);
242 columnsAndValues.emplace_back(1, 0.7);
243 columnsAndValues.emplace_back(3, 0.2);
247 ASSERT_EQ(3ul, matrix.getRowCount());
248 ASSERT_EQ(4ul, matrix.getColumnCount());
249 ASSERT_EQ(5ul, matrix.getEntryCount());
250 ASSERT_EQ(3ul, matrix.getRowGroupCount());
253TEST(SparseMatrix, CopyConstruct) {
262 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
266 ASSERT_TRUE(matrix == copy);
269TEST(SparseMatrix, CopyAssign) {
278 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
282 ASSERT_TRUE(matrix == copy);
285TEST(SparseMatrix, MakeAbsorbing) {
293 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
296 absorbingRows.
set(1);
301 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
302 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
306 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
308 ASSERT_TRUE(matrix == matrix2);
311TEST(SparseMatrix, MakeRowGroupAbsorbing) {
326 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
329 absorbingRowGroups.
set(1);
335 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
336 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
337 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
338 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
343 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
344 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
345 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
347 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
349 ASSERT_TRUE(matrix == matrix2);
352TEST(SparseMatrix, rowGroupIndices) {
367 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
370 std::vector<storm::storage::SparseMatrixIndexType> expected, actual;
371 expected.assign({0, 1});
373 actual.assign(indices.begin(), indices.end());
374 EXPECT_EQ(expected, actual);
375 expected.assign({2, 3});
377 actual.assign(indices.begin(), indices.end());
378 EXPECT_EQ(expected, actual);
379 expected.assign({4});
381 actual.assign(indices.begin(), indices.end());
382 EXPECT_EQ(expected, actual);
385 actual.assign(indices.begin(), indices.end());
386 EXPECT_EQ(expected, actual);
389TEST(SparseMatrix, ConstrainedRowSumVector) {
401 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
404 columnConstraint.
set(1);
405 columnConstraint.
set(3);
409 ASSERT_TRUE(constrainedRowSum == std::vector<double>({1.0, 0.7, 0, 0, 0.5}));
413 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
414 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
415 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
416 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
418 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
419 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 1.1));
420 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 3, 1.2));
422 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
423 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
425 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
428 rowGroupConstraint.
set(1);
431 columnConstraint2.
set(2);
432 columnConstraint2.
set(3);
436 ASSERT_TRUE(constrainedRowSum2 == std::vector<double>({0, 2.3}));
455 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
462 std::vector<uint_fast64_t> rowGroupIndices = {0, 1, 2, 4, 5};
464 rowGroupConstraint.
set(2);
465 rowGroupConstraint.
set(3);
466 columnConstraint.
set(0);
467 columnConstraint.
set(3);
474 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 0.5));
476 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 0, 0.1));
477 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 1, 0.3));
479 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
481 ASSERT_TRUE(matrix2 == matrix3);
483 std::vector<uint_fast64_t> rowGroupToIndexMapping = {0, 0, 1, 0};
489 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 1, 1.0));
490 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 2, 1.2));
491 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 0, 0.5));
492 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 1, 0.7));
493 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(2, 2, 1.1));
494 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 0, 0.1));
495 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 1, 0.2));
496 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 3, 0.3));
498 ASSERT_NO_THROW(matrix5 = matrixBuilder5.
build());
500 ASSERT_TRUE(matrix4 == matrix5);
503TEST(SparseMatrix, RestrictRows) {
506 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 1, 1.0));
507 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 2, 1.2));
508 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 0, 0.5));
509 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 1, 0.7));
511 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(2, 0, 0.5));
512 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(3, 2, 1.1));
514 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(4, 0, 0.1));
515 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(4, 1, 0.2));
516 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(6, 3, 0.3));
518 ASSERT_NO_THROW(matrix1 = matrixBuilder1.
build());
527 ASSERT_NO_THROW(matrix1Prime = matrix1.
restrictRows(constraint1));
531 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
532 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
533 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
534 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
536 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
539 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
541 ASSERT_EQ(matrix2, matrix1Prime);
549 ASSERT_NO_THROW(matrix2Prime = matrix2.
restrictRows(constraint2,
true));
553 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 0.5));
554 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 1, 0.7));
556 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
558 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
560 ASSERT_EQ(matrix3, matrix2Prime);
568 ASSERT_NO_THROW(matrix3Prime = matrix3.
restrictRows(constraint3,
true));
573 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 0, 0.5));
575 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build());
577 ASSERT_EQ(matrix4, matrix3Prime);
592 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
598 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 0.5));
599 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 0.5));
600 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 4, 0.1));
601 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 1.0));
602 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
603 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 4, 0.2));
604 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 1.2));
605 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 3, 1.1));
606 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 4, 0.3));
608 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
610 ASSERT_TRUE(transposeResult == matrix2);
613TEST(SparseMatrix, EquationSystem) {
620 ASSERT_NO_THROW(matrixBuilder.
addNextValue(2, 2, 0.99));
621 ASSERT_NO_THROW(matrixBuilder.
addNextValue(3, 3, 0.11));
623 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
628 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 0, 1 - 1.1));
629 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, -1.2));
630 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 1 - 0.5));
631 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 3, -0.7));
632 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, -0.5));
633 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 2, 1 - 0.99));
634 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 3, 1 - 0.11));
636 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
638 ASSERT_TRUE(matrix == matrix2);
641TEST(SparseMatrix, JacobiDecomposition) {
648 ASSERT_NO_THROW(matrixBuilder.
addNextValue(2, 2, 0.99));
649 ASSERT_NO_THROW(matrixBuilder.
addNextValue(3, 3, 0.11));
651 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
654 std::pair<storm::storage::SparseMatrix<double>, std::vector<double>> jacobiDecomposition = matrix.
getJacobiDecomposition();
661 ASSERT_NO_THROW(lu = luBuilder.
build());
663 std::vector<double> dinv = {1 / 1.1, 1 / 0.5, 1 / 0.99, 1 / 0.11};
664 ASSERT_TRUE(lu == jacobiDecomposition.first);
665 ASSERT_TRUE(dinv == jacobiDecomposition.second);
668TEST(SparseMatrix, PointwiseMultiplicationVector) {
680 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
683 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
684 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
685 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
686 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
687 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
688 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 1.1));
689 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
690 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
691 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
693 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
698 std::vector<double> correctResult = {1.0 * 1.0 + 1.2 * 1.2, 0.5 * 0.5 + 0.7 * 0.7, 0.5 * 0.5, 1.1 * 1.1, 0.1 * 0.1 + 0.2 * 0.2 + 0.3 * 0.3};
699 ASSERT_TRUE(pointwiseProductRowSums == correctResult);
702TEST(SparseMatrix, MatrixVectorMultiply) {
714 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
716 std::vector<double> x = {1, 0.3, 1.4, 7.1};
721 std::vector<double> correctResult = {1.0 * 0.3 + 1.2 * 1.4, 0.5 * 1 + 0.7 * 0.3, 0.5 * 1, 1.1 * 1.4, 0.1 * 1 + 0.2 * 0.3 + 0.3 * 7.1};
723 for (std::size_t index = 0; index < correctResult.size(); ++index) {
724 ASSERT_NEAR(result[index], correctResult[index], 1e-12);
740 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
742 for (
auto const& entry : matrix.
getRow(4)) {
743 if (entry.getColumn() == 0) {
744 ASSERT_EQ(0.1, entry.getValue());
745 }
else if (entry.getColumn() == 1) {
746 ASSERT_EQ(0.2, entry.getValue());
747 }
else if (entry.getColumn() == 3) {
748 ASSERT_EQ(0.3, entry.getValue());
755 if (it->getColumn() == 0) {
756 ASSERT_EQ(0.1, it->getValue());
757 }
else if (it->getColumn() == 1) {
758 ASSERT_EQ(0.2, it->getValue());
759 }
else if (it->getColumn() == 3) {
760 ASSERT_EQ(0.3, it->getValue());
778 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
781 ASSERT_EQ(0.1 + 0.2 + 0.3, matrix.
getRowSum(4));
784TEST(SparseMatrix, IsSubmatrix) {
795 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
798 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
799 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
800 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
801 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
802 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
804 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
809 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 3, 1.0));
810 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
811 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 0.7));
812 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(4, 0, 0.1));
813 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(4, 1, 0.2));
815 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
821TEST(SparseMatrix, PermuteRows) {
832 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
834 std::vector<uint64_t> inversePermutation = {1, 4, 0, 3, 2};
846TEST(SparseMatrix, PermuteRowGroupsAndColumns) {
862 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
864 std::vector<uint64_t> permutation = {3, 0, 2, 1};
865 std::vector<uint64_t> invertedPermutation = {1, 3, 2, 0};
871 ASSERT_NO_THROW(expectedBuilder.
addNextValue(0, 3, 0.5));
872 ASSERT_NO_THROW(expectedBuilder.
addNextValue(1, 2, 1.1));
875 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 3, 0.1));
876 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 0, 0.2));
877 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 1, 0.3));
879 ASSERT_NO_THROW(expectedBuilder.
addNextValue(3, 0, 1.0));
880 ASSERT_NO_THROW(expectedBuilder.
addNextValue(3, 2, 1.2));
881 ASSERT_NO_THROW(expectedBuilder.
addNextValue(4, 3, 0.5));
882 ASSERT_NO_THROW(expectedBuilder.
addNextValue(4, 0, 0.7));
884 ASSERT_NO_THROW(expectedMatrix = expectedBuilder.
build());
885 EXPECT_EQ(expectedMatrix, matrixPerm);
887 auto matrixPerm2 = matrixPerm.permuteRowGroupsAndColumns(permutation, invertedPermutation);
888 EXPECT_EQ(matrix, matrixPerm2);
891TEST(SparseMatrix, DropZeroEntries) {
905 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
908 absorbingRows.
set(0);
914 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(0, 1, 1.0));
915 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(0, 2, 1.2));
917 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 0, 0.5));
918 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 1, 1.1));
919 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 2, 0.5));
921 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(2, 0, 0.1));
922 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(3, 1, 0.2));
923 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(3, 2, 0.3));
925 ASSERT_NO_THROW(matrixX = matrixBuilderX.
build());
931 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 0, 1.0));
933 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
934 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 1.1));
935 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 2, 0.5));
937 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.1));
938 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 1, 0.2));
939 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 0.3));
941 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
943 ASSERT_TRUE(matrix == matrix2);
946 ASSERT_TRUE(matrixX == matrix2);
955 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 1.0));
957 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 1.0));
959 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 0, 0.1));
960 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(3, 1, 0.2));
961 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(3, 2, 0.3));
963 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
965 ASSERT_TRUE(matrix == matrix3);
968 ASSERT_TRUE(matrixX == matrix3);
972 absorbingRowGroups.
set(2);
980 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 0, 1.0));
982 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 1, 1.0));
984 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(2, 2, 1.0));
985 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(3, 2, 1.0));
987 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build());
989 ASSERT_TRUE(matrix == matrix4);
992 ASSERT_TRUE(matrixX == matrix4);
TEST(SparseMatrixBuilder, CreationEmpty)
A bit vector that is internally represented as a vector of 64-bit values.
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
A class that can be used to build a sparse matrix by adding value by value.
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 newRowGroup(index_type startingRow)
Starts a new row group in the matrix.
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 convertToEquationSystem()
Transforms the matrix into an equation system.
const_rows getRow(index_type row) const
Returns an object representing the given row.
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.
index_type getEntryCount() const
Returns the number of entries in the matrix.
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.
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 ...
const_iterator begin(index_type row) const
Retrieves an iterator that points to the beginning of the given row.
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...
SparseMatrix permuteRows(std::vector< index_type > const &inversePermutation) const
Permute rows of the matrix according to the vector.
SparseMatrix restrictRows(storm::storage::BitVector const &rowsToKeep, bool allowEmptyRowGroups=false) const
Restrict rows in grouped rows matrix.
value_type getRowSum(index_type row) const
Computes the sum of the entries in a given row.
const_iterator end(index_type row) const
Retrieves an iterator that points past the end of the 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.
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...
void makeRowGroupsAbsorbing(storm::storage::BitVector const &rowGroupConstraint, bool dropZeroEntries=false)
This function makes the groups of rows given by the bit vector absorbing.
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.
void makeRowGroupingTrivial()
Makes the row grouping of this matrix trivial.
std::vector< index_type > const & getRowGroupIndices() const
Returns the grouping of rows of this matrix.
std::vector< MatrixEntry< index_type, value_type > >::iterator iterator
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.
index_type getRowCount() const
Returns the number of rows of the matrix.
std::vector< index_type > invertPermutation(std::vector< index_type > const &permutation)
Inverts the given permutation.
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)