slice_sorted.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <test_common.h>
  2. #include <igl/slice.h>
  3. #include <igl/slice_sorted.h>
  4. #include <random>
  5. namespace
  6. {
  7. Eigen::SparseMatrix<double> generate_random_sparse_matrix(int rows, int cols)
  8. {
  9. std::mt19937 gen;
  10. std::uniform_real_distribution<double> dist(0.0, 1.0);
  11. using T = Eigen::Triplet<double>;
  12. std::vector<T> tripletList;
  13. for (int i = 0; i < rows; ++i)
  14. {
  15. for (int j = 0; j < cols; ++j)
  16. {
  17. auto v_ij = dist(gen); // generate random number
  18. if (v_ij < 0.1)
  19. {
  20. tripletList.push_back(T(i, j, v_ij)); // if larger than treshold, insert it
  21. }
  22. }
  23. }
  24. Eigen::SparseMatrix<double> mat(rows, cols);
  25. mat.setFromTriplets(tripletList.begin(), tripletList.end()); // create the matrix
  26. return mat;
  27. }
  28. } // namespace
  29. TEST_CASE("slice_sorted: correctness", "[igl]")
  30. {
  31. constexpr int rows = 1e3;
  32. constexpr int cols = 1e3;
  33. Eigen::SparseMatrix<double> M = generate_random_sparse_matrix(rows, cols);
  34. Eigen::Matrix<int, Eigen::Dynamic, 1> R(rows / 2);
  35. Eigen::Matrix<int, Eigen::Dynamic, 1> C(cols / 2);
  36. for (int i = 0; i < rows; i += 2) R[i / 2] = i;
  37. for (int i = 0; i < cols; i += 2) C[i / 2] = i;
  38. SECTION("correctness")
  39. {
  40. // Check for correctness
  41. Eigen::SparseMatrix<double> A, B;
  42. igl::slice(M, R, C, A);
  43. igl::slice_sorted(M, R, C, B);
  44. REQUIRE((A - B).norm() == 0);
  45. }
  46. }
  47. TEST_CASE("slice_sorted: benchmark", "[igl]" IGL_DEBUG_OFF)
  48. {
  49. constexpr int rows = 1e3;
  50. constexpr int cols = 1e3;
  51. Eigen::SparseMatrix<double> M = generate_random_sparse_matrix(rows, cols);
  52. Eigen::Matrix<int, Eigen::Dynamic, 1> R(rows / 2);
  53. Eigen::Matrix<int, Eigen::Dynamic, 1> C(cols / 2);
  54. for (int i = 0; i < rows; i += 2) R[i / 2] = i;
  55. for (int i = 0; i < cols; i += 2) C[i / 2] = i;
  56. BENCHMARK("igl::slice") {
  57. Eigen::SparseMatrix<double> A;
  58. igl::slice(M, R, C, A);
  59. return A.norm();
  60. };
  61. BENCHMARK("igl::slice_sorted") {
  62. Eigen::SparseMatrix<double> A;
  63. igl::slice_sorted(M, R, C, A);
  64. return A.norm();
  65. };
  66. }