23 #ifndef PERSISTENCE_INTERVALS_H_ 24 #define PERSISTENCE_INTERVALS_H_ 27 #include <gudhi/read_persistence_from_file.h> 41 namespace Persistence_representations {
57 Persistence_intervals(
const char* filename,
unsigned dimension = std::numeric_limits<unsigned>::max());
70 double min_ = std::numeric_limits<int>::max();
71 double max_ = -std::numeric_limits<int>::max();
72 for (
size_t i = 0; i != this->intervals.size(); ++i) {
73 if (this->intervals[i].first < min_) min_ = this->intervals[i].first;
74 if (this->intervals[i].second > max_) max_ = this->intervals[i].second;
76 return std::make_pair(min_, max_);
83 double min_ = std::numeric_limits<int>::max();
84 double max_ = -std::numeric_limits<int>::max();
85 for (
size_t i = 0; i != this->intervals.size(); ++i) {
86 if (this->intervals[i].second < min_) min_ = this->intervals[i].second;
87 if (this->intervals[i].second > max_) max_ = this->intervals[i].second;
89 return std::make_pair(min_, max_);
102 std::vector<std::pair<double, double> >
dominant_intervals(
size_t where_to_cut = 100)
const;
134 size_t number_of_bins = 10)
const;
149 std::vector<double>
k_n_n(
size_t k,
size_t where_to_cut = 10)
const;
155 for (
size_t i = 0; i != intervals.intervals.size(); ++i) {
156 out << intervals.intervals[i].first <<
" " << intervals.intervals[i].second << std::endl;
164 void plot(
const char* filename,
double min_x = std::numeric_limits<double>::max(),
165 double max_x = std::numeric_limits<double>::max(),
double min_y = std::numeric_limits<double>::max(),
166 double max_y = std::numeric_limits<double>::max())
const {
170 std::stringstream gnuplot_script;
171 gnuplot_script << filename <<
"_GnuplotScript";
173 out.open(gnuplot_script.str().c_str());
175 std::pair<double, double> min_max_values = this->
get_x_range();
176 if (min_x == max_x) {
177 out <<
"set xrange [" << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) <<
" : " 178 << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) <<
" ]" << std::endl;
179 out <<
"set yrange [" << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) <<
" : " 180 << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) <<
" ]" << std::endl;
182 out <<
"set xrange [" << min_x <<
" : " << max_x <<
" ]" << std::endl;
183 out <<
"set yrange [" << min_y <<
" : " << max_y <<
" ]" << std::endl;
185 out <<
"plot '-' using 1:2 notitle \"" << filename <<
"\", \\" << std::endl;
186 out <<
" '-' using 1:2 notitle with lp" << std::endl;
187 for (
size_t i = 0; i != this->intervals.size(); ++i) {
188 out << this->intervals[i].first <<
" " << this->intervals[i].second << std::endl;
190 out <<
"EOF" << std::endl;
191 out << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) <<
" " 192 << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) << std::endl;
193 out << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) <<
" " 194 << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) << std::endl;
198 std::cout <<
"To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'" 199 << gnuplot_script.str().c_str() <<
"\'\"" << std::endl;
205 size_t size()
const {
return this->intervals.size(); }
211 inline std::pair<double, double>
operator[](
size_t i)
const {
212 if (i >= this->intervals.size())
throw(
"Index out of range! Operator [], one_d_gaussians class\n");
213 return this->intervals[i];
236 std::vector<double>
vectorize(
int number_of_function)
const {
248 std::vector<std::pair<double, double> > output_for_visualization() {
return this->intervals; }
251 void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
253 this->number_of_functions_for_vectorization = this->intervals.size();
254 this->number_of_functions_for_projections_to_reals = 1;
257 std::vector<std::pair<double, double> > intervals;
258 size_t number_of_functions_for_vectorization;
259 size_t number_of_functions_for_projections_to_reals;
263 if (dimension == std::numeric_limits<unsigned>::max()) {
264 this->intervals = read_persistence_intervals_in_one_dimension_from_file(filename);
266 this->intervals = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
268 this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
272 : intervals(intervals_) {
273 this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
277 std::vector<double> result(this->intervals.size());
278 for (
size_t i = 0; i != this->intervals.size(); ++i) {
279 result[i] = this->intervals[i].second - this->intervals[i].first;
281 std::sort(result.begin(), result.end(), std::greater<double>());
283 result.resize(std::min(where_to_cut, result.size()));
287 bool compare(
const std::pair<size_t, double>& first,
const std::pair<size_t, double>& second) {
288 return first.second > second.second;
293 std::vector<std::pair<size_t, double> > position_length_vector(this->intervals.size());
294 for (
size_t i = 0; i != this->intervals.size(); ++i) {
295 position_length_vector[i] = std::make_pair(i, this->intervals[i].second - this->intervals[i].first);
298 std::sort(position_length_vector.begin(), position_length_vector.end(), compare);
300 std::vector<std::pair<double, double> > result;
301 result.reserve(std::min(where_to_cut, position_length_vector.size()));
303 for (
size_t i = 0; i != std::min(where_to_cut, position_length_vector.size()); ++i) {
304 result.push_back(this->intervals[position_length_vector[i].first]);
306 std::cerr <<
"Position : " << position_length_vector[i].first <<
" length : " << position_length_vector[i].second
316 if (dbg) std::cerr <<
"this->intervals.size() : " << this->intervals.size() << std::endl;
318 double lengthOfLongest = 0;
319 for (
size_t i = 0; i != this->intervals.size(); ++i) {
320 if ((this->intervals[i].second - this->intervals[i].first) > lengthOfLongest) {
321 lengthOfLongest = this->intervals[i].second - this->intervals[i].first;
326 std::cerr <<
"lengthOfLongest : " << lengthOfLongest << std::endl;
330 std::vector<size_t> result(number_of_bins + 1, 0);
333 for (
size_t i = 0; i != this->intervals.size(); ++i) {
335 double relative_length_of_this_interval = (this->intervals[i].second - this->intervals[i].first) / lengthOfLongest;
338 size_t position = (size_t)(relative_length_of_this_interval * number_of_bins);
343 std::cerr <<
"i : " << i << std::endl;
344 std::cerr <<
"Interval : [" << this->intervals[i].first <<
" , " << this->intervals[i].second <<
" ] \n";
345 std::cerr <<
"relative_length_of_this_interval : " << relative_length_of_this_interval << std::endl;
346 std::cerr <<
"position : " << position << std::endl;
352 for (
size_t i = 0; i != result.size(); ++i) std::cerr << result[i] << std::endl;
359 std::vector<size_t> result(histogram.size());
362 for (
size_t i = 0; i != histogram.size(); ++i) {
370 size_t number_of_bins)
const {
373 std::vector<double> result(number_of_bins);
374 std::fill(result.begin(), result.end(), 0);
376 for (
size_t i = 0; i != this->intervals.size(); ++i) {
378 std::cerr <<
"Interval : " << this->intervals[i].first <<
" , " << this->intervals[i].second << std::endl;
382 if (this->intervals[i].first < x_min) beginIt = 0;
383 if (this->intervals[i].first >= x_max) beginIt = result.size();
384 if ((this->intervals[i].first > x_min) && (this->intervals[i].first < x_max)) {
385 beginIt = number_of_bins * (this->intervals[i].first - x_min) / (x_max - x_min);
389 if (this->intervals[i].second < x_min) endIt = 0;
390 if (this->intervals[i].second >= x_max) endIt = result.size();
391 if ((this->intervals[i].second > x_min) && (this->intervals[i].second < x_max)) {
392 endIt = number_of_bins * (this->intervals[i].second - x_min) / (x_max - x_min);
395 if (beginIt > endIt) {
400 std::cerr <<
"beginIt : " << beginIt << std::endl;
401 std::cerr <<
"endIt : " << endIt << std::endl;
404 for (
size_t pos = beginIt; pos != endIt; ++pos) {
405 result[pos] += ((x_max - x_min) / static_cast<double>(number_of_bins)) *
406 (this->intervals[i].second - this->intervals[i].first);
409 std::cerr <<
"Result at this stage \n";
410 for (
size_t aa = 0; aa != result.size(); ++aa) {
411 std::cerr << result[aa] <<
" ";
413 std::cerr << std::endl;
420 size_t number_of_bins)
const {
422 std::vector<double> result(intsOfBars.size());
424 for (
size_t i = 0; i != intsOfBars.size(); ++i) {
425 sum += intsOfBars[i];
431 template <
typename T>
432 bool compare_first_element_of_pair(
const std::pair<T, bool>& f,
const std::pair<T, bool>& s) {
433 return (f.first < s.first);
437 std::vector<std::pair<double, bool> > places_where_pbs_change(2 * this->intervals.size());
439 for (
size_t i = 0; i != this->intervals.size(); ++i) {
440 places_where_pbs_change[2 * i] = std::make_pair(this->intervals[i].first,
true);
441 places_where_pbs_change[2 * i + 1] = std::make_pair(this->intervals[i].second,
false);
444 std::sort(places_where_pbs_change.begin(), places_where_pbs_change.end(), compare_first_element_of_pair<double>);
446 std::vector<std::pair<double, size_t> > pbns(places_where_pbs_change.size());
447 for (
size_t i = 0; i != places_where_pbs_change.size(); ++i) {
448 if (places_where_pbs_change[i].second ==
true) {
453 pbns[i] = std::make_pair(places_where_pbs_change[i].first, pbn);
458 inline double compute_euclidean_distance(
const std::pair<double, double>& f,
const std::pair<double, double>& s) {
459 return sqrt((f.first - s.first) * (f.first - s.first) + (f.second - s.second) * (f.second - s.second));
465 std::cerr <<
"Here are the intervals : \n";
466 for (
size_t i = 0; i != this->intervals.size(); ++i) {
467 std::cerr <<
"[ " << this->intervals[i].first <<
" , " << this->intervals[i].second <<
"] \n";
472 std::vector<double> result;
475 std::vector<std::vector<double> > distances(this->intervals.size());
476 for (
size_t i = 0; i != this->intervals.size(); ++i) {
477 std::vector<double> aa(this->intervals.size());
478 std::fill(aa.begin(), aa.end(), 0);
481 std::vector<double> distances_from_diagonal(this->intervals.size());
482 std::fill(distances_from_diagonal.begin(), distances_from_diagonal.end(), 0);
484 for (
size_t i = 0; i != this->intervals.size(); ++i) {
485 std::vector<double> distancesFromI;
486 for (
size_t j = i + 1; j != this->intervals.size(); ++j) {
487 distancesFromI.push_back(compute_euclidean_distance(this->intervals[i], this->intervals[j]));
490 double distanceToDiagonal = compute_euclidean_distance(
491 this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
492 0.5 * (this->intervals[i].first + this->intervals[i].second)));
493 distances_from_diagonal[i] = distanceToDiagonal;
496 std::cerr <<
"Here are the distances form the point : [" << this->intervals[i].first <<
" , " 497 << this->intervals[i].second <<
"] in the diagram \n";
498 for (
size_t aa = 0; aa != distancesFromI.size(); ++aa) {
499 std::cerr <<
"To : " << i + aa <<
" : " << distancesFromI[aa] <<
" ";
501 std::cerr << std::endl;
506 for (
size_t j = i + 1; j != this->intervals.size(); ++j) {
507 distances[i][j] = distancesFromI[j - i - 1];
508 distances[j][i] = distancesFromI[j - i - 1];
512 std::cerr <<
"Here is the distance matrix : \n";
513 for (
size_t i = 0; i != distances.size(); ++i) {
514 for (
size_t j = 0; j != distances.size(); ++j) {
515 std::cerr << distances[i][j] <<
" ";
517 std::cerr << std::endl;
519 std::cerr << std::endl << std::endl <<
"And here are the distances to the diagonal : " << std::endl;
520 for (
size_t i = 0; i != distances_from_diagonal.size(); ++i) {
521 std::cerr << distances_from_diagonal[i] <<
" ";
523 std::cerr << std::endl << std::endl;
527 for (
size_t i = 0; i != this->intervals.size(); ++i) {
528 std::vector<double> distancesFromI = distances[i];
529 distancesFromI.push_back(distances_from_diagonal[i]);
532 std::sort(distancesFromI.begin(), distancesFromI.end(), std::greater<double>());
534 if (k > distancesFromI.size()) {
536 std::cerr <<
"There are not enough neighbors in your set. We set the result to plus infty \n";
538 result.push_back(std::numeric_limits<double>::max());
540 if (distances_from_diagonal[i] > distancesFromI[k]) {
542 std::cerr <<
"The k-th n.n. is on a diagonal. Therefore we set up a distance to diagonal \n";
544 result.push_back(distances_from_diagonal[i]);
546 result.push_back(distancesFromI[k]);
550 std::sort(result.begin(), result.end(), std::greater<double>());
551 result.resize(std::min(result.size(), where_to_cut));
559 for (
size_t i = 0; i != this->intervals.size(); ++i) {
561 (this->intervals[i].second - this->intervals[i].first) * (this->intervals[i].second - this->intervals[i].first);
570 #endif // PERSISTENCE_INTERVALS_H_ std::vector< std::pair< double, size_t > > compute_persistent_betti_numbers() const
Definition: Persistence_intervals.h:436
size_t size() const
Definition: Persistence_intervals.h:205
std::vector< double > characteristic_function_of_diagram(double x_min, double x_max, size_t number_of_bins=10) const
Definition: Persistence_intervals.h:369
std::vector< double > k_n_n(size_t k, size_t where_to_cut=10) const
Definition: Persistence_intervals.h:462
std::vector< double > vectorize(int number_of_function) const
Definition: Persistence_intervals.h:236
std::vector< std::pair< double, double > > dominant_intervals(size_t where_to_cut=100) const
Definition: Persistence_intervals.h:291
Definition: SimplicialComplexForAlpha.h:26
std::vector< double > length_of_dominant_intervals(size_t where_to_cut=100) const
Definition: Persistence_intervals.h:276
std::vector< size_t > histogram_of_lengths(size_t number_of_bins=10) const
Definition: Persistence_intervals.h:313
void plot(const char *filename, double min_x=std::numeric_limits< double >::max(), double max_x=std::numeric_limits< double >::max(), double min_y=std::numeric_limits< double >::max(), double max_y=std::numeric_limits< double >::max()) const
Definition: Persistence_intervals.h:164
std::pair< double, double > get_x_range() const
Definition: Persistence_intervals.h:69
Persistence_intervals(const char *filename, unsigned dimension=std::numeric_limits< unsigned >::max())
Definition: Persistence_intervals.h:262
Definition: Persistence_intervals.h:47
size_t number_of_vectorize_functions() const
Definition: Persistence_intervals.h:243
friend std::ostream & operator<<(std::ostream &out, const Persistence_intervals &intervals)
Definition: Persistence_intervals.h:154
std::vector< double > cumulative_characteristic_function_of_diagram(double x_min, double x_max, size_t number_of_bins=10) const
Definition: Persistence_intervals.h:419
std::pair< double, double > operator[](size_t i) const
Definition: Persistence_intervals.h:211
std::vector< size_t > cumulative_histogram_of_lengths(size_t number_of_bins=10) const
Definition: Persistence_intervals.h:357
double project_to_R(int number_of_function) const
Definition: Persistence_intervals.h:556
size_t number_of_projections_to_R() const
Definition: Persistence_intervals.h:230
std::pair< double, double > get_y_range() const
Definition: Persistence_intervals.h:82