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.

182 lines
6.0 KiB

  1. #include "gtest/gtest.h"
  2. #include "src/storage/SparseMatrix.h"
  3. #include "src/exceptions/InvalidStateException.h"
  4. #include "src/exceptions/OutOfRangeException.h"
  5. #include "storm-config.h"
  6. #ifdef STORM_HAVE_CUDAFORSTORM
  7. #include "cudaForStorm.h"
  8. TEST(CudaPlugin, SpMV_4x4) {
  9. storm::storage::SparseMatrixBuilder<double> matrixBuilder(4, 4, 10);
  10. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 1, 1.0));
  11. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 3, -1.0));
  12. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 0, 8.0));
  13. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 7.0));
  14. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 2, -5.0));
  15. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 3, 2.0));
  16. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 0, 2.0));
  17. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 1, 2.0));
  18. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 2, 4.0));
  19. ASSERT_NO_THROW(matrixBuilder.addNextValue(2, 3, 4.0));
  20. storm::storage::SparseMatrix<double> matrix;
  21. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  22. ASSERT_EQ(4, matrix.getRowCount());
  23. ASSERT_EQ(4, matrix.getColumnCount());
  24. ASSERT_EQ(10, matrix.getEntryCount());
  25. std::vector<double> x({0, 4, 1, 1});
  26. std::vector<double> b({0, 0, 0, 0});
  27. ASSERT_NO_THROW(basicValueIteration_spmv_uint64_double(matrix.getColumnCount(), matrix.__internal_getRowIndications(), matrix.__internal_getColumnsAndValues(), x, b));
  28. ASSERT_EQ(b.at(0), 3);
  29. ASSERT_EQ(b.at(1), 25);
  30. ASSERT_EQ(b.at(2), 16);
  31. ASSERT_EQ(b.at(3), 0);
  32. }
  33. TEST(CudaPlugin, SpMV_VerySmall) {
  34. storm::storage::SparseMatrixBuilder<double> matrixBuilder(2, 2, 2);
  35. ASSERT_NO_THROW(matrixBuilder.addNextValue(0, 0, 1.0));
  36. ASSERT_NO_THROW(matrixBuilder.addNextValue(1, 1, 2.0));
  37. storm::storage::SparseMatrix<double> matrix;
  38. ASSERT_NO_THROW(matrix = matrixBuilder.build());
  39. ASSERT_EQ(2, matrix.getRowCount());
  40. ASSERT_EQ(2, matrix.getColumnCount());
  41. ASSERT_EQ(2, matrix.getEntryCount());
  42. std::vector<double> x({ 4.0, 8.0 });
  43. std::vector<double> b({ 0.0, 0.0 });
  44. ASSERT_NO_THROW(basicValueIteration_spmv_uint64_double(matrix.getColumnCount(), matrix.__internal_getRowIndications(), matrix.__internal_getColumnsAndValues(), x, b));
  45. ASSERT_EQ(b.at(0), 4.0);
  46. ASSERT_EQ(b.at(1), 16.0);
  47. }
  48. TEST(CudaPlugin, AddVectorsInplace) {
  49. std::vector<double> vectorA_1 = { 0.0, 42.0, 21.4, 3.1415, 1.0, 7.3490390, 94093053905390.21, -0.000000000023 };
  50. std::vector<double> vectorA_2 = { 0.0, 42.0, 21.4, 3.1415, 1.0, 7.3490390, 94093053905390.21, -0.000000000023 };
  51. std::vector<double> vectorA_3 = { 0.0, 42.0, 21.4, 3.1415, 1.0, 7.3490390, 94093053905390.21, -0.000000000023 };
  52. std::vector<double> vectorB = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
  53. std::vector<double> vectorC = { -5000.0, -5000.0, -5000.0, -5000.0, -5000.0, -5000.0, -5000.0, -5000.0 };
  54. ASSERT_EQ(vectorA_1.size(), 8);
  55. ASSERT_EQ(vectorA_2.size(), 8);
  56. ASSERT_EQ(vectorA_3.size(), 8);
  57. ASSERT_EQ(vectorB.size(), 8);
  58. ASSERT_EQ(vectorC.size(), 8);
  59. ASSERT_NO_THROW(basicValueIteration_addVectorsInplace_double(vectorA_1, vectorB));
  60. ASSERT_NO_THROW(basicValueIteration_addVectorsInplace_double(vectorA_2, vectorC));
  61. ASSERT_EQ(vectorA_1.size(), 8);
  62. ASSERT_EQ(vectorA_2.size(), 8);
  63. ASSERT_EQ(vectorA_3.size(), 8);
  64. ASSERT_EQ(vectorB.size(), 8);
  65. ASSERT_EQ(vectorC.size(), 8);
  66. for (size_t i = 0; i < vectorA_3.size(); ++i) {
  67. double cpu_result_b = vectorA_3.at(i) + vectorB.at(i);
  68. double cpu_result_c = vectorA_3.at(i) + vectorC.at(i);
  69. ASSERT_EQ(cpu_result_b, vectorA_1.at(i));
  70. ASSERT_EQ(cpu_result_c, vectorA_2.at(i));
  71. }
  72. }
  73. TEST(CudaPlugin, ReduceGroupedVector) {
  74. std::vector<double> groupedVector = {
  75. 0.0, -1000.0, 0.000004, // Group 0
  76. 5.0, // Group 1
  77. 0.0, 1.0, 2.0, 3.0, // Group 2
  78. -1000.0, -3.14, -0.0002,// Group 3 (neg only)
  79. 25.25, 25.25, 25.25, // Group 4
  80. 0.0, 0.0, 1.0, // Group 5
  81. -0.000001, 0.000001 // Group 6
  82. };
  83. std::vector<uint_fast64_t> grouping = {
  84. 0, 3, 4, 8, 11, 14, 17, 19
  85. };
  86. std::vector<double> result_minimize = {
  87. -1000.0, // Group 0
  88. 5.0,
  89. 0.0,
  90. -1000.0,
  91. 25.25,
  92. 0.0,
  93. -0.000001
  94. };
  95. std::vector<double> result_maximize = {
  96. 0.000004,
  97. 5.0,
  98. 3.0,
  99. -0.0002,
  100. 25.25,
  101. 1.0,
  102. 0.000001
  103. };
  104. std::vector<double> result_cuda_minimize = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
  105. std::vector<double> result_cuda_maximize = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
  106. ASSERT_NO_THROW(basicValueIteration_reduceGroupedVector_uint64_double_minimize(groupedVector, grouping, result_cuda_minimize));
  107. ASSERT_NO_THROW(basicValueIteration_reduceGroupedVector_uint64_double_maximize(groupedVector, grouping, result_cuda_maximize));
  108. for (size_t i = 0; i < result_minimize.size(); ++i) {
  109. ASSERT_EQ(result_minimize.at(i), result_cuda_minimize.at(i));
  110. ASSERT_EQ(result_maximize.at(i), result_cuda_maximize.at(i));
  111. }
  112. }
  113. TEST(CudaPlugin, equalModuloPrecision) {
  114. std::vector<double> x = {
  115. 123.45L, 67.8L, 901.23L, 456789.012L, 3.456789L, -4567890.12L
  116. };
  117. std::vector<double> y1 = {
  118. 0.45L, 0.8L, 0.23L, 0.012L, 0.456789L, -0.12L
  119. };
  120. std::vector<double> y2 = {
  121. 0.45L, 0.8L, 0.23L, 456789.012L, 0.456789L, -4567890.12L
  122. };
  123. std::vector<double> x2;
  124. std::vector<double> x3;
  125. std::vector<double> y3;
  126. std::vector<double> y4;
  127. x2.reserve(1000);
  128. x3.reserve(1000);
  129. y3.reserve(1000);
  130. y4.reserve(1000);
  131. for (size_t i = 0; i < 1000; ++i) {
  132. x2.push_back(static_cast<double>(i));
  133. y3.push_back(1.0);
  134. x3.push_back(-(1000.0 - static_cast<double>(i)));
  135. y4.push_back(1.0);
  136. }
  137. double maxElement1 = 0.0L;
  138. double maxElement2 = 0.0L;
  139. double maxElement3 = 0.0L;
  140. double maxElement4 = 0.0L;
  141. ASSERT_NO_THROW(basicValueIteration_equalModuloPrecision_double_NonRelative(x, y1, maxElement1));
  142. ASSERT_NO_THROW(basicValueIteration_equalModuloPrecision_double_NonRelative(x, y2, maxElement2));
  143. ASSERT_NO_THROW(basicValueIteration_equalModuloPrecision_double_Relative(x2, y3, maxElement3));
  144. ASSERT_NO_THROW(basicValueIteration_equalModuloPrecision_double_Relative(x3, y4, maxElement4));
  145. ASSERT_DOUBLE_EQ(4567890.0L, maxElement1);
  146. ASSERT_DOUBLE_EQ(901.0L, maxElement2);
  147. ASSERT_DOUBLE_EQ(998.0L, maxElement3);
  148. ASSERT_DOUBLE_EQ(1001.0L, maxElement4);
  149. }
  150. #endif