summaryrefslogtreecommitdiff
path: root/src/Toplex_map/include/gudhi/Filtered_toplex_map.h
blob: 6d89c062f103bf232f2bfd67c758487601e7503d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef FILTERED_TOPLEX_MAP_H
#define FILTERED_TOPLEX_MAP_H

#include <gudhi/Toplex_map.h>
#include <limits>

#define filtration_upper_bound std::numeric_limits<Filtration_value>::max()

namespace Gudhi {

class Filtered_toplex_map {

public:
    typedef double Filtration_value;

    template <typename Input_vertex_range>
    void insert_simplex_and_subfaces(const Input_vertex_range &vertex_range, Filtration_value f = filtration_upper_bound);

    template <typename Input_vertex_range>
    Filtration_value filtration(const Input_vertex_range &vertex_range) const;

protected:
    std::unordered_map<Filtration_value, Toplex_map> toplex_maps;
    std::unordered_map<Simplex_ptr, Filtration_value, Sptr_hash, Sptr_equal> filtrations;

};

template <typename Input_vertex_range>
void Filtered_toplex_map::insert_simplex_and_subfaces(const Input_vertex_range &vertex_range, Filtration_value f){
    if(!toplex_maps.count(f)) toplex_maps.emplace(f,Toplex_map());
    toplex_maps.at(f).insert_simplex(vertex_range);
    filtrations.emplace(get_key(vertex_range),f);
}

template <typename Input_vertex_range>
Filtered_toplex_map::Filtration_value Filtered_toplex_map::filtration(const Input_vertex_range &vertex_range) const{
    for(auto kv : toplex_maps)
        if(kv.second.membership(vertex_range))
            return kv.first;
    return filtration_upper_bound;
}

} //namespace Gudhi

#endif /* FILTERED_TOPLEX_MAP_H */