summaryrefslogtreecommitdiff
path: root/src/Nerve_GIC
diff options
context:
space:
mode:
authormcarrier <mcarrier@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2018-09-20 21:44:01 +0000
committermcarrier <mcarrier@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2018-09-20 21:44:01 +0000
commitcae907acde52894ea1a20f3a0c0c22538c1b4128 (patch)
tree1d82fb3e45417408d8e927d7938c6527d91f2084 /src/Nerve_GIC
parent24683e8d0134e7ede7033f05b83c44dd72ff7e3a (diff)
fixed small bug on persistence diagrams
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/Nerve_GIC@3901 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: cbeecd2f928b4c4df13acf5a7a2083882fdc98d2
Diffstat (limited to 'src/Nerve_GIC')
-rw-r--r--src/Nerve_GIC/include/gudhi/GIC.h55
1 files changed, 39 insertions, 16 deletions
diff --git a/src/Nerve_GIC/include/gudhi/GIC.h b/src/Nerve_GIC/include/gudhi/GIC.h
index 242ecf7d..30f89d65 100644
--- a/src/Nerve_GIC/include/gudhi/GIC.h
+++ b/src/Nerve_GIC/include/gudhi/GIC.h
@@ -397,12 +397,16 @@ class Cover_complex {
*/
template <class InputRange>
void set_distances_from_range(InputRange const & distance_matrix) {
- n = distance_matrix.size(); data_dimension = 0; point_cloud_name = "matrix";
- for(int i = 0; i < n; i++){
- point_cloud.emplace_back();
- boost::add_vertex(one_skeleton_OFF);
- vertices.push_back(boost::add_vertex(one_skeleton));
- cover.emplace_back();
+ if(point_cloud.size() == 0){
+ n = distance_matrix.size();
+ point_cloud_name = "matrix";
+ data_dimension = 0;
+ for(int i = 0; i < n; i++){
+ point_cloud.emplace_back();
+ boost::add_vertex(one_skeleton_OFF);
+ vertices.push_back(boost::add_vertex(one_skeleton));
+ cover.emplace_back();
+ }
}
distances = distance_matrix;
}
@@ -536,9 +540,17 @@ class Cover_complex {
*
*/
void set_function_from_coordinate(int k) {
- for (int i = 0; i < n; i++) func.push_back(point_cloud[i][k]);
- functional_cover = true;
- cover_name = "coordinate " + std::to_string(k);
+ if(point_cloud[0].size() > 0){
+ for (int i = 0; i < n; i++) func.push_back(point_cloud[i][k]);
+ functional_cover = true;
+ cover_name = "coordinate " + std::to_string(k);
+ }
+ else{
+ std::cout << "Only pairwise distances provided---cannot access " << k << "th coordinate; returning null vector instead" << std::endl;
+ for (int i = 0; i < n; i++) func.push_back(0.0);
+ functional_cover = true;
+ cover_name = "null";
+ }
}
public: // Set function from vector.
@@ -989,9 +1001,17 @@ class Cover_complex {
*
*/
void set_color_from_coordinate(int k = 0) {
- for (int i = 0; i < n; i++) func_color.push_back(point_cloud[i][k]);
- color_name = "coordinate ";
- color_name.append(std::to_string(k));
+ if(point_cloud[0].size() > 0){
+ for (int i = 0; i < n; i++) func_color.push_back(point_cloud[i][k]);
+ color_name = "coordinate ";
+ color_name.append(std::to_string(k));
+ }
+ else{
+ std::cout << "Only pairwise distances provided---cannot access " << k << "th coordinate; returning null vector instead" << std::endl;
+ for (int i = 0; i < n; i++) func.push_back(0.0);
+ functional_cover = true;
+ cover_name = "null";
+ }
}
public: // Set color from vector.
@@ -1157,15 +1177,18 @@ class Cover_complex {
// Build filtration
for (auto const& simplex : simplices) {
- std::vector<int> splx = simplex; splx.push_back(-2);
+ std::vector<int> splx = simplex;
+ splx.push_back(-2);
st.insert_simplex_and_subfaces(splx, -3);
}
for (std::map<int, double>::iterator it = cover_std.begin(); it != cover_std.end(); it++) {
int vertex = it->first; float val = it->second;
int vert[] = {vertex}; int edge[] = {vertex, -2};
- st.assign_filtration(st.find(vert), -2 + (val - minf)/(maxf - minf));
- st.assign_filtration(st.find(edge), 2 - (val - minf)/(maxf - minf));
+ if(st.find(vert) != st.null_simplex()){
+ st.assign_filtration(st.find(vert), -2 + (val - minf)/(maxf - minf));
+ st.assign_filtration(st.find(edge), 2 - (val - minf)/(maxf - minf));
+ }
}
st.make_filtration_non_decreasing();
@@ -1267,7 +1290,7 @@ class Cover_complex {
unsigned int N = distribution.size();
double level = 1;
for (unsigned int i = 0; i < N; i++)
- if (distribution[i] > d){ level = i * 1.0 / N; break; }
+ if (distribution[i] >= d){ level = i * 1.0 / N; break; }
if (verbose) std::cout << "Confidence level of distance " << d << " is " << level << std::endl;
return level;
}