1 #include <topology/rips.h>
2 #include <topology/filtration.h>
3 #include <topology/static-persistence.h>
4 #include <topology/dynamic-persistence.h>
5 #include <topology/persistence-diagram.h>
7 #include <geometry/l2distance.h>
8 #include <geometry/distances.h>
10 #include <utilities/containers.h> // for BackInsertFunctor
11 #include <utilities/timer.h>
15 #include <boost/program_options.hpp>
18 typedef PairwiseDistances<PointContainer, L2Distance> PairDistances;
19 typedef PairDistances::DistanceType DistanceType;
20 typedef PairDistances::IndexType Vertex;
22 typedef Rips<PairDistances> Generator;
23 typedef Generator::Simplex Smplx;
24 typedef Filtration<Smplx> Fltr;
25 // typedef StaticPersistence<> Persistence;
26 typedef DynamicPersistenceChains<> Persistence;
27 typedef PersistenceDiagram<> PDgm;
29 void program_options(int argc, char* argv[], std::string& infilename, Dimension& skeleton, DistanceType& max_distance);
31 int main(int argc, char* argv[])
34 DistanceType max_distance;
35 std::string infilename;
37 program_options(argc, argv, infilename, skeleton, max_distance);
39 PointContainer points;
40 read_points(infilename, points);
42 PairDistances distances(points);
43 Generator rips(distances);
44 Generator::Evaluator size(distances);
47 // Generate 2-skeleton of the Rips complex for epsilon = 50
48 rips.generate(skeleton, max_distance, make_push_back_functor(f));
49 std::cout << "# Generated complex of size: " << f.size() << std::endl;
51 // Generate filtration with respect to distance and compute its persistence
52 f.sort(Generator::Comparison(distances));
54 Timer persistence_timer; persistence_timer.start();
57 persistence_timer.stop();
61 Persistence::SimplexMap<Fltr> m = p.make_simplex_map(f);
62 for (Persistence::iterator cur = p.begin(); cur != p.end(); ++cur)
64 const Persistence::Cycle& cycle = cur->cycle;
66 if (!cur->sign()) // only negative simplices have non-empty cycles
68 Persistence::OrderIndex birth = cur->pair; // the cycle that cur killed was born when we added birth (another simplex)
70 const Smplx& b = m[birth];
71 const Smplx& d = m[cur];
73 // if (b.dimension() != 1) continue;
74 // std::cout << "Pair: (" << size(b) << ", " << size(d) << ")" << std::endl; 75 if (b.dimension() >= skeleton) continue;
76 std::cout << b.dimension() << " " << size(b) << " " << size(d) << std::endl;
77 } else if (cur->unpaired()) // positive could be unpaired
79 const Smplx& b = m[cur];
80 // if (b.dimension() != 1) continue;
82 // std::cout << "Unpaired birth: " << size(b) << std::endl;
83 // cycle = cur->chain; // TODO
84 if (b.dimension() >= skeleton) continue;
85 std::cout << b.dimension() << " " << size(b) << " inf" << std::endl;
88 // Iterate over the cycle
89 // for (Persistence::Cycle::const_iterator si = cycle.begin();
90 // si != cycle.end(); ++si)
92 // const Smplx& s = m[*si];
93 // //std::cout << s.dimension() << std::endl;
94 // const Smplx::VertexContainer& vertices = s.vertices(); // std::vector<Vertex> where Vertex = Distances::IndexType
95 // AssertMsg(vertices.size() == s.dimension() + 1, "dimension of a simplex is one less than the number of its vertices");
96 // std::cout << vertices[0] << " " << vertices[1] << std::endl;
101 persistence_timer.check("# Persistence timer"); 104 void program_options(int argc, char* argv[], std::string& infilename, Dimension& skeleton, DistanceType& max_distance)
106 namespace po = boost::program_options;
108 po::options_description hidden("Hidden options"); 110 ("input-file", po::value<std::string>(&infilename), "Point set whose Rips zigzag we want to compute"); 112 po::options_description visible("Allowed options", 100); 113 visible.add_options()
114 ("help,h", "produce help message") 115 ("skeleton-dimsnion,s", po::value<Dimension>(&skeleton)->default_value(2), "Dimension of the Rips complex we want to compute") 116 ("max-distance,m", po::value<DistanceType>(&max_distance)->default_value(Infinity), "Maximum value for the Rips complex construction"); 118 po::positional_options_description pos;
119 pos.add("input-file", 1); 121 po::options_description all; all.add(visible).add(hidden);
123 po::variables_map vm;
124 po::store(po::command_line_parser(argc, argv).
125 options(all).positional(pos).run(), vm);
128 if (vm.count("help") || !vm.count("input-file")) 130 std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl;
131 std::cout << visible << std::endl;