9TEST(SparseMatrixBuilder, CreationEmpty) {
12 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
19TEST(SparseMatrixBuilder, CreationWithDimensions) {
28 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
35TEST(SparseMatrixBuilder, CreationWithoutNumberOfEntries) {
44 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
51TEST(SparseMatrixBuilder, CreationWithNumberOfRows) {
60 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
67TEST(SparseMatrixBuilder, CreationWithoutDimensions) {
76 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
83TEST(SparseMatrixBuilder, AddNextValue) {
103 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 1, 1.0));
104 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 2, 1.2));
105 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(2, 4, 0.5));
106 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(3, 1, 0.2));
111 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 1, 1.0));
112 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 2, 1.2));
113 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 0, 0.5));
114 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 1, 0.7));
115 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 3, 0.2));
116 ASSERT_NO_THROW(matrixBuilder1.
build());
119 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
120 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
121 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
122 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
126 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 1, 1.0));
127 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 2, 1.2));
128 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
129 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 0.7));
130 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 3, 0.2));
132 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
138 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 1, 1.0));
139 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 2, 1.2));
140 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 0, 0.5));
141 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 1, 0.7));
142 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 3, 0.2));
144 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build(4));
150 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 1, 1.0));
151 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 2, 1.2));
152 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 0, 0.5));
153 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 1, 0.7));
154 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 3, 0.2));
156 ASSERT_NO_THROW(matrix5 = matrixBuilder5.
build(0, 6));
162TEST(SparseMatrix, DiagonalEntries) {
167 for (uint64_t i = 0; i < 4; ++i) {
172 ASSERT_NO_THROW(builderCmp.
addNextValue(i, 2, 100.0 + i));
174 ASSERT_NO_THROW(builderCmp.
addNextValue(i, 2, 100.0 + i));
178 auto matrix = builder.
build();
179 auto matrixCmp = builderCmp.
build();
180 EXPECT_EQ(matrix, matrixCmp);
186 for (uint64_t i = 0; i < 4; ++i) {
187 uint64_t row = 3 * i;
190 for (; row < 3 * (i + 1); ++row) {
192 ASSERT_NO_THROW(builder.
addNextValue(row, 2, 100 + row));
195 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
197 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
202 auto matrix = builder.
build();
203 auto matrixCmp = builderCmp.
build();
204 EXPECT_EQ(matrix, matrixCmp);
210 for (uint64_t i = 0; i < 4; ++i) {
211 uint64_t row = 3 * i;
214 for (; row < 3 * (i + 1); ++row) {
219 ASSERT_NO_THROW(builder.
addNextValue(row, 2, 100 + row));
222 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
225 ASSERT_NO_THROW(builderCmp.
addNextValue(row, 2, 100.0 + row));
229 auto matrix = builder.
build();
230 auto matrixCmp = builderCmp.
build();
231 EXPECT_EQ(matrix, matrixCmp);
235TEST(SparseMatrix, CreationWithMovingContents) {
236 std::vector<storm::storage::MatrixEntry<uint_fast64_t, double>> columnsAndValues;
237 columnsAndValues.emplace_back(1, 1.0);
238 columnsAndValues.emplace_back(2, 1.2);
239 columnsAndValues.emplace_back(0, 0.5);
240 columnsAndValues.emplace_back(1, 0.7);
241 columnsAndValues.emplace_back(3, 0.2);
245 ASSERT_EQ(3ul, matrix.getRowCount());
246 ASSERT_EQ(4ul, matrix.getColumnCount());
247 ASSERT_EQ(5ul, matrix.getEntryCount());
248 ASSERT_EQ(3ul, matrix.getRowGroupCount());
251TEST(SparseMatrix, CopyConstruct) {
260 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
264 ASSERT_TRUE(matrix == copy);
267TEST(SparseMatrix, CopyAssign) {
276 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
280 ASSERT_TRUE(matrix == copy);
283TEST(SparseMatrix, MakeAbsorbing) {
291 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
294 absorbingRows.
set(1);
299 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
300 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
304 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
306 ASSERT_TRUE(matrix == matrix2);
309TEST(SparseMatrix, MakeRowGroupAbsorbing) {
324 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
327 absorbingRowGroups.
set(1);
333 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
334 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
335 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
336 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
341 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
342 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
343 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
345 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
347 ASSERT_TRUE(matrix == matrix2);
350TEST(SparseMatrix, rowGroupIndices) {
365 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
368 std::vector<storm::storage::SparseMatrixIndexType> expected, actual;
369 expected.assign({0, 1});
371 actual.assign(indices.begin(), indices.end());
372 EXPECT_EQ(expected, actual);
373 expected.assign({2, 3});
375 actual.assign(indices.begin(), indices.end());
376 EXPECT_EQ(expected, actual);
377 expected.assign({4});
379 actual.assign(indices.begin(), indices.end());
380 EXPECT_EQ(expected, actual);
383 actual.assign(indices.begin(), indices.end());
384 EXPECT_EQ(expected, actual);
387TEST(SparseMatrix, ConstrainedRowSumVector) {
399 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
402 columnConstraint.
set(1);
403 columnConstraint.
set(3);
407 ASSERT_TRUE(constrainedRowSum == std::vector<double>({1.0, 0.7, 0, 0, 0.5}));
411 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
412 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
413 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
414 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
416 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
417 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 1.1));
418 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 3, 1.2));
420 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
421 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
423 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
426 rowGroupConstraint.
set(1);
429 columnConstraint2.
set(2);
430 columnConstraint2.
set(3);
434 ASSERT_TRUE(constrainedRowSum2 == std::vector<double>({0, 2.3}));
453 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
460 std::vector<uint_fast64_t> rowGroupIndices = {0, 1, 2, 4, 5};
462 rowGroupConstraint.
set(2);
463 rowGroupConstraint.
set(3);
464 columnConstraint.
set(0);
465 columnConstraint.
set(3);
472 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 0.5));
474 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 0, 0.1));
475 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 1, 0.3));
477 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
479 ASSERT_TRUE(matrix2 == matrix3);
481 std::vector<uint_fast64_t> rowGroupToIndexMapping = {0, 0, 1, 0};
487 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 1, 1.0));
488 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(0, 2, 1.2));
489 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 0, 0.5));
490 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(1, 1, 0.7));
491 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(2, 2, 1.1));
492 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 0, 0.1));
493 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 1, 0.2));
494 ASSERT_NO_THROW(matrixBuilder5.
addNextValue(3, 3, 0.3));
496 ASSERT_NO_THROW(matrix5 = matrixBuilder5.
build());
498 ASSERT_TRUE(matrix4 == matrix5);
501TEST(SparseMatrix, RestrictRows) {
504 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 1, 1.0));
505 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(0, 2, 1.2));
506 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 0, 0.5));
507 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(1, 1, 0.7));
509 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(2, 0, 0.5));
510 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(3, 2, 1.1));
512 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(4, 0, 0.1));
513 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(4, 1, 0.2));
514 ASSERT_NO_THROW(matrixBuilder1.
addNextValue(6, 3, 0.3));
516 ASSERT_NO_THROW(matrix1 = matrixBuilder1.
build());
525 ASSERT_NO_THROW(matrix1Prime = matrix1.
restrictRows(constraint1));
529 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
530 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
531 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
532 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
534 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
537 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
539 ASSERT_EQ(matrix2, matrix1Prime);
547 ASSERT_NO_THROW(matrix2Prime = matrix2.
restrictRows(constraint2,
true));
551 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 0.5));
552 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 1, 0.7));
554 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
556 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
558 ASSERT_EQ(matrix3, matrix2Prime);
566 ASSERT_NO_THROW(matrix3Prime = matrix3.
restrictRows(constraint3,
true));
571 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 0, 0.5));
573 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build());
575 ASSERT_EQ(matrix4, matrix3Prime);
590 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
596 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 0.5));
597 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 0.5));
598 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 4, 0.1));
599 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 1.0));
600 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
601 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 4, 0.2));
602 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 1.2));
603 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 3, 1.1));
604 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 4, 0.3));
606 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
608 ASSERT_TRUE(transposeResult == matrix2);
611TEST(SparseMatrix, EquationSystem) {
618 ASSERT_NO_THROW(matrixBuilder.
addNextValue(2, 2, 0.99));
619 ASSERT_NO_THROW(matrixBuilder.
addNextValue(3, 3, 0.11));
621 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
626 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 0, 1 - 1.1));
627 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, -1.2));
628 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 1 - 0.5));
629 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 3, -0.7));
630 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, -0.5));
631 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 2, 1 - 0.99));
632 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 3, 1 - 0.11));
634 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
636 ASSERT_TRUE(matrix == matrix2);
639TEST(SparseMatrix, JacobiDecomposition) {
646 ASSERT_NO_THROW(matrixBuilder.
addNextValue(2, 2, 0.99));
647 ASSERT_NO_THROW(matrixBuilder.
addNextValue(3, 3, 0.11));
649 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
652 std::pair<storm::storage::SparseMatrix<double>, std::vector<double>> jacobiDecomposition = matrix.
getJacobiDecomposition();
659 ASSERT_NO_THROW(lu = luBuilder.
build());
661 std::vector<double> dinv = {1 / 1.1, 1 / 0.5, 1 / 0.99, 1 / 0.11};
662 ASSERT_TRUE(lu == jacobiDecomposition.first);
663 ASSERT_TRUE(dinv == jacobiDecomposition.second);
666TEST(SparseMatrix, PointwiseMultiplicationVector) {
678 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
681 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
682 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 2, 1.2));
683 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
684 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
685 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.5));
686 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 1.1));
687 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
688 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
689 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 3, 0.3));
691 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
696 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};
697 ASSERT_TRUE(pointwiseProductRowSums == correctResult);
700TEST(SparseMatrix, MatrixVectorMultiply) {
712 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
714 std::vector<double> x = {1, 0.3, 1.4, 7.1};
719 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};
721 for (std::size_t index = 0; index < correctResult.size(); ++index) {
722 ASSERT_NEAR(result[index], correctResult[index], 1e-12);
738 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
740 for (
auto const& entry : matrix.
getRow(4)) {
741 if (entry.getColumn() == 0) {
742 ASSERT_EQ(0.1, entry.getValue());
743 }
else if (entry.getColumn() == 1) {
744 ASSERT_EQ(0.2, entry.getValue());
745 }
else if (entry.getColumn() == 3) {
746 ASSERT_EQ(0.3, entry.getValue());
753 if (it->getColumn() == 0) {
754 ASSERT_EQ(0.1, it->getValue());
755 }
else if (it->getColumn() == 1) {
756 ASSERT_EQ(0.2, it->getValue());
757 }
else if (it->getColumn() == 3) {
758 ASSERT_EQ(0.3, it->getValue());
776 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
779 ASSERT_EQ(0.1 + 0.2 + 0.3, matrix.
getRowSum(4));
782TEST(SparseMatrix, IsSubmatrix) {
793 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
796 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 1, 1.0));
797 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
798 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 0.7));
799 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 0, 0.1));
800 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(4, 1, 0.2));
802 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
807 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 3, 1.0));
808 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 0, 0.5));
809 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 0.7));
810 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(4, 0, 0.1));
811 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(4, 1, 0.2));
813 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
819TEST(SparseMatrix, PermuteRows) {
830 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
832 std::vector<uint64_t> inversePermutation = {1, 4, 0, 3, 2};
844TEST(SparseMatrix, PermuteRowGroupsAndColumns) {
860 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
862 std::vector<uint64_t> permutation = {3, 0, 2, 1};
863 std::vector<uint64_t> invertedPermutation = {1, 3, 2, 0};
869 ASSERT_NO_THROW(expectedBuilder.
addNextValue(0, 3, 0.5));
870 ASSERT_NO_THROW(expectedBuilder.
addNextValue(1, 2, 1.1));
873 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 3, 0.1));
874 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 0, 0.2));
875 ASSERT_NO_THROW(expectedBuilder.
addNextValue(2, 1, 0.3));
877 ASSERT_NO_THROW(expectedBuilder.
addNextValue(3, 0, 1.0));
878 ASSERT_NO_THROW(expectedBuilder.
addNextValue(3, 2, 1.2));
879 ASSERT_NO_THROW(expectedBuilder.
addNextValue(4, 3, 0.5));
880 ASSERT_NO_THROW(expectedBuilder.
addNextValue(4, 0, 0.7));
882 ASSERT_NO_THROW(expectedMatrix = expectedBuilder.
build());
883 EXPECT_EQ(expectedMatrix, matrixPerm);
885 auto matrixPerm2 = matrixPerm.permuteRowGroupsAndColumns(permutation, invertedPermutation);
886 EXPECT_EQ(matrix, matrixPerm2);
889TEST(SparseMatrix, DropZeroEntries) {
903 ASSERT_NO_THROW(matrix = matrixBuilder.
build());
906 absorbingRows.
set(0);
912 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(0, 1, 1.0));
913 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(0, 2, 1.2));
915 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 0, 0.5));
916 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 1, 1.1));
917 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(1, 2, 0.5));
919 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(2, 0, 0.1));
920 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(3, 1, 0.2));
921 ASSERT_NO_THROW(matrixBuilderX.
addNextValue(3, 2, 0.3));
923 ASSERT_NO_THROW(matrixX = matrixBuilderX.
build());
929 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(0, 0, 1.0));
931 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 0, 0.5));
932 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 1, 1.1));
933 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(1, 2, 0.5));
935 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(2, 0, 0.1));
936 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 1, 0.2));
937 ASSERT_NO_THROW(matrixBuilder2.
addNextValue(3, 2, 0.3));
939 ASSERT_NO_THROW(matrix2 = matrixBuilder2.
build());
941 ASSERT_TRUE(matrix == matrix2);
944 ASSERT_TRUE(matrixX == matrix2);
953 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(0, 0, 1.0));
955 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(1, 1, 1.0));
957 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(2, 0, 0.1));
958 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(3, 1, 0.2));
959 ASSERT_NO_THROW(matrixBuilder3.
addNextValue(3, 2, 0.3));
961 ASSERT_NO_THROW(matrix3 = matrixBuilder3.
build());
963 ASSERT_TRUE(matrix == matrix3);
966 ASSERT_TRUE(matrixX == matrix3);
970 absorbingRowGroups.
set(2);
978 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(0, 0, 1.0));
980 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(1, 1, 1.0));
982 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(2, 2, 1.0));
983 ASSERT_NO_THROW(matrixBuilder4.
addNextValue(3, 2, 1.0));
985 ASSERT_NO_THROW(matrix4 = matrixBuilder4.
build());
987 ASSERT_TRUE(matrix == matrix4);
990 ASSERT_TRUE(matrixX == matrix4);
TEST(SparseMatrixBuilder, CreationEmpty)
A bit vector that is internally represented as a vector of 64-bit values.
void set(uint_fast64_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)