examples/poincare/poincare.cpp
author Dmitriy Morozov <dmitriy@mrzv.org>
Fri, 01 May 2009 15:36:25 -0700
branchdev
changeset 124 af54138b98fd
parent 100 884f70adc576
child 179 d15c6d144645
permissions -rw-r--r--
Added tools/extract-diagram + minor fixes

#include "topology/simplex.h"
#include "topology/filtration.h"
#include "topology/static-persistence.h"
#include "topology/persistence-diagram.h"

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <boost/program_options.hpp>

typedef         Simplex<unsigned, unsigned>     Smplx;
typedef         std::vector<Smplx>              Complex;
typedef         Filtration<Complex>             Fltr;
typedef         StaticPersistence<>             Persistence;
typedef         PersistenceDiagram<>            PDgm;

namespace po = boost::program_options;

int main(int argc, char** argv)
{
    std::string infilename;

    // Parse program options
    po::options_description hidden("Hidden options");
    hidden.add_options()
        ("input-file",  po::value<std::string>(&infilename),
                        "Filtration filename");

    po::options_description visible("Allowed options");
    visible.add_options()
        ("help,h",      "produce help message");
    po::positional_options_description p;
    p.add("input-file", 1);
    
    po::options_description all; all.add(visible).add(hidden);

    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).
                  options(all).positional(p).run(), vm);
    po::notify(vm);

    if (vm.count("help") || !vm.count("input-file"))
    { 
        std::cout << "Usage: " << argv[0] << " [options] FILENAME" << std::endl;
        std::cout << visible << std::endl; 
        return 1; 
    }


    Complex c;

    std::ifstream in(infilename.c_str());
    unsigned int i = 0;
    std::string s;
    std::getline(in, s);
    while(in)
    {
        std::istringstream linestream(s);
        Smplx simplex(i++);
        unsigned int vertex;
        linestream >> vertex;
        while(linestream)
        {
            simplex.add(vertex);
            linestream >> vertex;
        }
        std::cout << simplex << std::endl;
        c.push_back(simplex);
        std::getline(in, s);
    }
    
    std::sort(c.begin(), c.end(), Smplx::VertexComparison());
    Fltr f(c.begin(), c.end(), Smplx::DataComparison());
    Persistence pers(f);
    pers.pair_simplices();

    std::map<Dimension, PDgm> dgms;
    init_diagrams(dgms, pers.begin(), pers.end(), 
                  evaluate_through_map(OffsetMap<Persistence::OrderIndex, Fltr::Index>(pers.begin(), f.begin()), 
                                       evaluate_through_filtration(f, Smplx::DataEvaluator())), 
                  evaluate_through_map(OffsetMap<Persistence::OrderIndex, Fltr::Index>(pers.begin(), f.begin()), 
                                       evaluate_through_filtration(f, Smplx::DimensionExtractor())));

    std::cout << 0 << std::endl << dgms[0] << std::endl;
    std::cout << 1 << std::endl << dgms[1] << std::endl;
    std::cout << 2 << std::endl << dgms[2] << std::endl;
    std::cout << 3 << std::endl << dgms[3] << std::endl;
}