23 #ifndef PERSISTENCE_LANDSCAPE_H_ 24 #define PERSISTENCE_LANDSCAPE_H_ 27 #include <gudhi/read_persistence_from_file.h> 28 #include <gudhi/common_persistence_representations.h> 43 namespace Persistence_representations {
47 template <
typename operation>
83 size_t number_of_levels = std::numeric_limits<size_t>::max());
91 size_t number_of_levels = std::numeric_limits<size_t>::max());
134 template <
typename operation>
143 return operation_on_pair_of_landscapes<std::plus<double> >(land1, land2);
151 return operation_on_pair_of_landscapes<std::minus<double> >(land1, land2);
172 return first.multiply_lanscape_by_real_number_not_overwrite(con);
179 return first.multiply_lanscape_by_real_number_not_overwrite(con);
211 if (x == 0)
throw(
"In operator /=, division by 0. Program terminated.");
212 *
this = *
this * (1 / x);
231 if (this->land.
size()) {
232 maxValue = -std::numeric_limits<int>::max();
233 for (
size_t i = 0; i != this->land[0].
size(); ++i) {
234 if (this->land[0][i].second > maxValue) maxValue = this->land[0][i].second;
243 double compute_minimum()
const {
245 if (this->land.
size()) {
246 minValue = std::numeric_limits<int>::max();
247 for (
size_t i = 0; i != this->land[0].
size(); ++i) {
248 if (this->land[0][i].second < minValue) minValue = this->land[0][i].second;
257 double compute_norm_of_landscape(
double i) {
259 if (i < std::numeric_limits<double>::max()) {
301 double find_max(
unsigned lambda)
const;
332 std::vector<double>
vectorize(
int number_of_function)
const {
334 std::vector<double> v;
335 if ((
size_t)number_of_function > this->land.
size()) {
338 v.reserve(this->land[number_of_function].
size());
339 for (
size_t i = 0; i != this->land[number_of_function].
size(); ++i) {
340 v.push_back(this->land[number_of_function][i].second);
358 std::cerr <<
"to_average.size() : " << to_average.size() << std::endl;
361 std::vector<Persistence_landscape*> nextLevelMerge(to_average.size());
362 for (
size_t i = 0; i != to_average.size(); ++i) {
363 nextLevelMerge[i] = to_average[i];
365 bool is_this_first_level =
true;
370 while (nextLevelMerge.size() != 1) {
372 std::cerr <<
"nextLevelMerge.size() : " << nextLevelMerge.size() << std::endl;
374 std::vector<Persistence_landscape*> nextNextLevelMerge;
375 nextNextLevelMerge.reserve(to_average.size());
376 for (
size_t i = 0; i < nextLevelMerge.size(); i = i + 2) {
378 std::cerr <<
"i : " << i << std::endl;
381 if (i + 1 != nextLevelMerge.size()) {
382 (*l) = (*nextLevelMerge[i]) + (*nextLevelMerge[i + 1]);
384 (*l) = *nextLevelMerge[i];
386 nextNextLevelMerge.push_back(l);
389 std::cerr <<
"After this iteration \n";
393 if (!is_this_first_level) {
395 for (
size_t i = 0; i != nextLevelMerge.size(); ++i) {
396 delete nextLevelMerge[i];
399 is_this_first_level =
false;
400 nextLevelMerge.swap(nextNextLevelMerge);
402 (*this) = (*nextLevelMerge[0]);
403 (*this) *= 1 /
static_cast<double>(to_average.size());
413 if (power < std::numeric_limits<double>::max()) {
435 std::pair<double, double> result;
436 if (level < this->land.
size()) {
438 double minn = this->compute_minimum();
439 result = std::make_pair(minn, maxx);
441 result = std::make_pair(0, 0);
447 void plot(
const char* filename,
double xRangeBegin = std::numeric_limits<double>::max(),
448 double xRangeEnd = std::numeric_limits<double>::max(),
449 double yRangeBegin = std::numeric_limits<double>::max(),
450 double yRangeEnd = std::numeric_limits<double>::max(),
int from = std::numeric_limits<int>::max(),
451 int to = std::numeric_limits<int>::max());
454 std::vector<std::vector<std::pair<double, double> > > land;
455 size_t number_of_functions_for_vectorization;
456 size_t number_of_functions_for_projections_to_reals;
458 void construct_persistence_landscape_from_barcode(
const std::vector<std::pair<double, double> >& p,
459 size_t number_of_levels = std::numeric_limits<size_t>::max());
461 void multiply_lanscape_by_real_number_overwrite(
double x);
465 void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
467 this->number_of_functions_for_vectorization = this->land.size();
468 this->number_of_functions_for_projections_to_reals = this->land.size();
473 std::vector<std::pair<double, double> > barcode;
474 if (dimension < std::numeric_limits<double>::max()) {
475 barcode = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
477 barcode = read_persistence_intervals_in_one_dimension_from_file(filename);
479 this->construct_persistence_landscape_from_barcode(barcode, number_of_levels);
480 this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
483 bool operatorEqualDbg =
false;
485 if (this->land.size() != rhs.land.size()) {
486 if (operatorEqualDbg) std::cerr <<
"1\n";
489 for (
size_t level = 0; level != this->land.size(); ++level) {
490 if (this->land[level].
size() != rhs.land[level].size()) {
491 if (operatorEqualDbg) std::cerr <<
"this->land[level].size() : " << this->land[level].size() <<
"\n";
492 if (operatorEqualDbg) std::cerr <<
"rhs.land[level].size() : " << rhs.land[level].size() <<
"\n";
493 if (operatorEqualDbg) std::cerr <<
"2\n";
496 for (
size_t i = 0; i != this->land[level].size(); ++i) {
497 if (!(almost_equal(this->land[level][i].first, rhs.land[level][i].first) &&
498 almost_equal(this->land[level][i].second, rhs.land[level][i].second))) {
499 if (operatorEqualDbg)
500 std::cerr <<
"this->land[level][i] : " << this->land[level][i].first <<
" " << this->land[level][i].second
502 if (operatorEqualDbg)
503 std::cerr <<
"rhs.land[level][i] : " << rhs.land[level][i].first <<
" " << rhs.land[level][i].second <<
"\n";
504 if (operatorEqualDbg) std::cerr <<
"3\n";
513 size_t number_of_levels) {
514 this->construct_persistence_landscape_from_barcode(p, number_of_levels);
515 this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
518 void Persistence_landscape::construct_persistence_landscape_from_barcode(
519 const std::vector<std::pair<double, double> >& p,
size_t number_of_levels) {
522 std::cerr <<
"Persistence_landscape::Persistence_landscape( const std::vector< std::pair< double , double > >& p )" 527 std::vector<std::pair<double, double> > bars;
528 bars.insert(bars.begin(), p.begin(), p.end());
529 std::sort(bars.begin(), bars.end(), compare_points_sorting);
532 std::cerr <<
"Bars : \n";
533 for (
size_t i = 0; i != bars.size(); ++i) {
534 std::cerr << bars[i].first <<
" " << bars[i].second <<
"\n";
539 std::vector<std::pair<double, double> > characteristicPoints(p.size());
540 for (
size_t i = 0; i != bars.size(); ++i) {
541 characteristicPoints[i] =
542 std::make_pair((bars[i].first + bars[i].second) / 2.0, (bars[i].second - bars[i].first) / 2.0);
545 size_t number_of_levels_in_the_landscape = 0;
546 while (!characteristicPoints.empty()) {
548 for (
size_t i = 0; i != characteristicPoints.size(); ++i) {
549 std::cout <<
"(" << characteristicPoints[i].first <<
" " << characteristicPoints[i].second <<
")\n";
554 std::vector<std::pair<double, double> > lambda_n;
555 lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
556 lambda_n.push_back(std::make_pair(minus_length(characteristicPoints[0]), 0));
557 lambda_n.push_back(characteristicPoints[0]);
560 std::cerr <<
"1 Adding to lambda_n : (" << -std::numeric_limits<int>::max() <<
" " << 0 <<
") , (" 561 << minus_length(characteristicPoints[0]) <<
" " << 0 <<
") , (" << characteristicPoints[0].first <<
" " 562 << characteristicPoints[0].second <<
") \n";
566 std::vector<std::pair<double, double> > newCharacteristicPoints;
567 while (i < characteristicPoints.size()) {
569 if ((minus_length(characteristicPoints[i]) >= minus_length(lambda_n[lambda_n.size() - 1])) &&
570 (birth_plus_deaths(characteristicPoints[i]) > birth_plus_deaths(lambda_n[lambda_n.size() - 1]))) {
571 if (minus_length(characteristicPoints[i]) < birth_plus_deaths(lambda_n[lambda_n.size() - 1])) {
572 std::pair<double, double> point = std::make_pair(
573 (minus_length(characteristicPoints[i]) + birth_plus_deaths(lambda_n[lambda_n.size() - 1])) / 2,
574 (birth_plus_deaths(lambda_n[lambda_n.size() - 1]) - minus_length(characteristicPoints[i])) / 2);
575 lambda_n.push_back(point);
577 std::cerr <<
"2 Adding to lambda_n : (" << point.first <<
" " << point.second <<
")\n";
581 std::cerr <<
"characteristicPoints[i+p] : " << characteristicPoints[i + p].first <<
" " 582 << characteristicPoints[i + p].second <<
"\n";
583 std::cerr <<
"point : " << point.first <<
" " << point.second <<
"\n";
587 while ((i + p < characteristicPoints.size()) &&
588 (almost_equal(minus_length(point), minus_length(characteristicPoints[i + p]))) &&
589 (birth_plus_deaths(point) <= birth_plus_deaths(characteristicPoints[i + p]))) {
590 newCharacteristicPoints.push_back(characteristicPoints[i + p]);
592 std::cerr <<
"3.5 Adding to newCharacteristicPoints : (" << characteristicPoints[i + p].first <<
" " 593 << characteristicPoints[i + p].second <<
")\n";
599 newCharacteristicPoints.push_back(point);
601 std::cerr <<
"4 Adding to newCharacteristicPoints : (" << point.first <<
" " << point.second <<
")\n";
604 while ((i + p < characteristicPoints.size()) &&
605 (minus_length(point) <= minus_length(characteristicPoints[i + p])) &&
606 (birth_plus_deaths(point) >= birth_plus_deaths(characteristicPoints[i + p]))) {
607 newCharacteristicPoints.push_back(characteristicPoints[i + p]);
609 std::cerr <<
"characteristicPoints[i+p] : " << characteristicPoints[i + p].first <<
" " 610 << characteristicPoints[i + p].second <<
"\n";
611 std::cerr <<
"point : " << point.first <<
" " << point.second <<
"\n";
612 std::cerr <<
"characteristicPoints[i+p] birth and death : " << minus_length(characteristicPoints[i + p])
613 <<
" , " << birth_plus_deaths(characteristicPoints[i + p]) <<
"\n";
614 std::cerr <<
"point birth and death : " << minus_length(point) <<
" , " << birth_plus_deaths(point)
617 std::cerr <<
"3 Adding to newCharacteristicPoints : (" << characteristicPoints[i + p].first <<
" " 618 << characteristicPoints[i + p].second <<
")\n";
625 lambda_n.push_back(std::make_pair(birth_plus_deaths(lambda_n[lambda_n.size() - 1]), 0));
626 lambda_n.push_back(std::make_pair(minus_length(characteristicPoints[i]), 0));
628 std::cerr <<
"5 Adding to lambda_n : (" << birth_plus_deaths(lambda_n[lambda_n.size() - 1]) <<
" " << 0
630 std::cerr <<
"5 Adding to lambda_n : (" << minus_length(characteristicPoints[i]) <<
" " << 0 <<
")\n";
633 lambda_n.push_back(characteristicPoints[i]);
635 std::cerr <<
"6 Adding to lambda_n : (" << characteristicPoints[i].first <<
" " 636 << characteristicPoints[i].second <<
")\n";
639 newCharacteristicPoints.push_back(characteristicPoints[i]);
641 std::cerr <<
"7 Adding to newCharacteristicPoints : (" << characteristicPoints[i].first <<
" " 642 << characteristicPoints[i].second <<
")\n";
647 lambda_n.push_back(std::make_pair(birth_plus_deaths(lambda_n[lambda_n.size() - 1]), 0));
648 lambda_n.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
650 characteristicPoints = newCharacteristicPoints;
652 lambda_n.erase(std::unique(lambda_n.begin(), lambda_n.end()), lambda_n.end());
653 this->land.push_back(lambda_n);
655 ++number_of_levels_in_the_landscape;
656 if (number_of_levels == number_of_levels_in_the_landscape) {
664 if (this->land.size() < lambda)
return 0;
665 double maximum = -std::numeric_limits<int>::max();
666 for (
size_t i = 0; i != this->land[lambda].size(); ++i) {
667 if (this->land[lambda][i].second > maximum) maximum = this->land[lambda][i].second;
674 for (
size_t i = 0; i != this->land.size(); ++i) {
675 for (
size_t nr = 2; nr != this->land[i].size() - 1; ++nr) {
677 result += 0.5 * (this->land[i][nr].first - this->land[i][nr - 1].first) *
678 (this->land[i][nr].second + this->land[i][nr - 1].second);
686 if (level >= this->land.size()) {
691 if (level < 0)
return 0;
693 for (
size_t nr = 2; nr != this->land[level].size() - 1; ++nr) {
695 result += 0.5 * (this->land[level][nr].first - this->land[level][nr - 1].first) *
696 (this->land[level][nr].second + this->land[level][nr - 1].second);
705 for (
size_t i = 0; i != this->land.size(); ++i) {
706 for (
size_t nr = 2; nr != this->land[i].size() - 1; ++nr) {
707 if (dbg) std::cout <<
"nr : " << nr <<
"\n";
710 std::pair<double, double> coef = compute_parameters_of_a_line(this->land[i][nr], this->land[i][nr - 1]);
711 double a = coef.first;
712 double b = coef.second;
715 std::cout <<
"(" << this->land[i][nr].first <<
"," << this->land[i][nr].second <<
") , " 716 << this->land[i][nr - 1].first <<
"," << this->land[i][nr].second <<
")" << std::endl;
717 if (this->land[i][nr].first == this->land[i][nr - 1].first)
continue;
719 result += 1 / (a * (p + 1)) *
720 (pow((a * this->land[i][nr].first + b), p + 1) - pow((a * this->land[i][nr - 1].first + b), p + 1));
722 result += (this->land[i][nr].first - this->land[i][nr - 1].first) * (pow(this->land[i][nr].second, p));
725 std::cout <<
"a : " << a <<
" , b : " << b << std::endl;
726 std::cout <<
"result : " << result << std::endl;
735 bool compute_value_at_a_given_pointDbg =
false;
737 if (level >= this->land.size())
return 0;
741 unsigned coordBegin = 1;
742 unsigned coordEnd = this->land[level].size() - 2;
744 if (compute_value_at_a_given_pointDbg) {
745 std::cerr <<
"Here \n";
746 std::cerr <<
"x : " << x <<
"\n";
747 std::cerr <<
"this->land[level][coordBegin].first : " << this->land[level][coordBegin].first <<
"\n";
748 std::cerr <<
"this->land[level][coordEnd].first : " << this->land[level][coordEnd].first <<
"\n";
752 if (x <= this->land[level][coordBegin].first)
return 0;
753 if (x >= this->land[level][coordEnd].first)
return 0;
755 if (compute_value_at_a_given_pointDbg) std::cerr <<
"Entering to the while loop \n";
757 while (coordBegin + 1 != coordEnd) {
758 if (compute_value_at_a_given_pointDbg) {
759 std::cerr <<
"coordBegin : " << coordBegin <<
"\n";
760 std::cerr <<
"coordEnd : " << coordEnd <<
"\n";
761 std::cerr <<
"this->land[level][coordBegin].first : " << this->land[level][coordBegin].first <<
"\n";
762 std::cerr <<
"this->land[level][coordEnd].first : " << this->land[level][coordEnd].first <<
"\n";
765 unsigned newCord = (unsigned)floor((coordEnd + coordBegin) / 2.0);
767 if (compute_value_at_a_given_pointDbg) {
768 std::cerr <<
"newCord : " << newCord <<
"\n";
769 std::cerr <<
"this->land[level][newCord].first : " << this->land[level][newCord].first <<
"\n";
773 if (this->land[level][newCord].first <= x) {
774 coordBegin = newCord;
775 if (this->land[level][newCord].first == x)
return this->land[level][newCord].second;
781 if (compute_value_at_a_given_pointDbg) {
782 std::cout <<
"x : " << x <<
" is between : " << this->land[level][coordBegin].first <<
" a " 783 << this->land[level][coordEnd].first <<
"\n";
784 std::cout <<
"the y coords are : " << this->land[level][coordBegin].second <<
" a " 785 << this->land[level][coordEnd].second <<
"\n";
786 std::cerr <<
"coordBegin : " << coordBegin <<
"\n";
787 std::cerr <<
"coordEnd : " << coordEnd <<
"\n";
790 return function_value(this->land[level][coordBegin], this->land[level][coordEnd], x);
794 for (
size_t level = 0; level != land.land.size(); ++level) {
795 out <<
"Lambda_" << level <<
":" << std::endl;
796 for (
size_t i = 0; i != land.land[level].size(); ++i) {
797 if (land.land[level][i].first == -std::numeric_limits<int>::max()) {
800 if (land.land[level][i].first == std::numeric_limits<int>::max()) {
803 out << land.land[level][i].first;
806 out <<
" , " << land.land[level][i].second << std::endl;
812 void Persistence_landscape::multiply_lanscape_by_real_number_overwrite(
double x) {
813 for (
size_t dim = 0; dim != this->land.size(); ++dim) {
814 for (
size_t i = 0; i != this->land[dim].size(); ++i) {
815 this->land[dim][i].second *= x;
823 for (
size_t level = 0; level != this->land.size(); ++level) {
825 std::cout <<
"level: " << level << std::endl;
827 std::vector<std::pair<double, double> > lambda_n;
828 lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
829 for (
size_t i = 1; i != this->land[level].size(); ++i) {
831 std::cout <<
"this->land[" << level <<
"][" << i <<
"] : " << this->land[level][i].first <<
" " 832 << this->land[level][i].second << std::endl;
836 if ((this->land[level][i - 1].second) * (this->land[level][i].second) < 0) {
838 find_zero_of_a_line_segment_between_those_two_points(this->land[level][i - 1], this->land[level][i]);
840 lambda_n.push_back(std::make_pair(zero, 0));
841 lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
843 std::cout <<
"Adding pair : (" << zero <<
",0)" << std::endl;
844 std::cout <<
"In the same step adding pair : (" << this->land[level][i].first <<
"," 845 << fabs(this->land[level][i].second) <<
") " << std::endl;
849 lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
851 std::cout <<
"Adding pair : (" << this->land[level][i].first <<
"," << fabs(this->land[level][i].second)
852 <<
") " << std::endl;
857 result.land.push_back(lambda_n);
864 for (
size_t level = 0; level != this->land.size(); ++level) {
866 std::cout <<
"level: " << level << std::endl;
868 std::vector<std::pair<double, double> > lambda_n;
869 lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
870 for (
size_t i = 1; i != this->land[level].size(); ++i) {
872 std::cout <<
"this->land[" << level <<
"][" << i <<
"] : " << this->land[level][i].first <<
" " 873 << this->land[level][i].second << std::endl;
877 if ((this->land[level][i - 1].second) * (this->land[level][i].second) < 0) {
879 find_zero_of_a_line_segment_between_those_two_points(this->land[level][i - 1], this->land[level][i]);
881 lambda_n.push_back(std::make_pair(zero, 0));
882 lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
884 std::cout <<
"Adding pair : (" << zero <<
",0)" << std::endl;
885 std::cout <<
"In the same step adding pair : (" << this->land[level][i].first <<
"," 886 << fabs(this->land[level][i].second) <<
") " << std::endl;
890 lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
892 std::cout <<
"Adding pair : (" << this->land[level][i].first <<
"," << fabs(this->land[level][i].second)
893 <<
") " << std::endl;
898 result->land.push_back(lambda_n);
903 Persistence_landscape Persistence_landscape::multiply_lanscape_by_real_number_not_overwrite(
double x)
const {
904 std::vector<std::vector<std::pair<double, double> > > result(this->land.size());
905 for (
size_t dim = 0; dim != this->land.size(); ++dim) {
906 std::vector<std::pair<double, double> > lambda_dim(this->land[dim].
size());
907 for (
size_t i = 0; i != this->land[dim].size(); ++i) {
908 lambda_dim[i] = std::make_pair(this->land[dim][i].first, x * this->land[dim][i].second);
910 result[dim] = lambda_dim;
915 res.land.swap(result);
921 write.open(filename);
922 for (
size_t dim = 0; dim != this->land.size(); ++dim) {
923 write <<
"#lambda_" << dim << std::endl;
924 for (
size_t i = 1; i != this->land[dim].size() - 1; ++i) {
925 write << this->land[dim][i].first <<
" " << this->land[dim][i].second << std::endl;
940 std::cerr <<
"The file : " << filename <<
" do not exist. The program will now terminate \n";
941 throw "The persistence landscape file do not exist. The program will now terminate \n";
945 std::vector<std::pair<double, double> > landscapeAtThisLevel;
947 bool isThisAFirsLine =
true;
950 if (!(line.length() == 0 || line[0] ==
'#')) {
951 std::stringstream lineSS;
956 landscapeAtThisLevel.push_back(std::make_pair(beginn, endd));
958 std::cerr <<
"Reading a point : " << beginn <<
" , " << endd << std::endl;
962 std::cout <<
"IGNORE LINE\n";
965 if (!isThisAFirsLine) {
966 landscapeAtThisLevel.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
967 this->land.push_back(landscapeAtThisLevel);
968 std::vector<std::pair<double, double> > newLevelOdLandscape;
969 landscapeAtThisLevel.swap(newLevelOdLandscape);
971 landscapeAtThisLevel.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
972 isThisAFirsLine =
false;
975 if (landscapeAtThisLevel.size() > 1) {
978 landscapeAtThisLevel.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
979 this->land.push_back(landscapeAtThisLevel);
985 template <
typename T>
988 bool operation_on_pair_of_landscapesDBG =
false;
989 if (operation_on_pair_of_landscapesDBG) {
990 std::cout <<
"operation_on_pair_of_landscapes\n";
994 std::vector<std::vector<std::pair<double, double> > > land(std::max(land1.land.size(), land2.land.size()));
998 if (operation_on_pair_of_landscapesDBG) {
999 for (
size_t i = 0; i != std::min(land1.land.size(), land2.land.size()); ++i) {
1000 std::cerr <<
"land1.land[" << i <<
"].size() : " << land1.land[i].size() << std::endl;
1001 std::cerr <<
"land2.land[" << i <<
"].size() : " << land2.land[i].size() << std::endl;
1006 for (
size_t i = 0; i != std::min(land1.land.size(), land2.land.size()); ++i) {
1007 std::vector<std::pair<double, double> > lambda_n;
1010 while ((p + 1 < land1.land[i].size()) && (q + 1 < land2.land[i].size())) {
1011 if (operation_on_pair_of_landscapesDBG) {
1012 std::cerr <<
"p : " << p <<
"\n";
1013 std::cerr <<
"q : " << q <<
"\n";
1014 std::cerr <<
"land1.land.size() : " << land1.land.size() << std::endl;
1015 std::cerr <<
"land2.land.size() : " << land2.land.size() << std::endl;
1016 std::cerr <<
"land1.land[" << i <<
"].size() : " << land1.land[i].size() << std::endl;
1017 std::cerr <<
"land2.land[" << i <<
"].size() : " << land2.land[i].size() << std::endl;
1018 std::cout <<
"land1.land[i][p].first : " << land1.land[i][p].first <<
"\n";
1019 std::cout <<
"land2.land[i][q].first : " << land2.land[i][q].first <<
"\n";
1022 if (land1.land[i][p].first < land2.land[i][q].first) {
1023 if (operation_on_pair_of_landscapesDBG) {
1024 std::cout <<
"first \n";
1025 std::cout <<
" function_value(land2.land[i][q-1],land2.land[i][q],land1.land[i][p].first) : " 1026 << function_value(land2.land[i][q - 1], land2.land[i][q], land1.land[i][p].first) <<
"\n";
1029 std::make_pair(land1.land[i][p].first,
1030 oper(static_cast<double>(land1.land[i][p].second),
1031 function_value(land2.land[i][q - 1], land2.land[i][q], land1.land[i][p].first))));
1035 if (land1.land[i][p].first > land2.land[i][q].first) {
1036 if (operation_on_pair_of_landscapesDBG) {
1037 std::cout <<
"Second \n";
1038 std::cout <<
"function_value(" << land1.land[i][p - 1].first <<
" " << land1.land[i][p - 1].second <<
" ," 1039 << land1.land[i][p].first <<
" " << land1.land[i][p].second <<
", " << land2.land[i][q].first
1040 <<
" ) : " << function_value(land1.land[i][p - 1], land1.land[i][p - 1], land2.land[i][q].first)
1042 std::cout <<
"oper( " << function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first) <<
"," 1043 << land2.land[i][q].second <<
" : " 1044 << oper(land2.land[i][q].second,
1045 function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first))
1048 lambda_n.push_back(std::make_pair(
1049 land2.land[i][q].first, oper(function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first),
1050 land2.land[i][q].second)));
1054 if (land1.land[i][p].first == land2.land[i][q].first) {
1055 if (operation_on_pair_of_landscapesDBG) std::cout <<
"Third \n";
1057 std::make_pair(land2.land[i][q].first, oper(land1.land[i][p].second, land2.land[i][q].second)));
1061 if (operation_on_pair_of_landscapesDBG) {
1062 std::cout <<
"Next iteration \n";
1065 while ((p + 1 < land1.land[i].size()) && (q + 1 >= land2.land[i].size())) {
1066 if (operation_on_pair_of_landscapesDBG) {
1067 std::cout <<
"New point : " << land1.land[i][p].first
1068 <<
" oper(land1.land[i][p].second,0) : " << oper(land1.land[i][p].second, 0) << std::endl;
1070 lambda_n.push_back(std::make_pair(land1.land[i][p].first, oper(land1.land[i][p].second, 0)));
1073 while ((p + 1 >= land1.land[i].size()) && (q + 1 < land2.land[i].size())) {
1074 if (operation_on_pair_of_landscapesDBG) {
1075 std::cout <<
"New point : " << land2.land[i][q].first
1076 <<
" oper(0,land2.land[i][q].second) : " << oper(0, land2.land[i][q].second) << std::endl;
1078 lambda_n.push_back(std::make_pair(land2.land[i][q].first, oper(0, land2.land[i][q].second)));
1081 lambda_n.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
1084 result.land[i].swap(lambda_n);
1086 if (land1.land.size() > std::min(land1.land.size(), land2.land.size())) {
1087 if (operation_on_pair_of_landscapesDBG) {
1088 std::cout <<
"land1.land.size() > std::min( land1.land.size() , land2.land.size() )" << std::endl;
1090 for (
size_t i = std::min(land1.land.size(), land2.land.size()); i != std::max(land1.land.size(), land2.land.size());
1092 std::vector<std::pair<double, double> > lambda_n(land1.land[i]);
1093 for (
size_t nr = 0; nr != land1.land[i].size(); ++nr) {
1094 lambda_n[nr] = std::make_pair(land1.land[i][nr].first, oper(land1.land[i][nr].second, 0));
1098 result.land[i].swap(lambda_n);
1101 if (land2.land.size() > std::min(land1.land.size(), land2.land.size())) {
1102 if (operation_on_pair_of_landscapesDBG) {
1103 std::cout <<
"( land2.land.size() > std::min( land1.land.size() , land2.land.size() ) ) " << std::endl;
1105 for (
size_t i = std::min(land1.land.size(), land2.land.size()); i != std::max(land1.land.size(), land2.land.size());
1107 std::vector<std::pair<double, double> > lambda_n(land2.land[i]);
1108 for (
size_t nr = 0; nr != land2.land[i].size(); ++nr) {
1109 lambda_n[nr] = std::make_pair(land2.land[i][nr].first, oper(0, land2.land[i][nr].second));
1113 result.land[i].swap(lambda_n);
1116 if (operation_on_pair_of_landscapesDBG) {
1117 std::cout <<
"operation_on_pair_of_landscapes END\n";
1125 if (dbg) std::cerr <<
" compute_maximal_distance_non_symmetric \n";
1128 size_t minimalNumberOfLevels = std::min(pl1.land.size(), pl2.land.size());
1129 for (
size_t level = 0; level != minimalNumberOfLevels; ++level) {
1131 std::cerr <<
"Level : " << level << std::endl;
1132 std::cerr <<
"PL1 : \n";
1133 for (
size_t i = 0; i != pl1.land[level].size(); ++i) {
1134 std::cerr <<
"(" << pl1.land[level][i].first <<
"," << pl1.land[level][i].second <<
") \n";
1136 std::cerr <<
"PL2 : \n";
1137 for (
size_t i = 0; i != pl2.land[level].size(); ++i) {
1138 std::cerr <<
"(" << pl2.land[level][i].first <<
"," << pl2.land[level][i].second <<
") \n";
1145 for (
size_t i = 1; i != pl1.land[level].size() - 1; ++i) {
1147 if ((pl1.land[level][i].first >= pl2.land[level][p2Count].first) &&
1148 (pl1.land[level][i].first <= pl2.land[level][p2Count + 1].first))
1153 fabs(function_value(pl2.land[level][p2Count], pl2.land[level][p2Count + 1], pl1.land[level][i].first) -
1154 pl1.land[level][i].second);
1155 if (maxDist <= val) maxDist = val;
1158 std::cerr << pl1.land[level][i].first <<
"in [" << pl2.land[level][p2Count].first <<
"," 1159 << pl2.land[level][p2Count + 1].first <<
"] \n";
1160 std::cerr <<
"pl1[level][i].second : " << pl1.land[level][i].second << std::endl;
1161 std::cerr <<
"function_value( pl2[level][p2Count] , pl2[level][p2Count+1] , pl1[level][i].first ) : " 1162 << function_value(pl2.land[level][p2Count], pl2.land[level][p2Count + 1], pl1.land[level][i].first)
1164 std::cerr <<
"val : " << val << std::endl;
1170 if (dbg) std::cerr <<
"minimalNumberOfLevels : " << minimalNumberOfLevels << std::endl;
1172 if (minimalNumberOfLevels < pl1.land.size()) {
1173 for (
size_t level = minimalNumberOfLevels; level != pl1.land.size(); ++level) {
1174 for (
size_t i = 0; i != pl1.land[level].size(); ++i) {
1175 if (dbg) std::cerr <<
"pl1[level][i].second : " << pl1.land[level][i].second << std::endl;
1176 if (maxDist < pl1.land[level][i].second) maxDist = pl1.land[level][i].second;
1196 std::cerr <<
"Abs of difference ; " << lan << std::endl;
1200 if (p < std::numeric_limits<double>::max()) {
1204 if (dbg) std::cerr <<
"Power != 1, compute integral to the power p\n";
1207 if (dbg) std::cerr <<
"Power = 1, compute integral \n";
1211 return pow(result, 1.0 / p);
1214 if (dbg) std::cerr <<
"Power = infty, compute maximum \n";
1221 return std::max(compute_maximal_distance_non_symmetric(first, second),
1222 compute_maximal_distance_non_symmetric(second, first));
1225 bool comparePairsForMerging(std::pair<double, unsigned> first, std::pair<double, unsigned> second) {
1226 return (first.first < second.first);
1233 for (
size_t level = 0; level != std::min(l1.
size(), l2.
size()); ++level) {
1235 std::cerr <<
"Computing inner product for a level : " << level << std::endl;
1238 auto&& l1_land_level = l1.land[level];
1239 auto&& l2_land_level = l2.land[level];
1241 if (l1_land_level.size() * l2_land_level.size() == 0)
continue;
1244 double x1 = -std::numeric_limits<int>::max();
1246 if (l1_land_level[1].first < l2_land_level[1].first) {
1247 x2 = l1_land_level[1].first;
1249 x2 = l2_land_level[1].first;
1256 while ((l1It < l1_land_level.size() - 1) && (l2It < l2_land_level.size() - 1)) {
1261 if (l1_land_level[l1It + 1].first != l1_land_level[l1It].first) {
1262 a = (l1_land_level[l1It + 1].second - l1_land_level[l1It].second) /
1263 (l1_land_level[l1It + 1].first - l1_land_level[l1It].first);
1267 b = l1_land_level[l1It].second - a * l1_land_level[l1It].first;
1268 if (l2_land_level[l2It + 1].first != l2_land_level[l2It].first) {
1269 c = (l2_land_level[l2It + 1].second - l2_land_level[l2It].second) /
1270 (l2_land_level[l2It + 1].first - l2_land_level[l2It].first);
1274 d = l2_land_level[l2It].second - c * l2_land_level[l2It].first;
1276 double contributionFromThisPart = (a * c * x2 * x2 * x2 / 3 + (a * d + b * c) * x2 * x2 / 2 + b * d * x2) -
1277 (a * c * x1 * x1 * x1 / 3 + (a * d + b * c) * x1 * x1 / 2 + b * d * x1);
1279 result += contributionFromThisPart;
1282 std::cerr <<
"[l1_land_level[l1It].first,l1_land_level[l1It+1].first] : " << l1_land_level[l1It].first
1283 <<
" , " << l1_land_level[l1It + 1].first << std::endl;
1284 std::cerr <<
"[l2_land_level[l2It].first,l2_land_level[l2It+1].first] : " << l2_land_level[l2It].first
1285 <<
" , " << l2_land_level[l2It + 1].first << std::endl;
1286 std::cerr <<
"a : " << a <<
", b : " << b <<
" , c: " << c <<
", d : " << d << std::endl;
1287 std::cerr <<
"x1 : " << x1 <<
" , x2 : " << x2 << std::endl;
1288 std::cerr <<
"contributionFromThisPart : " << contributionFromThisPart << std::endl;
1289 std::cerr <<
"result : " << result << std::endl;
1300 if (x2 == l1_land_level[l1It + 1].first) {
1301 if (x2 == l2_land_level[l2It + 1].first) {
1305 std::cerr <<
"Incrementing both \n";
1309 std::cerr <<
"Incrementing first \n";
1317 std::cerr <<
"Incrementing second \n";
1321 if ( l1It + 1 >= l1_land_level.size() )
break;
1322 if ( l2It + 1 >= l2_land_level.size() )
break;
1326 if (l1_land_level[l1It + 1].first < l2_land_level[l2It + 1].first) {
1327 x2 = l1_land_level[l1It + 1].first;
1329 x2 = l2_land_level[l2It + 1].first;
1336 void Persistence_landscape::plot(
const char* filename,
double xRangeBegin,
double xRangeEnd,
double yRangeBegin,
1337 double yRangeEnd,
int from,
int to) {
1341 std::ostringstream gnuplot_script;
1342 gnuplot_script << filename <<
"_GnuplotScript";
1343 out.open(gnuplot_script.str().c_str());
1345 if ((xRangeBegin != std::numeric_limits<double>::max()) || (xRangeEnd != std::numeric_limits<double>::max()) ||
1346 (yRangeBegin != std::numeric_limits<double>::max()) || (yRangeEnd != std::numeric_limits<double>::max())) {
1347 out <<
"set xrange [" << xRangeBegin <<
" : " << xRangeEnd <<
"]" << std::endl;
1348 out <<
"set yrange [" << yRangeBegin <<
" : " << yRangeEnd <<
"]" << std::endl;
1351 if (from == std::numeric_limits<int>::max()) {
1354 if (to == std::numeric_limits<int>::max()) {
1355 to = this->land.size();
1359 for (
size_t lambda = std::min((
size_t)from, this->land.size()); lambda != std::min((
size_t)to, this->land.size());
1362 out <<
" '-' using 1:2 notitle with lp";
1363 if (lambda + 1 != std::min((
size_t)to, this->land.size())) {
1369 for (
size_t lambda = std::min((
size_t)from, this->land.size()); lambda != std::min((
size_t)to, this->land.size());
1371 for (
size_t i = 1; i != this->land[lambda].size() - 1; ++i) {
1372 out << this->land[lambda][i].first <<
" " << this->land[lambda][i].second << std::endl;
1374 out <<
"EOF" << std::endl;
1376 std::cout <<
"To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'" 1377 << gnuplot_script.str().c_str() <<
"\'\"" << std::endl;
1383 #endif // PERSISTENCE_LANDSCAPE_H_ std::pair< double, double > get_y_range(size_t level=0) const
Definition: Persistence_landscape.h:434
Persistence_landscape operator+=(const Persistence_landscape &rhs)
Definition: Persistence_landscape.h:185
friend std::ostream & operator<<(std::ostream &out, Persistence_landscape &land)
Definition: Persistence_landscape.h:793
bool operator==(const Persistence_landscape &rhs) const
Definition: Persistence_landscape.h:484
friend Persistence_landscape subtract_two_landscapes(const Persistence_landscape &land1, const Persistence_landscape &land2)
Definition: Persistence_landscape.h:149
size_t size() const
Definition: Persistence_landscape.h:296
double operator()(unsigned level, double x) const
Definition: Persistence_landscape.h:269
Persistence_landscape()
Definition: Persistence_landscape.h:77
void print_to_file(const char *filename) const
Definition: Persistence_landscape.h:919
double compute_integral_of_a_level_of_a_landscape(size_t level) const
Definition: Persistence_landscape.h:684
void load_landscape_from_file(const char *filename)
Definition: Persistence_landscape.h:931
size_t number_of_vectorize_functions() const
Definition: Persistence_landscape.h:348
Persistence_landscape abs()
Definition: Persistence_landscape.h:821
size_t number_of_projections_to_R() const
Definition: Persistence_landscape.h:326
double distance(const Persistence_landscape &second, double power=1) const
Definition: Persistence_landscape.h:412
Definition: SimplicialComplexForAlpha.h:26
A class implementing persistence landscapes data structures.
Definition: Persistence_landscape.h:72
void compute_average(const std::vector< Persistence_landscape *> &to_average)
Definition: Persistence_landscape.h:354
double find_max(unsigned lambda) const
Definition: Persistence_landscape.h:663
friend double compute_distance_of_landscapes(const Persistence_landscape &first, const Persistence_landscape &second, double p)
Definition: Persistence_landscape.h:1183
double compute_scalar_product(const Persistence_landscape &second) const
Definition: Persistence_landscape.h:425
double project_to_R(int number_of_function) const
Definition: Persistence_landscape.h:318
std::vector< double > vectorize(int number_of_function) const
Definition: Persistence_landscape.h:332
bool operator!=(const Persistence_landscape &rhs) const
Definition: Persistence_landscape.h:224
Persistence_landscape operator/=(double x)
Definition: Persistence_landscape.h:210
friend Persistence_landscape operator+(const Persistence_landscape &first, const Persistence_landscape &second)
Definition: Persistence_landscape.h:157
friend Persistence_landscape operator*(double con, const Persistence_landscape &first)
Definition: Persistence_landscape.h:178
double compute_integral_of_landscape() const
Definition: Persistence_landscape.h:672
Persistence_landscape operator*=(double x)
Definition: Persistence_landscape.h:202
friend double compute_inner_product(const Persistence_landscape &l1, const Persistence_landscape &l2)
Definition: Persistence_landscape.h:1229
Persistence_landscape operator-=(const Persistence_landscape &rhs)
Definition: Persistence_landscape.h:193
friend Persistence_landscape add_two_landscapes(const Persistence_landscape &land1, const Persistence_landscape &land2)
Definition: Persistence_landscape.h:141
double compute_value_at_a_given_point(unsigned level, double x) const
Definition: Persistence_landscape.h:734
double compute_maximum() const
Definition: Persistence_landscape.h:229
friend double compute_max_norm_distance_of_landscapes(const Persistence_landscape &first, const Persistence_landscape &second)
Definition: Persistence_landscape.h:1219
friend Persistence_landscape operator*(const Persistence_landscape &first, double con)
Definition: Persistence_landscape.h:171
friend Persistence_landscape operator-(const Persistence_landscape &first, const Persistence_landscape &second)
Definition: Persistence_landscape.h:164