/* This file is part of the Gudhi Library. The Gudhi library * (Geometric Understanding in Higher Dimensions) is a generic C++ * library for computational topology. * * Author(s): Pawel Dlotko * * Copyright (C) 2016 INRIA (France) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE "Persistence_heat_maps_test" #include #include #include #include using namespace Gudhi; using namespace Gudhi::Persistence_representations; BOOST_AUTO_TEST_CASE(check_construction_of_heat_maps) { std::vector > filter = create_Gaussian_filter(100, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); p.print_to_file("data/persistence_heat_map_from_file_with_diagram"); Persistence_heat_maps q; q.load_from_file("data/persistence_heat_map_from_file_with_diagram"); BOOST_CHECK(p == q); } BOOST_AUTO_TEST_CASE(check_averages_of_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 10); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 10); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 10); Persistence_heat_maps av; av.compute_average({&p, &q, &r}); Persistence_heat_maps template_average; template_average.load_from_file("data/template_average_of_heat_maps"); BOOST_CHECK(av == template_average); } BOOST_AUTO_TEST_CASE(check_median_of_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 1); std::vector*> to_compute_median; to_compute_median.push_back(&p); to_compute_median.push_back(&q); to_compute_median.push_back(&r); Persistence_heat_maps median; median.compute_median(to_compute_median); Persistence_heat_maps template_median; template_median.load_from_file("data/template_median_of_heat_maps"); BOOST_CHECK(median == template_median); } BOOST_AUTO_TEST_CASE(check_compute_percentage_of_active_of_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 1); std::vector*> to_compute_percentage_of_active; to_compute_percentage_of_active.push_back(&p); to_compute_percentage_of_active.push_back(&q); to_compute_percentage_of_active.push_back(&r); Persistence_heat_maps percentage_of_active; percentage_of_active.compute_percentage_of_active(to_compute_percentage_of_active, 0.1); Persistence_heat_maps template_percentage_of_active; template_percentage_of_active.load_from_file("data/template_percentage_of_active_of_heat_maps"); BOOST_CHECK(percentage_of_active == template_percentage_of_active); } BOOST_AUTO_TEST_CASE(check_vectorize_for_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 5, 0, 1); std::vector p_vect_template; p_vect_template.push_back(0.0606728); p_vect_template.push_back(0.0610023); p_vect_template.push_back(0.0607978); p_vect_template.push_back(0.0600647); p_vect_template.push_back(0.0588224); p_vect_template.push_back(0.0619829); p_vect_template.push_back(0.0623218); p_vect_template.push_back(0.0621152); p_vect_template.push_back(0.0613686); p_vect_template.push_back(0.0601016); p_vect_template.push_back(0.0627679); p_vect_template.push_back(0.0631134); p_vect_template.push_back(0.0629066); p_vect_template.push_back(0.0621528); p_vect_template.push_back(0.0608719); p_vect_template.push_back(0.0630073); p_vect_template.push_back(0.0633564); p_vect_template.push_back(0.0631511); p_vect_template.push_back(0.0623968); p_vect_template.push_back(0.0611132); p_vect_template.push_back(0.0626947); p_vect_template.push_back(0.0630445); p_vect_template.push_back(0.0628425); p_vect_template.push_back(0.0620941); p_vect_template.push_back(0.060819); std::vector p_vect = p.vectorize(0); for (size_t i = 0; i != p_vect.size(); ++i) { BOOST_CHECK(almost_equal(p_vect_template[i], p_vect[i])); } } BOOST_AUTO_TEST_CASE(check_distance_for_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 1); // cerr << p.distance( p ) << endl; // cerr << p.distance( q ) << endl; // cerr << p.distance( r ) << endl; // cerr << q.distance( p ) << endl; // cerr << q.distance( q ) << endl; // cerr << q.distance( r ) << endl; // cerr << r.distance( p ) << endl; // cerr << r.distance( q ) << endl; // cerr << r.distance( r ) << endl; // 0 624.183 415.815 // 624.183 0 528.06Z // 415.815 528.066 0 BOOST_CHECK(fabs(p.distance(p) - 0) < 0.0005); BOOST_CHECK(fabs(p.distance(q) - 624.183) < 0.0005); BOOST_CHECK(fabs(p.distance(r) - 415.815) < 0.0005); BOOST_CHECK(fabs(q.distance(p) - 624.183) < 0.0005); BOOST_CHECK(fabs(q.distance(q) - 0) < 0.0005); BOOST_CHECK(fabs(q.distance(r) - 528.066) < 0.0005); BOOST_CHECK(fabs(r.distance(p) - 415.815) < 0.0005); BOOST_CHECK(fabs(r.distance(q) - 528.066) < 0.0005); BOOST_CHECK(fabs(r.distance(r) - 0) < 0.0005); } BOOST_AUTO_TEST_CASE(check_projections_to_R_for_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 1); // cerr << p.project_to_R(0) << endl; // cerr << q.project_to_R(0) << endl; // cerr << r.project_to_R(0) << endl; BOOST_CHECK(fabs(p.project_to_R(0) - 44.3308) < 0.0005); BOOST_CHECK(fabs(q.project_to_R(0) - 650.568) < 0.0005); BOOST_CHECK(fabs(r.project_to_R(0) - 429.287) < 0.0005); } BOOST_AUTO_TEST_CASE(check_scalar_products_for_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps r("data/file_with_diagram_2", filter, false, 1000, 0, 1); // cerr << p.compute_scalar_product( p ) << endl; // cerr << p.compute_scalar_product( q ) << endl; // cerr << p.compute_scalar_product( r ) << endl; // cerr << q.compute_scalar_product( p ) << endl; // cerr << q.compute_scalar_product( q ) << endl; // cerr << q.compute_scalar_product( r ) << endl; // cerr << r.compute_scalar_product( p ) << endl; // cerr << r.compute_scalar_product( q ) << endl; // cerr << r.compute_scalar_product( r ) << endl; BOOST_CHECK(fabs(p.compute_scalar_product(p) - 0.0345687) < 0.0005); BOOST_CHECK(fabs(p.compute_scalar_product(q) - 0.0509357) < 0.0005); BOOST_CHECK(fabs(p.compute_scalar_product(r) - 0.0375608) < 0.0005); BOOST_CHECK(fabs(q.compute_scalar_product(p) - 0.0509357) < 0.0005); BOOST_CHECK(fabs(q.compute_scalar_product(q) - 1.31293) < 0.0005); BOOST_CHECK(fabs(q.compute_scalar_product(r) - 0.536799) < 0.0005); BOOST_CHECK(fabs(r.compute_scalar_product(p) - 0.0375608) < 0.0005); BOOST_CHECK(fabs(r.compute_scalar_product(q) - 0.536799) < 0.0005); BOOST_CHECK(fabs(r.compute_scalar_product(r) - 0.672907) < 0.0005); } BOOST_AUTO_TEST_CASE(check_arythmetic_operations_for_heat_maps) { std::vector > filter = create_Gaussian_filter(30, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); Persistence_heat_maps q("data/file_with_diagram_1", filter, false, 1000, 0, 1); Persistence_heat_maps sum = p + q; Persistence_heat_maps difference = p - q; Persistence_heat_maps multiply_by_scalar = 2 * p; // sum.print_to_file( "sum" ); // difference.print_to_file( "difference" ); // multiply_by_scalar.print_to_file( "multiply_by_scalar" ); Persistence_heat_maps sum_template; sum_template.load_from_file("data/heat_map_sum"); Persistence_heat_maps difference_template; difference_template.load_from_file("data/heat_map_difference"); Persistence_heat_maps multiply_by_scalar_template; multiply_by_scalar_template.load_from_file("data/heat_map_multiply_by_scalar"); BOOST_CHECK(sum == sum_template); } BOOST_AUTO_TEST_CASE(check_distance_of_heat_maps_infinite_power_parameters) { std::vector > filter = create_Gaussian_filter(100, 1); Persistence_heat_maps p("data/file_with_diagram", filter, false, 1000, 0, 1); std::vector > filter_2 = create_Gaussian_filter(150, 1); Persistence_heat_maps q("data/file_with_diagram", filter_2, true, 1000, 0, 1); double distance_max_double_parameter = p.distance(q, std::numeric_limits::max()); double distance_inf_double_parameter = p.distance(q, std::numeric_limits::infinity()); // std::cerr << "distance_max_double_parameter: " << distance_max_double_parameter << std::endl; // std::cerr << "distance_inf_double_parameter: " << distance_inf_double_parameter << std::endl; BOOST_CHECK(distance_max_double_parameter == distance_inf_double_parameter); } // Below I am storing the code used to generate tests for that functionality. /* std::vector< std::pair< double,double > > intervals; intervals.push_back( std::make_pair(0.5,0.5) ); std::vector< std::vector > filter = create_Gaussian_filter(5,1); Persistence_heat_maps p( intervals , filter , constant_function, false , 100 , 0 , 1 ); p.plot( "heat_map_1" ); std::vector< std::pair< double,double > > intervals2; intervals2.push_back( std::make_pair(7,12) ); Persistence_heat_maps q( intervals2 , filter , constant_function, false , 100 , 0 , 10 ); q.plot( "heat_map_2" ); */ /* std::vector< std::pair< double,double > > intervals; intervals.push_back( std::make_pair(0.5,0.5) ); std::vector< std::vector > filter = create_Gaussian_filter(5,1); Persistence_heat_maps p( intervals , filter , constant_function, false , 10 , 0 , 1 ); p.write_to_file( "aaa" ); Persistence_heat_maps q; q.load_from_file( "aaa" ); cerr << ( p == q ) << endl; */ /* std::vector< std::vector > filter = create_Gaussian_filter(30,1); Persistence_heat_maps p( "file_with_diagram" , filter , constant_function, false , 100 , 0 , 1 ); p.plot( "heat_map_1" ); */ /* //test to construct persistence heat map: std::vector< std::vector > filter = create_Gaussian_filter(100,1); Persistence_heat_maps p( "file_with_diagram" , filter , constant_function, false , 1000 , 0 , 1 ); p.print_to_file( "persistence_heat_map_from_file_with_diagram" ); Persistence_heat_maps q; q.load_from_file( "persistence_heat_map_from_file_with_diagram" ); cerr << (p == q) << endl; */ /* //test of computations of a mean: std::vector< std::pair< double,double > > intervals; intervals.push_back( std::make_pair(5,5) ); std::vector< std::vector > filter = create_Gaussian_filter(5,1); Persistence_heat_maps p( intervals , filter , constant_function, false , 100 , 0 , 10 ); p.plot( "heat_map_1" ); std::vector< std::pair< double,double > > intervals2; intervals2.push_back( std::make_pair(7,7) ); Persistence_heat_maps q( intervals2 , filter , constant_function, false , 100 , 0 , 10 ); q.plot( "heat_map_2" ); Persistence_heat_maps av; av.compute_average( { &P , &q } ); av.plot( "average" ); */ /* std::vector< std::vector > filter = create_Gaussian_filter(30,1); Persistence_heat_maps p( "file_with_diagram" , filter , constant_function, false , 1000 , 0 , 10 ); Persistence_heat_maps q( "file_with_diagram_1" , filter , constant_function, false , 1000 , 0 , 10 ); Persistence_heat_maps r( "file_with_diagram_2" , filter , constant_function, false , 1000 , 0 , 10 ); Persistence_heat_maps av; av.compute_average( {&p,&q,&r} ); av.print_to_file( "template_average_of_heat_maps" ); */ /* std::vector< std::pair< double,double > > intervals; intervals.push_back( std::make_pair(5,5) ); std::vector< std::vector > filter = create_Gaussian_filter(5,1); Persistence_heat_maps p( intervals , filter , constant_function, false , 10 , 0 , 10 ); p.plot( "heat_map_1" ); std::vector< std::pair< double,double > > intervals2; intervals2.push_back( std::make_pair(7,7) ); Persistence_heat_maps q( intervals2 , filter , constant_function, false , 10 , 0 , 10 ); q.plot( "heat_map_2" ); Persistence_heat_maps median; median.compute_median( {&p,&q} ); median.plot( "median" ); */ /* std::vector< std::vector > filter = create_Gaussian_filter(30,1); Persistence_heat_maps p( "file_with_diagram" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps q( "file_with_diagram_1" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps r( "file_with_diagram_2" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps median; median.compute_median( {&p,&q,&r} ); median.print_to_file( "template_median_of_heat_maps" ); */ /* std::vector< std::vector > filter = create_Gaussian_filter(30,1); Persistence_heat_maps p( "file_with_diagram" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps q( "file_with_diagram_1" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps r( "file_with_diagram_2" , filter , constant_function, false , 1000 , 0 , 1 ); Persistence_heat_maps percentage_of_active; percentage_of_active.compute_percentage_of_active( {&p,&q,&r} , 0.1 ); percentage_of_active.print_to_file( "template_percentage_of_active_of_heat_maps" ); //percentage_of_active.plot( "template_percentage_of_active_of_heat_maps" ); */