Browse Source

Fix issue with dijkstra algorithm (#1497)

* Use ::max vs ::infinity in dijkstra

* Add test case for discrete dijkstra distances

* Update dijkstra.cpp

* Explicit template instantiation for dijkstra test

Co-authored-by: Jérémie Dumas <[email protected]>
Kenneth Blomqvist 5 years ago
parent
commit
1df0987271
2 changed files with 21 additions and 2 deletions
  1. 3 2
      include/igl/dijkstra.cpp
  2. 18 0
      tests/include/igl/dijkstra.cpp

+ 3 - 2
include/igl/dijkstra.cpp

@@ -1,7 +1,7 @@
 // This file is part of libigl, a simple c++ geometry processing library.
 // 
 // Copyright (C) 2016 Alec Jacobson <[email protected]>
-// 
+//
 // This Source Code Form is subject to the terms of the Mozilla Public License 
 // v. 2.0. If a copy of the MPL was not distributed with this file, You can 
 // obtain one at http://mozilla.org/MPL/2.0/.
@@ -17,7 +17,7 @@ IGL_INLINE int igl::dijkstra(
   Eigen::PlainObjectBase<DerivedP> &previous)
 {
   int numV = VV.size();
-  min_distance.setConstant(numV, 1, std::numeric_limits<typename DerivedD::Scalar>::infinity());
+  min_distance.setConstant(numV, 1, std::numeric_limits<typename DerivedD::Scalar>::max());
   min_distance[source] = 0;
   previous.setConstant(numV, 1, -1);
   std::set<std::pair<typename DerivedD::Scalar, IndexType> > vertex_queue;
@@ -132,6 +132,7 @@ IGL_INLINE int igl::dijkstra(
 #ifdef IGL_STATIC_LIBRARY
 // Explicit template instantiation
 template int igl::dijkstra<int, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, std::set<int, std::less<int>, std::allocator<int> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
+template int igl::dijkstra<int, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, std::set<int, std::less<int>, std::allocator<int> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::dijkstra<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<int, std::allocator<int> >&);
 template int igl::dijkstra<int, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, int const&, std::set<int, std::less<int>, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 #endif

+ 18 - 0
tests/include/igl/dijkstra.cpp

@@ -20,3 +20,21 @@ TEST_CASE("dijkstra: cube", "[igl]")
   REQUIRE(min_distance(0) == 0);
   REQUIRE(min_distance(7) == Approx(sqrt(2)).margin(1e-10));
 }
+
+TEST_CASE("dijkstra: discrete distances", "[igl]")
+{
+  Eigen::MatrixXd V;
+  Eigen::MatrixXi F;
+  igl::read_triangle_mesh(test_common::data_path("cube.off"), V, F);
+
+  std::vector<std::vector<int>> VV;
+  igl::adjacency_list(F, VV);
+
+  Eigen::VectorXi min_distance, previous;
+  int out = igl::dijkstra(0, {3}, VV, min_distance, previous);
+  REQUIRE(out != -1);
+  REQUIRE(out == 3);
+  REQUIRE(min_distance[3] == 1);
+  REQUIRE(min_distance[0] == 0);
+}
+