You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

599 lines
28 KiB

  1. #include "gtest/gtest.h"
  2. #include "src/storage/SparseMatrix.h"
  3. #include "src/exceptions/InvalidArgumentException.h"
  4. #include "src/exceptions/OutOfRangeException.h"
  5. TEST(SparseMatrixBuilder, CreationWithDimensions) {
  6. storm::storage::SparseMatrixBuilder<double> matrixBuilder(3, 4, 5);
  7. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  8. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  9. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  10. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  11. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  12. storm::storage::SparseMatrix<double> matrix;
  13. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  14. ASSERT_EQ(3, matrix.getRowCount());
  15. ASSERT_EQ(4, matrix.getColumnCount());
  16. ASSERT_EQ(5, matrix.getEntryCount());
  17. }
  18. TEST(SparseMatrixBuilder, CreationWithoutNumberOfEntries) {
  19. storm::storage::SparseMatrixBuilder<double> matrixBuilder(3, 4);
  20. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  21. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  22. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  23. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  24. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  25. storm::storage::SparseMatrix<double> matrix;
  26. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  27. ASSERT_EQ(3, matrix.getRowCount());
  28. ASSERT_EQ(4, matrix.getColumnCount());
  29. ASSERT_EQ(5, matrix.getEntryCount());
  30. }
  31. TEST(SparseMatrixBuilder, CreationWithNumberOfRows) {
  32. storm::storage::SparseMatrixBuilder<double> matrixBuilder(3);
  33. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  34. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  35. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  36. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  37. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  38. storm::storage::SparseMatrix<double> matrix;
  39. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  40. ASSERT_EQ(3, matrix.getRowCount());
  41. ASSERT_EQ(4, matrix.getColumnCount());
  42. ASSERT_EQ(5, matrix.getEntryCount());
  43. }
  44. TEST(SparseMatrixBuilder, CreationWithoutDimensions) {
  45. storm::storage::SparseMatrixBuilder<double> matrixBuilder;
  46. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  47. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  48. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  49. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  50. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  51. storm::storage::SparseMatrix<double> matrix;
  52. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  53. ASSERT_EQ(2, matrix.getRowCount());
  54. ASSERT_EQ(4, matrix.getColumnCount());
  55. ASSERT_EQ(5, matrix.getEntryCount());
  56. }
  57. TEST(SparseMatrixBuilder, AddNextValue) {
  58. storm::storage::SparseMatrixBuilder<double> matrixBuilder1(3, 4, 5);
  59. ASSERT_NO_THROW(matrixBuilder1.addNextValue(0, 1, 1.0));
  60. ASSERT_NO_THROW(matrixBuilder1.addNextValue(0, 2, 1.2));
  61. ASSERT_THROW(matrixBuilder1.addNextValue(0, 4, 0.5), storm::exceptions::OutOfRangeException);
  62. ASSERT_THROW(matrixBuilder1.addNextValue(3, 1, 0.5), storm::exceptions::OutOfRangeException);
  63. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(3, 4);
  64. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  65. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  66. ASSERT_THROW(matrixBuilder2.addNextValue(0, 4, 0.5), storm::exceptions::OutOfRangeException);
  67. ASSERT_THROW(matrixBuilder2.addNextValue(3, 1, 0.5), storm::exceptions::OutOfRangeException);
  68. storm::storage::SparseMatrixBuilder<double> matrixBuilder3(3);
  69. ASSERT_NO_THROW(matrixBuilder3.addNextValue(0, 1, 1.0));
  70. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 2, 1.2));
  71. ASSERT_NO_THROW(matrixBuilder3.addNextValue(2, 4, 0.5));
  72. ASSERT_THROW(matrixBuilder3.addNextValue(3, 1, 0.2), storm::exceptions::OutOfRangeException);
  73. storm::storage::SparseMatrixBuilder<double> matrixBuilder4;
  74. ASSERT_NO_THROW(matrixBuilder4.addNextValue(0, 1, 1.0));
  75. ASSERT_NO_THROW(matrixBuilder4.addNextValue(1, 2, 1.2));
  76. ASSERT_NO_THROW(matrixBuilder4.addNextValue(2, 4, 0.5));
  77. ASSERT_NO_THROW(matrixBuilder4.addNextValue(3, 1, 0.2));
  78. }
  79. TEST(SparseMatrix, Build) {
  80. storm::storage::SparseMatrixBuilder<double> matrixBuilder1(3, 4, 5);
  81. ASSERT_NO_THROW(matrixBuilder1.addNextValue(0, 1, 1.0));
  82. ASSERT_NO_THROW(matrixBuilder1.addNextValue(0, 2, 1.2));
  83. ASSERT_NO_THROW(matrixBuilder1.addNextValue(1, 0, 0.5));
  84. ASSERT_NO_THROW(matrixBuilder1.addNextValue(1, 1, 0.7));
  85. ASSERT_NO_THROW(matrixBuilder1.addNextValue(1, 3, 0.2));
  86. ASSERT_NO_THROW(matrixBuilder1.build());
  87. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(3, 4, 5);
  88. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  89. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  90. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 0.5));
  91. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  92. ASSERT_THROW(matrixBuilder2.build(), storm::exceptions::InvalidStateException);
  93. storm::storage::SparseMatrixBuilder<double> matrixBuilder3;
  94. ASSERT_NO_THROW(matrixBuilder3.addNextValue(0, 1, 1.0));
  95. ASSERT_NO_THROW(matrixBuilder3.addNextValue(0, 2, 1.2));
  96. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 0, 0.5));
  97. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 1, 0.7));
  98. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 3, 0.2));
  99. storm::storage::SparseMatrix<double> matrix3;
  100. ASSERT_NO_THROW(matrix3 = matrixBuilder3.build());
  101. ASSERT_EQ(2, matrix3.getRowCount());
  102. ASSERT_EQ(4, matrix3.getColumnCount());
  103. ASSERT_EQ(5, matrix3.getEntryCount());
  104. storm::storage::SparseMatrixBuilder<double> matrixBuilder4;
  105. ASSERT_NO_THROW(matrixBuilder4.addNextValue(0, 1, 1.0));
  106. ASSERT_NO_THROW(matrixBuilder4.addNextValue(0, 2, 1.2));
  107. ASSERT_NO_THROW(matrixBuilder4.addNextValue(1, 0, 0.5));
  108. ASSERT_NO_THROW(matrixBuilder4.addNextValue(1, 1, 0.7));
  109. ASSERT_NO_THROW(matrixBuilder4.addNextValue(1, 3, 0.2));
  110. storm::storage::SparseMatrix<double> matrix4;
  111. ASSERT_NO_THROW(matrix4 = matrixBuilder4.build(4));
  112. ASSERT_EQ(4, matrix4.getRowCount());
  113. ASSERT_EQ(4, matrix4.getColumnCount());
  114. ASSERT_EQ(5, matrix4.getEntryCount());
  115. storm::storage::SparseMatrixBuilder<double> matrixBuilder5;
  116. ASSERT_NO_THROW(matrixBuilder5.addNextValue(0, 1, 1.0));
  117. ASSERT_NO_THROW(matrixBuilder5.addNextValue(0, 2, 1.2));
  118. ASSERT_NO_THROW(matrixBuilder5.addNextValue(1, 0, 0.5));
  119. ASSERT_NO_THROW(matrixBuilder5.addNextValue(1, 1, 0.7));
  120. ASSERT_NO_THROW(matrixBuilder5.addNextValue(1, 3, 0.2));
  121. storm::storage::SparseMatrix<double> matrix5;
  122. ASSERT_NO_THROW(matrix5 = matrixBuilder5.build(0, 6));
  123. ASSERT_EQ(2, matrix5.getRowCount());
  124. ASSERT_EQ(6, matrix5.getColumnCount());
  125. ASSERT_EQ(5, matrix5.getEntryCount());
  126. }
  127. TEST(SparseMatrix, CreationWithMovingContents) {
  128. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> matrix(4, {0, 2, 5, 5}, {1, 2, 0, 1, 3}, {1.0, 1.2, 0.5, 0.7, 0.2}));
  129. storm::storage::SparseMatrix<double> matrix(4, {0, 2, 5, 5}, {1, 2, 0, 1, 3}, {1.0, 1.2, 0.5, 0.7, 0.2});
  130. ASSERT_EQ(3, matrix.getRowCount());
  131. ASSERT_EQ(4, matrix.getColumnCount());
  132. ASSERT_EQ(5, matrix.getEntryCount());
  133. }
  134. TEST(SparseMatrix, CopyConstruct) {
  135. storm::storage::SparseMatrixBuilder<double> matrixBuilder;
  136. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  137. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  138. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  139. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  140. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  141. storm::storage::SparseMatrix<double> matrix;
  142. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  143. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> copy(matrix));
  144. storm::storage::SparseMatrix<double> copy(matrix);
  145. ASSERT_TRUE(matrix == copy);
  146. }
  147. TEST(SparseMatrix, CopyAssign) {
  148. storm::storage::SparseMatrixBuilder<double> matrixBuilder;
  149. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  150. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  151. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  152. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  153. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  154. storm::storage::SparseMatrix<double> matrix;
  155. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  156. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> copy = matrix);
  157. storm::storage::SparseMatrix<double> copy = matrix;
  158. ASSERT_TRUE(matrix == copy);
  159. }
  160. TEST(SparseMatrix, MakeAbsorbing) {
  161. storm::storage::SparseMatrixBuilder<double> matrixBuilder(3, 4, 5);
  162. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  163. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  164. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  165. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  166. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.2));
  167. storm::storage::SparseMatrix<double> matrix;
  168. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  169. storm::storage::BitVector absorbingRows(3);
  170. absorbingRows.set(1);
  171. ASSERT_NO_THROW(matrix.makeRowsAbsorbing(absorbingRows));
  172. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(3, 4, 3);
  173. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  174. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  175. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 1));
  176. storm::storage::SparseMatrix<double> matrix2;
  177. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  178. ASSERT_TRUE(matrix == matrix2);
  179. }
  180. TEST(SparseMatrix, MakeRowGroupAbsorbing) {
  181. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  182. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  183. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  184. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  185. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  186. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  187. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  188. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  189. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  190. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  191. storm::storage::SparseMatrix<double> matrix;
  192. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  193. std::vector<uint_fast64_t> rowGroupIndices = {0, 2, 4, 5};
  194. storm::storage::BitVector absorbingRowGroups(3);
  195. absorbingRowGroups.set(1);
  196. ASSERT_NO_THROW(matrix.makeRowsAbsorbing(absorbingRowGroups, rowGroupIndices));
  197. storm::storage::SparseMatrixBuilder<double> matrixBuilder2;
  198. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  199. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  200. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 0.5));
  201. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  202. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 1, 1));
  203. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 1, 1));
  204. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 0, 0.1));
  205. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 1, 0.2));
  206. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 3, 0.3));
  207. storm::storage::SparseMatrix<double> matrix2;
  208. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  209. ASSERT_TRUE(matrix == matrix2);
  210. }
  211. TEST(SparseMatrix, ConstrainedRowSumVector) {
  212. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  213. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  214. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  215. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  216. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  217. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  218. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  219. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  220. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  221. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  222. storm::storage::SparseMatrix<double> matrix;
  223. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  224. storm::storage::BitVector columnConstraint(4);
  225. columnConstraint.set(1);
  226. columnConstraint.set(3);
  227. ASSERT_NO_THROW(std::vector<double> constrainedRowSum = matrix.getConstrainedRowSumVector(storm::storage::BitVector(5, true), columnConstraint));
  228. std::vector<double> constrainedRowSum = matrix.getConstrainedRowSumVector(storm::storage::BitVector(5, true), columnConstraint);
  229. ASSERT_TRUE(constrainedRowSum == std::vector<double>({1.0, 0.7, 0, 0, 0.5}));
  230. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(5, 4, 9);
  231. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  232. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  233. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 0.5));
  234. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  235. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 0, 0.5));
  236. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 2, 1.1));
  237. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 3, 1.2));
  238. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 0, 0.1));
  239. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 3, 0.3));
  240. storm::storage::SparseMatrix<double> matrix2;
  241. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  242. std::vector<uint_fast64_t> rowGroupIndices = {0, 2, 4, 5};
  243. storm::storage::BitVector rowGroupConstraint(3);
  244. rowGroupConstraint.set(1);
  245. storm::storage::BitVector columnConstraint2(4);
  246. columnConstraint2.set(2);
  247. columnConstraint2.set(3);
  248. ASSERT_NO_THROW(std::vector<double> constrainedRowSum2 = matrix2.getConstrainedRowSumVector(rowGroupConstraint, rowGroupIndices, columnConstraint2));
  249. std::vector<double> constrainedRowSum2 = matrix2.getConstrainedRowSumVector(rowGroupConstraint, rowGroupIndices, columnConstraint2);
  250. ASSERT_TRUE(constrainedRowSum2 == std::vector<double>({0, 2.3}));
  251. }
  252. TEST(SparseMatrix, Submatrix) {
  253. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  254. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  255. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  256. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  257. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  258. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  259. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  260. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  261. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  262. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  263. storm::storage::SparseMatrix<double> matrix;
  264. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  265. std::vector<uint_fast64_t> rowGroupIndices = {0, 1, 2, 4, 5};
  266. storm::storage::BitVector rowGroupConstraint(4);
  267. rowGroupConstraint.set(2);
  268. rowGroupConstraint.set(3);
  269. storm::storage::BitVector columnConstraint(4);
  270. columnConstraint.set(0);
  271. columnConstraint.set(3);
  272. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> matrix2 = matrix.getSubmatrix(rowGroupConstraint, columnConstraint, rowGroupIndices, false));
  273. storm::storage::SparseMatrix<double> matrix2 = matrix.getSubmatrix(rowGroupConstraint, columnConstraint, rowGroupIndices, false);
  274. storm::storage::SparseMatrixBuilder<double> matrixBuilder3(3, 2, 3);
  275. ASSERT_NO_THROW(matrixBuilder3.addNextValue(0, 0, 0.5));
  276. ASSERT_NO_THROW(matrixBuilder3.addNextValue(2, 0, 0.1));
  277. ASSERT_NO_THROW(matrixBuilder3.addNextValue(2, 1, 0.3));
  278. storm::storage::SparseMatrix<double> matrix3;
  279. ASSERT_NO_THROW(matrix3 = matrixBuilder3.build());
  280. ASSERT_TRUE(matrix2 == matrix3);
  281. std::vector<uint_fast64_t> rowGroupToIndexMapping = {0, 0, 1, 0};
  282. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> matrix4 = matrix.getSubmatrix(rowGroupToIndexMapping, rowGroupIndices));
  283. storm::storage::SparseMatrix<double> matrix4 = matrix.getSubmatrix(rowGroupToIndexMapping, rowGroupIndices);
  284. storm::storage::SparseMatrixBuilder<double> matrixBuilder5(4, 4, 8);
  285. ASSERT_NO_THROW(matrixBuilder5.addNextValue(0, 1, 1.0));
  286. ASSERT_NO_THROW(matrixBuilder5.addNextValue(0, 2, 1.2));
  287. ASSERT_NO_THROW(matrixBuilder5.addNextValue(1, 0, 0.5));
  288. ASSERT_NO_THROW(matrixBuilder5.addNextValue(1, 1, 0.7));
  289. ASSERT_NO_THROW(matrixBuilder5.addNextValue(2, 2, 1.1));
  290. ASSERT_NO_THROW(matrixBuilder5.addNextValue(3, 0, 0.1));
  291. ASSERT_NO_THROW(matrixBuilder5.addNextValue(3, 1, 0.2));
  292. ASSERT_NO_THROW(matrixBuilder5.addNextValue(3, 3, 0.3));
  293. storm::storage::SparseMatrix<double> matrix5;
  294. ASSERT_NO_THROW(matrix5 = matrixBuilder5.build());
  295. ASSERT_TRUE(matrix4 == matrix5);
  296. }
  297. TEST(SparseMatrix, Transpose) {
  298. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  299. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  300. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  301. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  302. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  303. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  304. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  305. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  306. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  307. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  308. storm::storage::SparseMatrix<double> matrix;
  309. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  310. ASSERT_NO_THROW(storm::storage::SparseMatrix<double> transposeResult = matrix.transpose());
  311. storm::storage::SparseMatrix<double> transposeResult = matrix.transpose();
  312. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(4, 5, 9);
  313. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 0.5));
  314. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 0.5));
  315. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 4, 0.1));
  316. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 1.0));
  317. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  318. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 4, 0.2));
  319. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 0, 1.2));
  320. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 3, 1.1));
  321. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 4, 0.3));
  322. storm::storage::SparseMatrix<double> matrix2;
  323. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  324. ASSERT_TRUE(transposeResult == matrix2);
  325. }
  326. TEST(SparseMatrix, EquationSystem) {
  327. storm::storage::SparseMatrixBuilder<double> matrixBuilder(4, 4, 7);
  328. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 0, 1.1));
  329. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.2));
  330. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.5));
  331. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.7));
  332. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  333. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 2, 0.99));
  334. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 3, 0.11));
  335. storm::storage::SparseMatrix<double> matrix;
  336. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  337. ASSERT_NO_THROW(matrix.convertToEquationSystem());
  338. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(4, 4, 7);
  339. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 0, 1 - 1.1));
  340. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, -1.2));
  341. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 1 - 0.5));
  342. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 3, -0.7));
  343. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 0, -0.5));
  344. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 2, 1 - 0.99));
  345. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 3, 1 - 0.11));
  346. storm::storage::SparseMatrix<double> matrix2;
  347. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  348. ASSERT_TRUE(matrix == matrix2);
  349. }
  350. TEST(SparseMatrix, JacobiDecomposition) {
  351. storm::storage::SparseMatrixBuilder<double> matrixBuilder(4, 4, 7);
  352. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 0, 1.1));
  353. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.2));
  354. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.5));
  355. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 0.7));
  356. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  357. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 2, 0.99));
  358. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 3, 0.11));
  359. storm::storage::SparseMatrix<double> matrix;
  360. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  361. ASSERT_NO_THROW(matrix.getJacobiDecomposition());
  362. std::pair<storm::storage::SparseMatrix<double>, storm::storage::SparseMatrix<double>> jacobiDecomposition = matrix.getJacobiDecomposition();
  363. storm::storage::SparseMatrixBuilder<double> luBuilder(4, 4, 3);
  364. ASSERT_NO_THROW(luBuilder.addNextValue(0, 1, 1.2));
  365. ASSERT_NO_THROW(luBuilder.addNextValue(1, 3, 0.7));
  366. ASSERT_NO_THROW(luBuilder.addNextValue(2, 0, 0.5));
  367. storm::storage::SparseMatrix<double> lu;
  368. ASSERT_NO_THROW(lu = luBuilder.build());
  369. storm::storage::SparseMatrixBuilder<double> dinvBuilder(4, 4, 4);
  370. ASSERT_NO_THROW(dinvBuilder.addNextValue(0, 0, 1 / 1.1));
  371. ASSERT_NO_THROW(dinvBuilder.addNextValue(1, 1, 1 / 0.5));
  372. ASSERT_NO_THROW(dinvBuilder.addNextValue(2, 2, 1 / 0.99));
  373. ASSERT_NO_THROW(dinvBuilder.addNextValue(3, 3, 1 / 0.11));
  374. storm::storage::SparseMatrix<double> dinv;
  375. ASSERT_NO_THROW(dinv = dinvBuilder.build());
  376. ASSERT_TRUE(lu == jacobiDecomposition.first);
  377. ASSERT_TRUE(dinv == jacobiDecomposition.second);
  378. }
  379. TEST(SparseMatrix, PointwiseMultiplicationVector) {
  380. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  381. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  382. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  383. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  384. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  385. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  386. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  387. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  388. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  389. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  390. storm::storage::SparseMatrix<double> matrix;
  391. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  392. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(5, 4, 9);
  393. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  394. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 2, 1.2));
  395. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 0.5));
  396. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  397. ASSERT_NO_THROW(matrixBuilder2.addNextValue(2, 0, 0.5));
  398. ASSERT_NO_THROW(matrixBuilder2.addNextValue(3, 2, 1.1));
  399. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 0, 0.1));
  400. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 1, 0.2));
  401. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 3, 0.3));
  402. storm::storage::SparseMatrix<double> matrix2;
  403. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  404. ASSERT_NO_THROW(std::vector<double> pointwiseProductRowSums = matrix.getPointwiseProductRowSumVector(matrix2));
  405. std::vector<double> pointwiseProductRowSums = matrix.getPointwiseProductRowSumVector(matrix2);
  406. 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};
  407. ASSERT_TRUE(pointwiseProductRowSums == correctResult);
  408. }
  409. TEST(SparseMatrix, MatrixVectorMultiply) {
  410. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  411. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  412. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  413. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  414. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  415. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  416. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  417. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  418. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  419. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  420. storm::storage::SparseMatrix<double> matrix;
  421. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  422. std::vector<double> x = {1, 0.3, 1.4, 7.1};
  423. std::vector<double> result(matrix.getRowCount());
  424. ASSERT_NO_THROW(matrix.multiplyWithVector(x, result));
  425. 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};
  426. ASSERT_TRUE(result == correctResult);
  427. }
  428. TEST(SparseMatrix, Iteration) {
  429. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 9);
  430. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  431. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  432. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  433. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  434. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 0.5));
  435. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  436. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  437. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  438. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  439. storm::storage::SparseMatrix<double> matrix;
  440. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  441. for (auto const& entry : matrix.getRow(4)) {
  442. if (entry.first == 0) {
  443. ASSERT_EQ(0.1, entry.second);
  444. } else if (entry.first == 1) {
  445. ASSERT_EQ(0.2, entry.second);
  446. } else if (entry.first == 3) {
  447. ASSERT_EQ(0.3, entry.second);
  448. } else {
  449. ASSERT_TRUE(false);
  450. }
  451. }
  452. for (storm::storage::SparseMatrix<double>::iterator it = matrix.begin(4), ite = matrix.end(4); it != ite; ++it) {
  453. if (it->first == 0) {
  454. ASSERT_EQ(0.1, it->second);
  455. } else if (it->first == 1) {
  456. ASSERT_EQ(0.2, it->second);
  457. } else if (it->first == 3) {
  458. ASSERT_EQ(0.3, it->second);
  459. } else {
  460. ASSERT_TRUE(false);
  461. }
  462. }
  463. }
  464. TEST(SparseMatrix, RowSum) {
  465. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 8);
  466. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  467. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  468. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  469. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  470. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  471. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  472. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  473. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  474. storm::storage::SparseMatrix<double> matrix;
  475. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  476. ASSERT_EQ(0, matrix.getRowSum(2));
  477. ASSERT_EQ(0.1+0.2+0.3, matrix.getRowSum(4));
  478. }
  479. TEST(SparseMatrix, IsSubmatrix) {
  480. storm::storage::SparseMatrixBuilder<double> matrixBuilder(5, 4, 8);
  481. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  482. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 2, 1.2));
  483. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 0.5));
  484. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 0.7));
  485. ASSERT_NO_THROW(matrixBuilder.addNextValue(3, 2, 1.1));
  486. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 0, 0.1));
  487. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 1, 0.2));
  488. ASSERT_NO_THROW(matrixBuilder.addNextValue(4, 3, 0.3));
  489. storm::storage::SparseMatrix<double> matrix;
  490. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  491. storm::storage::SparseMatrixBuilder<double> matrixBuilder2(5, 4, 5);
  492. ASSERT_NO_THROW(matrixBuilder2.addNextValue(0, 1, 1.0));
  493. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 0, 0.5));
  494. ASSERT_NO_THROW(matrixBuilder2.addNextValue(1, 1, 0.7));
  495. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 0, 0.1));
  496. ASSERT_NO_THROW(matrixBuilder2.addNextValue(4, 1, 0.2));
  497. storm::storage::SparseMatrix<double> matrix2;
  498. ASSERT_NO_THROW(matrix2 = matrixBuilder2.build());
  499. ASSERT_TRUE(matrix2.isSubmatrixOf(matrix));
  500. storm::storage::SparseMatrixBuilder<double> matrixBuilder3(5, 4, 5);
  501. ASSERT_NO_THROW(matrixBuilder3.addNextValue(0, 3, 1.0));
  502. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 0, 0.5));
  503. ASSERT_NO_THROW(matrixBuilder3.addNextValue(1, 1, 0.7));
  504. ASSERT_NO_THROW(matrixBuilder3.addNextValue(4, 0, 0.1));
  505. ASSERT_NO_THROW(matrixBuilder3.addNextValue(4, 1, 0.2));
  506. storm::storage::SparseMatrix<double> matrix3;
  507. ASSERT_NO_THROW(matrix3 = matrixBuilder3.build());
  508. ASSERT_FALSE(matrix3.isSubmatrixOf(matrix));
  509. ASSERT_FALSE(matrix3.isSubmatrixOf(matrix2));
  510. }