summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt5
-rw-r--r--src/Alpha_complex/example/CMakeLists.txt6
-rw-r--r--src/Alpha_complex/include/gudhi/Alpha_complex.h67
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree.h10
-rw-r--r--src/common/example/CMakeLists.txt4
-rw-r--r--src/common/example/Delaunay_triangulation_off_rw.cpp5
-rw-r--r--src/common/include/gudhi/Debug_utils.h24
-rw-r--r--src/common/include/gudhi/Delaunay_triangulation_off_io.h19
9 files changed, 86 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b7fb4540..197b6f95 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,11 +8,6 @@ if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
-if (CMAKE_BUILD_TYPE MATCHES Debug)
- # For programs to be more verbose
- add_definitions(-DNDEBUG)
-endif()
-
enable_testing()
set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/")
diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt
index 47e42b72..10b87f04 100644
--- a/src/Alpha_complex/example/CMakeLists.txt
+++ b/src/Alpha_complex/example/CMakeLists.txt
@@ -1,8 +1,6 @@
cmake_minimum_required(VERSION 2.6)
project(GUDHIAlphaShapesExample)
-add_executable ( flat flat.cpp )
-
# need CGAL 4.7
# cmake -DCGAL_DIR=~/workspace/CGAL-4.7-Ic-41 ../../..
if(CGAL_FOUND)
@@ -29,6 +27,10 @@ if(CGAL_FOUND)
if (EIGEN3_FOUND)
message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
include( ${EIGEN3_USE_FILE} )
+ if (CMAKE_BUILD_TYPE MATCHES Debug)
+ # For programs to be more verbose
+ add_definitions(-DDEBUG_TRACES)
+ endif()
add_executable ( alphaoffreader Alpha_complex_from_off.cpp )
target_link_libraries(alphaoffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h
index 2cc93a0a..6adfa2e6 100644
--- a/src/Alpha_complex/include/gudhi/Alpha_complex.h
+++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h
@@ -114,7 +114,7 @@ class Alpha_complex : public Simplex_tree<> {
: triangulation_(nullptr) {
Gudhi::Delaunay_triangulation_off_reader<Delaunay_triangulation> off_reader(off_file_name);
if (!off_reader.is_valid()) {
- std::cerr << "Alpha_complex - Unable to read file " << off_file_name;
+ std::cerr << "Alpha_complex - Unable to read file " << off_file_name << "\n";
exit(-1); // ----- >>
}
triangulation_ = off_reader.get_complex();
@@ -161,7 +161,7 @@ class Alpha_complex : public Simplex_tree<> {
size_type inserted = triangulation_->insert(first, last);
if (inserted != (last -first)) {
- std::cerr << "Alpha_complex - insertion failed " << inserted << " != " << (last -first);
+ std::cerr << "Alpha_complex - insertion failed " << inserted << " != " << (last -first) << "\n";
exit(-1); // ----- >>
}
init(max_alpha_square);
@@ -198,19 +198,19 @@ class Alpha_complex : public Simplex_tree<> {
*/
void init(Filtration_value max_alpha_square) {
if (triangulation_ == nullptr) {
- std::cerr << "Alpha_complex init - Cannot init from a NULL triangulation";
+ std::cerr << "Alpha_complex init - Cannot init from a NULL triangulation\n";
return; // ----- >>
}
if (triangulation_->number_of_vertices() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a triangulation without vertices";
+ std::cerr << "Alpha_complex init - Cannot init from a triangulation without vertices\n";
return; // ----- >>
}
if (triangulation_->maximal_dimension() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a zero-dimension triangulation";
+ std::cerr << "Alpha_complex init - Cannot init from a zero-dimension triangulation\n";
return; // ----- >>
}
if (num_vertices() > 0) {
- std::cerr << "Alpha_complex init - Cannot init twice";
+ std::cerr << "Alpha_complex init - Cannot init twice\n";
return; // ----- >>
}
@@ -225,8 +225,9 @@ class Alpha_complex : public Simplex_tree<> {
// Loop on triangulation vertices list
for (CGAL_vertex_iterator vit = triangulation_->vertices_begin(); vit != triangulation_->vertices_end(); ++vit) {
if (!triangulation_->is_infinite(*vit)) {
- DBGMSG("Vertex insertion - ", vertex_handle);
- DBGMSG(" -> ", vit->point());
+#ifdef DEBUG_TRACES
+ std::cout << "Vertex insertion - " << vertex_handle << " -> " << vit->point() << std::endl;
+#endif // DEBUG_TRACES
vertex_iterator_to_handle_.emplace(vit, vertex_handle);
vertex_handle_to_iterator_.push_back(vit);
@@ -239,12 +240,21 @@ class Alpha_complex : public Simplex_tree<> {
// Simplex_tree construction from loop on triangulation finite full cells list
for (auto cit = triangulation_->finite_full_cells_begin(); cit != triangulation_->finite_full_cells_end(); ++cit) {
Vector_vertex vertexVector;
+#ifdef DEBUG_TRACES
+ std::cout << "Simplex_tree insertion ";
+#endif // DEBUG_TRACES
for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
if (*vit != nullptr) {
+#ifdef DEBUG_TRACES
+ std::cout << " " << vertex_iterator_to_handle_[*vit];
+#endif // DEBUG_TRACES
// Vector of vertex construction for simplex_tree structure
vertexVector.push_back(vertex_iterator_to_handle_[*vit]);
}
}
+#ifdef DEBUG_TRACES
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
// Insert each simplex and its subfaces in the simplex tree - filtration is NaN
Simplex_result insert_result = insert_simplex_and_subfaces(vertexVector,
std::numeric_limits<double>::quiet_NaN());
@@ -259,11 +269,18 @@ class Alpha_complex : public Simplex_tree<> {
int f_simplex_dim = dimension(f_simplex);
if (decr_dim == f_simplex_dim) {
Vector_of_CGAL_points pointVector;
- DBGMSG("Sigma of dim ", decr_dim);
+#ifdef DEBUG_TRACES
+ std::cout << "Sigma of dim " << decr_dim << " is";
+#endif // DEBUG_TRACES
for (auto vertex : simplex_vertex_range(f_simplex)) {
pointVector.push_back(get_point(vertex));
+#ifdef DEBUG_TRACES
+ std::cout << " " << vertex;
+#endif // DEBUG_TRACES
}
- DBGCONT(simplex_vertex_range(f_simplex));
+#ifdef DEBUG_TRACES
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
// ### If filt(Sigma) is NaN : filt(Sigma) = alpha(Sigma)
if (isnan(filtration(f_simplex))) {
Filtration_value alpha_complex_filtration = 0.0;
@@ -275,7 +292,9 @@ class Alpha_complex : public Simplex_tree<> {
alpha_complex_filtration = squared_radius(pointVector.begin(), pointVector.end());
}
assign_filtration(f_simplex, alpha_complex_filtration);
- DBGMSG("filt(Sigma) is NaN : filt(Sigma) =", filtration(f_simplex));
+#ifdef DEBUG_TRACES
+ std::cout << "filt(Sigma) is NaN : filt(Sigma) =" << filtration(f_simplex) << std::endl;
+#endif // DEBUG_TRACES
}
propagate_alpha_filtration(f_simplex, decr_dim);
}
@@ -295,16 +314,23 @@ class Alpha_complex : public Simplex_tree<> {
void propagate_alpha_filtration(Simplex_handle f_simplex, int decr_dim) {
// ### Foreach Tau face of Sigma
for (auto f_boundary : boundary_simplex_range(f_simplex)) {
- DBG("------------- TAU -------------");
- DBGCONT(simplex_vertex_range(f_boundary));
- DBG("is a face of Sigma");
- DBGMSG("isnan(filtration(Tau)=", isnan(filtration(f_boundary)));
+#ifdef DEBUG_TRACES
+ std::cout << " | --------------------------------------------------\n";
+ std::cout << " | Tau ";
+ for (auto vertex : simplex_vertex_range(f_boundary)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << "is a face of Sigma\n";
+ std::cout << " | isnan(filtration(Tau)=" << isnan(filtration(f_boundary)) << std::endl;
+#endif // DEBUG_TRACES
// ### If filt(Tau) is not NaN
if (!isnan(filtration(f_boundary))) {
// ### filt(Tau) = fmin(filt(Tau), filt(Sigma))
Filtration_value alpha_complex_filtration = fmin(filtration(f_boundary), filtration(f_simplex));
assign_filtration(f_boundary, alpha_complex_filtration);
- DBGMSG("filt(Tau) = fmin(filt(Tau), filt(Sigma)) = ", filtration(f_boundary));
+#ifdef DEBUG_TRACES
+ std::cout << " | filt(Tau) = fmin(filt(Tau), filt(Sigma)) = " << filtration(f_boundary) << std::endl;
+#endif // DEBUG_TRACES
// ### Else
} else {
// No need to compute is_gabriel for dimension <= 2
@@ -331,14 +357,17 @@ class Alpha_complex : public Simplex_tree<> {
Is_Gabriel is_gabriel = kernel_.side_of_bounded_sphere_d_object();
bool is_gab = is_gabriel(pointVector.begin(), pointVector.end(), point_for_gabriel)
!= CGAL::ON_BOUNDED_SIDE;
- DBGMSG("Tau is_gabriel(Sigma)=", is_gab);
- DBGMSG(" - vertexForGabriel=", vertexForGabriel);
+#ifdef DEBUG_TRACES
+ std::cout << " | Tau is_gabriel(Sigma)=" << is_gab << " - vertexForGabriel=" << vertexForGabriel << std::endl;
+#endif // DEBUG_TRACES
// ### If Tau is not Gabriel of Sigma
if (false == is_gab) {
// ### filt(Tau) = filt(Sigma)
Filtration_value alpha_complex_filtration = filtration(f_simplex);
assign_filtration(f_boundary, alpha_complex_filtration);
- DBGMSG("filt(Tau) = filt(Sigma) = ", filtration(f_boundary));
+#ifdef DEBUG_TRACES
+ std::cout << " | filt(Tau) = filt(Sigma) = " << filtration(f_boundary) << std::endl;
+#endif // DEBUG_TRACES
}
}
}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0f946e3b..9d1eac80 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -8,11 +8,6 @@ if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
-if (CMAKE_BUILD_TYPE MATCHES Debug)
- # For programs to be more verbose
- add_definitions(-DNDEBUG)
-endif()
-
enable_testing()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h
index dc8591fc..9b4d6af6 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h
@@ -1173,17 +1173,19 @@ class Simplex_tree {
/** \brief Remove a maximal simplex.
* @param[in] sh Simplex handle on the maximal simplex to remove.
+ * \pre Please check the simplex has no coface before removing it.
* \warning In debug mode, the exception std::invalid_argument is thrown if sh has children.
*/
void remove_maximal_simplex(Simplex_handle sh) {
// Guarantee the simplex has no children
GUDHI_CHECK(has_children(sh),
- std::invalid_argument ("Simplex_tree::remove_maximal_simplex - argument is not a maximal simplex"));
-
- // Simplex is a leaf, it means the child is the Siblings owning the leaf.
+ std::invalid_argument ("Simplex_tree::remove_maximal_simplex - argument has children"));
+
+ // Simplex is a leaf, it means the child is the Siblings owning the leaf
Siblings* child = sh->second.children();
- if (child->size() > 1) {
+ if ((child->size() > 1) || (child == root())) {
// Not alone, just remove it from members
+ // Special case when child is the root of the simplex tree, just remove it from members
child->members().erase(sh->first);
} else {
// Sibling is emptied : must be deleted, and its parent must point on his own Sibling
diff --git a/src/common/example/CMakeLists.txt b/src/common/example/CMakeLists.txt
index d29e31e7..089f0c04 100644
--- a/src/common/example/CMakeLists.txt
+++ b/src/common/example/CMakeLists.txt
@@ -26,6 +26,10 @@ if(CGAL_FOUND)
if (EIGEN3_FOUND)
message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
include( ${EIGEN3_USE_FILE} )
+ if (CMAKE_BUILD_TYPE MATCHES Debug)
+ # For programs to be more verbose
+ add_definitions(-DDEBUG_TRACES)
+ endif()
add_executable ( dtoffrw Delaunay_triangulation_off_rw.cpp )
target_link_libraries(dtoffrw ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
diff --git a/src/common/example/Delaunay_triangulation_off_rw.cpp b/src/common/example/Delaunay_triangulation_off_rw.cpp
index 12accd10..75e4fafb 100644
--- a/src/common/example/Delaunay_triangulation_off_rw.cpp
+++ b/src/common/example/Delaunay_triangulation_off_rw.cpp
@@ -24,11 +24,6 @@ int main(int argc, char **argv) {
usage(argv[0]);
}
-
-#ifdef GUDHI_NDEBUG
- std::cout << "pouet pouet !!" << std::endl;
-#endif
-
std::string offInputFile(argv[1]);
// Read the OFF file (input file name given as parameter) and triangulates points
Gudhi::Delaunay_triangulation_off_reader<T> off_reader(offInputFile);
diff --git a/src/common/include/gudhi/Debug_utils.h b/src/common/include/gudhi/Debug_utils.h
index c479d435..48d61fef 100644
--- a/src/common/include/gudhi/Debug_utils.h
+++ b/src/common/include/gudhi/Debug_utils.h
@@ -24,14 +24,23 @@
#include <iostream>
-#ifdef NDEBUG
- // GUDHI_NDEBUG is the Gudhi official flag for debug mode.
- #define GUDHI_NDEBUG
+#ifndef NDEBUG
+ // GUDHI_DEBUG is the Gudhi official flag for debug mode.
+ #define GUDHI_DEBUG
+#endif
+
+// GUDHI_CHECK throw an exception on condition in debug mode, but does nothing in release mode
+// Could assert in release mode, but cmake sets NDEBUG (for "NO DEBUG") in this mode, means assert does nothing.
+#ifdef GUDHI_DEBUG
+ #define GUDHI_CHECK(cond, excpt) if (cond) throw excpt
+#else
+ #define GUDHI_CHECK(cond, excpt) (void) 0
#endif
#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)" << std::endl
-#ifdef GUDHI_NDEBUG
+// #define DBG_VERBOSE
+#ifdef DBG_VERBOSE
#define DBG(a) std::cout << "DBG: " << (a) << std::endl
#define DBGMSG(a, b) std::cout << "DBG: " << a << b << std::endl
#define DBGVALUE(a) std::cout << "DBG: " << #a << ": " << a << std::endl
@@ -43,11 +52,4 @@
#define DBGCONT(a) (void) 0
#endif
-// GUDHI_CHECK throw an exception on condition in debug mode, but does nothing in release mode
-#ifdef GUDHI_NDEBUG
- #define GUDHI_CHECK(cond, excpt) if (cond) throw excpt
-#else
- #define GUDHI_CHECK(cond, excpt) (void) 0
-#endif
-
#endif // DEBUG_UTILS_H_
diff --git a/src/common/include/gudhi/Delaunay_triangulation_off_io.h b/src/common/include/gudhi/Delaunay_triangulation_off_io.h
index dfa70e40..4d26bb71 100644
--- a/src/common/include/gudhi/Delaunay_triangulation_off_io.h
+++ b/src/common/include/gudhi/Delaunay_triangulation_off_io.h
@@ -22,8 +22,6 @@
#ifndef DELAUNAY_TRIANGULATION_OFF_IO_H_
#define DELAUNAY_TRIANGULATION_OFF_IO_H_
-#include <gudhi/Debug_utils.h>
-
#include <string>
#include <vector>
#include <fstream>
@@ -66,10 +64,10 @@ class Delaunay_triangulation_off_visitor_reader {
* @param[in] num_edges number of edges in the OFF file (not used).
*/
void init(int dim, int num_vertices, int num_faces, int num_edges) {
- DBGMSG("Delaunay_triangulation_off_visitor_reader::init - dim=", dim);
- DBGMSG(" - num_vertices=", num_vertices);
- DBGMSG(" - num_faces=", num_faces);
- DBGMSG(" - num_edges=", num_edges);
+#ifdef DEBUG_TRACES
+ std::cout << "Delaunay_triangulation_off_visitor_reader::init - dim=" << dim << " - num_vertices=" <<
+ num_vertices << " - num_faces=" << num_faces << " - num_edges=" << num_edges << std::endl;
+#endif // DEBUG_TRACES
if (num_faces > 0) {
std::cerr << "Delaunay_triangulation_off_visitor_reader::init faces are not taken into account from OFF " <<
"file for Delaunay triangulation - faces are computed." << std::endl;
@@ -90,8 +88,13 @@ class Delaunay_triangulation_off_visitor_reader {
* @param[in] point vector of vertex coordinates.
*/
void point(const std::vector<double>& point) {
- DBG("Delaunay_triangulation_off_visitor_reader::point");
- DBGCONT(point);
+#ifdef DEBUG_TRACES
+ std::cout << "Delaunay_triangulation_off_visitor_reader::point ";
+ for (auto coordinate : point) {
+ std::cout << coordinate << " | ";
+ }
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
complex_->insert(Point(point.size(), point.begin(), point.end()));
}