11#ifndef SIMPLEX_TREE_H_
12#define SIMPLEX_TREE_H_
14#include <gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h>
15#include <gudhi/Simplex_tree/Simplex_tree_siblings.h>
16#include <gudhi/Simplex_tree/Simplex_tree_iterators.h>
17#include <gudhi/Simplex_tree/indexing_tag.h>
21#include <gudhi/Debug_utils.h>
23#include <boost/container/flat_map.hpp>
24#include <boost/iterator/transform_iterator.hpp>
25#include <boost/graph/adjacency_list.hpp>
26#include <boost/range/adaptor/reversed.hpp>
27#include <boost/container/static_vector.hpp>
30#include <tbb/parallel_sort.h>
38#include <initializer_list>
63struct Simplex_tree_options_full_featured;
78template<
typename SimplexTreeOptions = Simplex_tree_options_full_featured>
102 typedef typename boost::container::flat_map<Vertex_handle, Node> Dictionary;
109 struct Key_simplex_base_real {
110 Key_simplex_base_real() : key_(-1) {}
116 struct Key_simplex_base_dummy {
117 Key_simplex_base_dummy() {}
122 struct Extended_filtration_data {
125 Extended_filtration_data(){}
128 typedef typename std::conditional<Options::store_key, Key_simplex_base_real, Key_simplex_base_dummy>::type
131 struct Filtration_simplex_base_real {
132 Filtration_simplex_base_real() : filt_(0) {}
138 struct Filtration_simplex_base_dummy {
139 Filtration_simplex_base_dummy() {}
143 typedef typename std::conditional<Options::store_filtration, Filtration_simplex_base_real,
144 Filtration_simplex_base_dummy>::type Filtration_simplex_base;
155 typedef typename Dictionary::iterator Dictionary_it;
156 typedef typename Dictionary_it::value_type Dit_value_t;
158 struct return_first {
228 boost::make_transform_iterator(root_.members_.begin(), return_first()),
229 boost::make_transform_iterator(root_.members_.end(), return_first()));
273 return filtration_vect_;
302 template<
class SimplexHandle>
319 template<
class SimplexHandle>
332 root_(nullptr, null_vertex_),
339 std::clog <<
"Simplex_tree copy constructor" << std::endl;
341 copy_from(complex_source);
349 std::clog <<
"Simplex_tree move constructor" << std::endl;
351 move_from(complex_source);
355 complex_source.dimension_ = -1;
360 root_members_recursive_deletion();
366 std::clog <<
"Simplex_tree copy assignment" << std::endl;
369 if (&complex_source !=
this) {
371 root_members_recursive_deletion();
373 copy_from(complex_source);
383 std::clog <<
"Simplex_tree move assignment" << std::endl;
386 if (&complex_source !=
this) {
388 root_members_recursive_deletion();
390 move_from(complex_source);
399 null_vertex_ = complex_source.null_vertex_;
400 filtration_vect_.clear();
401 dimension_ = complex_source.dimension_;
402 auto root_source = complex_source.root_;
405 root_.members() = Dictionary(boost::container::ordered_unique_range, root_source.members().begin(), root_source.members().end());
407 for (
auto& map_el : root_.members()) {
408 map_el.second.assign_children(&root_);
410 rec_copy(&root_, &root_source);
415 for (
auto sh = sib->members().begin(), sh_source = sib_source->members().begin();
416 sh != sib->members().end(); ++sh, ++sh_source) {
419 newsib->members_.reserve(sh_source->second.children()->members().size());
420 for (
auto & child : sh_source->second.children()->members())
421 newsib->members_.emplace_hint(newsib->members_.end(), child.first, Node(newsib, child.second.filtration()));
422 rec_copy(newsib, sh_source->second.children());
423 sh->second.assign_children(newsib);
430 null_vertex_ = std::move(complex_source.null_vertex_);
431 root_ = std::move(complex_source.root_);
432 filtration_vect_ = std::move(complex_source.filtration_vect_);
433 dimension_ = std::move(complex_source.dimension_);
436 for (
auto& map_el : root_.members()) {
437 if (map_el.second.children() != &(complex_source.root_)) {
439 map_el.second.children()->oncles_ = &root_;
442 GUDHI_CHECK(map_el.second.children()->oncles_ ==
nullptr,
443 std::invalid_argument(
"Simplex_tree move constructor from an invalid Simplex_tree"));
445 map_el.second.assign_children(&root_);
451 void root_members_recursive_deletion() {
452 for (
auto sh = root_.members().begin(); sh != root_.members().end(); ++sh) {
454 rec_delete(sh->second.children());
457 root_.members().clear();
462 for (
auto sh = sib->members().begin(); sh != sib->members().end(); ++sh) {
464 rec_delete(sh->second.children());
473 if ((null_vertex_ != st2.null_vertex_) ||
474 (dimension_ != st2.dimension_))
476 return rec_equal(&root_, &st2.root_);
481 return (!(*
this == st2));
487 if (s1->members().size() != s2->members().size())
489 for (
auto sh1 = s1->members().begin(), sh2 = s2->members().begin();
490 (sh1 != s1->members().end() && sh2 != s2->members().end()); ++sh1, ++sh2) {
491 if (sh1->first != sh2->first || sh1->second.filtration() != sh2->second.filtration())
497 if (!rec_equal(sh1->second.children(), sh2->second.children()))
509 return sh->second.filtration();
519 return sh->second.key();
527 return filtration_vect_[idx];
537 return sh->second.filtration();
539 return std::numeric_limits<Filtration_value>::infinity();
548 std::invalid_argument(
"Simplex_tree::assign_filtration - cannot assign filtration on null_simplex"));
549 sh->second.assign_filtration(fv);
557 return Dictionary_it(
nullptr);
573 return root_.members_.size();
585 auto sib_begin = sib->members().begin();
586 auto sib_end = sib->members().end();
587 size_t simplices_number = sib_end - sib_begin;
588 for (
auto sh = sib_begin; sh != sib_end; ++sh) {
593 return simplices_number;
603 while (curr_sib !=
nullptr) {
605 curr_sib = curr_sib->oncles();
620 if (dimension_to_be_lowered_)
621 lower_upper_bound_dimension();
627 template<
class SimplexHandle>
630 return (sh->second.children()->parent() == sh->first);
640 template<
class InputVertexRange = std::initializer_list<Vertex_handle>>
642 auto first = std::begin(s);
643 auto last = std::end(s);
649 std::vector<Vertex_handle> copy(first, last);
650 std::sort(std::begin(copy), std::end(copy));
651 return find_simplex(copy);
656 Simplex_handle find_simplex(
const std::vector<Vertex_handle> &
simplex) {
658 Dictionary_it tmp_dit;
660 if (Options::contiguous_vertices) {
662 GUDHI_CHECK(contiguous_vertices(),
"non-contiguous vertices");
664 if(v < 0 || v >=
static_cast<Vertex_handle>(root_.members_.size()))
666 tmp_dit = root_.members_.begin() + v;
671 tmp_sib = tmp_dit->second.children();
674 tmp_dit = tmp_sib->members_.find(*vi++);
675 if (tmp_dit == tmp_sib->members_.end())
681 tmp_sib = tmp_dit->second.children();
688 if (Options::contiguous_vertices) {
689 assert(contiguous_vertices());
690 return root_.members_.begin() + v;
692 return root_.members_.find(v);
698 bool contiguous_vertices()
const {
699 if (root_.members_.empty())
return true;
700 if (root_.members_.begin()->first != 0)
return false;
701 if (std::prev(root_.members_.end())->first !=
static_cast<Vertex_handle>(root_.members_.size() - 1))
return false;
720 std::pair<Simplex_handle, bool> insert_vertex_vector(
const std::vector<Vertex_handle>&
simplex,
723 std::pair<Simplex_handle, bool> res_insert;
725 for (; vi !=
simplex.end() - 1; ++vi) {
726 GUDHI_CHECK(*vi !=
null_vertex(),
"cannot use the dummy null_vertex() as a real vertex");
727 res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib,
filtration));
729 res_insert.first->second.assign_children(
new Siblings(curr_sib, *vi));
731 curr_sib = res_insert.first->second.children();
733 GUDHI_CHECK(*vi !=
null_vertex(),
"cannot use the dummy null_vertex() as a real vertex");
734 res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib,
filtration));
735 if (!res_insert.second) {
737 if (res_insert.first->second.filtration() >
filtration) {
739 res_insert.first->second.assign_filtration(
filtration);
743 return std::pair<Simplex_handle, bool>(
null_simplex(),
false);
746 if (
static_cast<int>(
simplex.size()) - 1 > dimension_) {
748 dimension_ =
static_cast<int>(
simplex.size()) - 1;
777 template<
class InputVertexRange = std::initializer_list<Vertex_handle>>
780 auto first = std::begin(
simplex);
784 return std::pair<Simplex_handle, bool>(
null_simplex(),
true);
787 std::vector<Vertex_handle> copy(first, last);
788 std::sort(std::begin(copy), std::end(copy));
789 return insert_vertex_vector(copy,
filtration);
806 template<
class InputVertexRange = std::initializer_list<Vertex_handle>>
809 auto first = std::begin(Nsimplex);
810 auto last = std::end(Nsimplex);
815 thread_local std::vector<Vertex_handle> copy;
817 copy.insert(copy.end(), first, last);
818 std::sort(copy.begin(), copy.end());
819 auto last_unique = std::unique(copy.begin(), copy.end());
820 copy.erase(last_unique, copy.end());
823 GUDHI_CHECK(v !=
null_vertex(),
"cannot use the dummy null_vertex() as a real vertex");
826 dimension_ = (std::max)(dimension_,
static_cast<int>(std::distance(copy.begin(), copy.end())) - 1);
828 return rec_insert_simplex_and_subfaces_sorted(
root(), copy.begin(), copy.end(),
filtration);
833 template<
class ForwardVertexIterator>
834 std::pair<Simplex_handle, bool> rec_insert_simplex_and_subfaces_sorted(
Siblings* sib,
835 ForwardVertexIterator first,
836 ForwardVertexIterator last,
843 auto&& dict = sib->members();
844 auto insertion_result = dict.emplace(vertex_one, Node(sib, filt));
845 Simplex_handle simplex_one = insertion_result.first;
846 bool one_is_new = insertion_result.second;
855 if (++first == last)
return insertion_result;
858 simplex_one->second.assign_children(
new Siblings(sib, vertex_one));
859 auto res = rec_insert_simplex_and_subfaces_sorted(simplex_one->second.children(), first, last, filt);
861 if (res.first !=
null_simplex()) rec_insert_simplex_and_subfaces_sorted(sib, first, last, filt);
869 sh->second.assign_key(
key);
877 return { find_vertex(sh->first), find_vertex(
self_siblings(sh)->parent()) };
881 template<
class SimplexHandle>
883 if (sh->second.children()->parent() == sh->first)
884 return sh->second.children()->oncles();
886 return sh->second.children();
900 dimension_to_be_lowered_ =
false;
913 filtration_vect_.clear();
916 filtration_vect_.push_back(sh);
928 tbb::parallel_sort(filtration_vect_.begin(), filtration_vect_.end(), is_before_in_filtration(
this));
930 std::stable_sort(filtration_vect_.begin(), filtration_vect_.end(), is_before_in_filtration(
this));
937 if (filtration_vect_.empty()) {
946 filtration_vect_.clear();
962 void rec_coface(std::vector<Vertex_handle> &vertices,
Siblings *curr_sib,
int curr_nbVertices,
963 std::vector<Simplex_handle>& cofaces,
bool star,
int nbVertices) {
964 if (!(star || curr_nbVertices <= nbVertices))
966 for (Simplex_handle
simplex = curr_sib->members().begin();
simplex != curr_sib->members().end(); ++
simplex) {
967 if (vertices.empty()) {
972 bool addCoface = (star || curr_nbVertices == nbVertices);
976 rec_coface(vertices,
simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
978 if (
simplex->first == vertices.back()) {
980 bool equalDim = (star || curr_nbVertices == nbVertices);
981 bool addCoface = vertices.size() == 1 && equalDim;
988 rec_coface(vertices,
simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
989 vertices.push_back(tmp);
991 }
else if (
simplex->first > vertices.back()) {
996 rec_coface(vertices,
simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
1022 assert(codimension >= 0);
1024 std::vector<Vertex_handle> copy(rg.begin(), rg.end());
1025 if (codimension +
static_cast<int>(copy.size()) > dimension_ + 1 ||
1026 (codimension == 0 &&
static_cast<int>(copy.size()) > dimension_))
1029 assert(std::is_sorted(copy.begin(), copy.end(), std::greater<Vertex_handle>()));
1030 bool star = codimension == 0;
1031 rec_coface(copy, &root_, 1, cofaces, star, codimension +
static_cast<int>(copy.size()));
1043 bool reverse_lexicographic_order(Simplex_handle sh1, Simplex_handle sh2) {
1048 while (it1 != rg1.end() && it2 != rg2.end()) {
1056 return ((it1 == rg1.end()) && (it2 != rg2.end()));
1065 struct is_before_in_filtration {
1069 bool operator()(
const Simplex_handle sh1,
const Simplex_handle sh2)
const {
1071 if (sh1->second.filtration() != sh2->second.filtration()) {
1072 return sh1->second.filtration() < sh2->second.filtration();
1075 return st_->reverse_lexicographic_order(sh1, sh2);
1105 template<
class OneSkeletonGraph>
1111 using boost::num_vertices;
1116 if (num_edges(skel_graph) == 0) {
1124 typename boost::graph_traits<OneSkeletonGraph>::vertex_iterator v_it,
1126 for (std::tie(v_it, v_it_end) = vertices(skel_graph); v_it != v_it_end;
1128 root_.members_.emplace_hint(
1129 root_.members_.end(), *v_it,
1130 Node(&root_, get(vertex_filtration_t(), skel_graph, *v_it)));
1132 std::pair<typename boost::graph_traits<OneSkeletonGraph>::edge_iterator,
1133 typename boost::graph_traits<OneSkeletonGraph>::edge_iterator> boost_edges = edges(skel_graph);
1136 for (; boost_edges.first != boost_edges.second; boost_edges.first++) {
1137 auto edge = *(boost_edges.first);
1138 auto u = source(edge, skel_graph);
1139 auto v = target(edge, skel_graph);
1140 if (u == v)
throw "Self-loops are not simplicial";
1148 if (v < u) std::swap(u, v);
1149 auto sh = find_vertex(u);
1151 sh->second.assign_children(
new Siblings(&root_, sh->first));
1154 sh->second.children()->members().emplace(v,
1155 Node(sh->second.children(), get(edge_filtration_t(), skel_graph, edge)));
1171 if (max_dim <= 1)
return;
1173 dimension_ = max_dim;
1174 for (Dictionary_it root_it = root_.members_.begin();
1175 root_it != root_.members_.end(); ++root_it) {
1177 siblings_expansion(root_it->second.children(), max_dim - 1);
1180 dimension_ = max_dim - dimension_;
1185 void siblings_expansion(
Siblings * siblings,
1187 if (dimension_ > k) {
1192 Dictionary_it next = siblings->members().begin();
1195 thread_local std::vector<std::pair<Vertex_handle, Node> > inter;
1196 for (Dictionary_it s_h = siblings->members().begin();
1197 s_h != siblings->members().end(); ++s_h, ++next) {
1198 Simplex_handle root_sh = find_vertex(s_h->first);
1203 siblings->members().end(),
1204 root_sh->second.children()->members().begin(),
1205 root_sh->second.children()->members().end(),
1206 s_h->second.filtration());
1207 if (inter.size() != 0) {
1212 s_h->second.assign_children(new_sib);
1213 siblings_expansion(new_sib, k - 1);
1216 s_h->second.assign_children(siblings);
1225 static void intersection(std::vector<std::pair<Vertex_handle, Node> >& intersection,
1226 Dictionary_it begin1, Dictionary_it end1,
1227 Dictionary_it begin2, Dictionary_it end2,
1229 if (begin1 == end1 || begin2 == end2)
1232 if (begin1->first == begin2->first) {
1233 Filtration_value filt = (std::max)({begin1->second.filtration(), begin2->second.filtration(), filtration_});
1234 intersection.emplace_back(begin1->first, Node(
nullptr, filt));
1235 if (++begin1 == end1 || ++begin2 == end2)
1237 }
else if (begin1->first < begin2->first) {
1238 if (++begin1 == end1)
1241 if (++begin2 == end2)
1266 template<
typename Blocker >
1269 for (
auto&
simplex : boost::adaptors::reverse(root_.members())) {
1271 siblings_expansion_with_blockers(
simplex.second.children(), max_dim, max_dim - 1, block_simplex);
1278 template<
typename Blocker >
1279 void siblings_expansion_with_blockers(
Siblings* siblings,
int max_dim,
int k, Blocker block_simplex) {
1280 if (dimension_ < max_dim - k) {
1281 dimension_ = max_dim - k;
1286 if (siblings->members().size() < 2)
1289 for (
auto simplex = siblings->members().rbegin() + 1;
simplex != siblings->members().rend();
simplex++) {
1290 std::vector<std::pair<Vertex_handle, Node> > intersection;
1291 for(
auto next = siblings->members().rbegin(); next !=
simplex; next++) {
1292 bool to_be_inserted =
true;
1296 Simplex_handle border_child = find_child(border, next->first);
1298 to_be_inserted=
false;
1301 filt = (std::max)(filt,
filtration(border_child));
1303 if (to_be_inserted) {
1304 intersection.emplace_back(next->first, Node(
nullptr, filt));
1307 if (intersection.size() != 0) {
1311 boost::adaptors::reverse(intersection));
1312 simplex->second.assign_children(new_sib);
1313 std::vector<Vertex_handle> blocked_new_sib_vertex_list;
1315 for (
auto new_sib_member = new_sib->members().begin();
1316 new_sib_member != new_sib->members().end();
1318 bool blocker_result = block_simplex(new_sib_member);
1321 if (blocker_result) {
1322 blocked_new_sib_vertex_list.push_back(new_sib_member->first);
1325 if (blocked_new_sib_vertex_list.size() == new_sib->members().size()) {
1329 simplex->second.assign_children(siblings);
1331 for (
auto& blocked_new_sib_member : blocked_new_sib_vertex_list) {
1332 new_sib->members().erase(blocked_new_sib_member);
1335 siblings_expansion_with_blockers(new_sib, max_dim, k - 1, block_simplex);
1339 simplex->second.assign_children(siblings);
1348 Simplex_handle find_child(Simplex_handle sh,
Vertex_handle vh)
const {
1352 Simplex_handle child = sh->second.children()->find(vh);
1355 if (child == sh->second.children()->members().end())
1373 os <<
key(b_sh) <<
" ";
1387 bool modified =
false;
1389 for (
auto&
simplex : boost::adaptors::reverse(root_.members())) {
1391 modified |= rec_make_filtration_non_decreasing(
simplex.second.children());
1404 bool rec_make_filtration_non_decreasing(
Siblings * sib) {
1405 bool modified =
false;
1408 for (
auto&
simplex : boost::adaptors::reverse(sib->members())) {
1412 [](Simplex_handle sh1, Simplex_handle sh2) {
1419 if (!(
simplex.second.filtration() >= max_filt_border_value)) {
1422 simplex.second.assign_filtration(max_filt_border_value);
1425 modified |= rec_make_filtration_non_decreasing(
simplex.second.children());
1449 auto&& list = sib->members();
1450 auto last = std::remove_if(list.begin(), list.end(), [
this,filt](Dit_value_t&
simplex) {
1451 if (simplex.second.filtration() <= filt) return false;
1452 if (has_children(&simplex)) rec_delete(simplex.second.children());
1454 dimension_to_be_lowered_ = true;
1458 bool modified = (last != list.end());
1459 if (last == list.begin() && sib !=
root()) {
1461 sib->oncles()->members()[sib->parent()].assign_children(sib->oncles());
1464 dimension_to_be_lowered_ =
true;
1468 list.erase(last, list.end());
1471 modified |= rec_prune_above_filtration(
simplex.second.children(), filt);
1482 bool lower_upper_bound_dimension() {
1484 dimension_to_be_lowered_ =
false;
1485 int new_dimension = -1;
1490 std::clog <<
" " << vertex;
1492 std::clog << std::endl;
1496 if (sh_dimension >= dimension_)
1499 new_dimension = (std::max)(new_dimension, sh_dimension);
1501 dimension_ = new_dimension;
1518 std::invalid_argument(
"Simplex_tree::remove_maximal_simplex - argument has children"));
1521 Siblings* child = sh->second.children();
1523 if ((child->size() > 1) || (child ==
root())) {
1529 child->oncles()->members().at(child->parent()).assign_children(child->oncles());
1532 dimension_to_be_lowered_ =
true;
1553 std::pair<Filtration_value, Extended_simplex_type> p;
1556 if (f >= -2 && f <= -1){
1557 p.first = minval + (maxval-minval)*(f + 2); p.second = Extended_simplex_type::UP;
1559 else if (f >= 1 && f <= 2){
1560 p.first = minval - (maxval-minval)*(f - 2); p.second = Extended_simplex_type::DOWN;
1563 p.first = std::numeric_limits<Filtration_value>::quiet_NaN(); p.second = Extended_simplex_type::EXTRA;
1585 Vertex_handle maxvert = std::numeric_limits<Vertex_handle>::min();
1586 Filtration_value minval = std::numeric_limits<Filtration_value>::infinity();
1587 Filtration_value maxval = -std::numeric_limits<Filtration_value>::infinity();
1588 for (
auto sh = root_.members().begin(); sh != root_.members().end(); ++sh){
1590 minval = std::min(minval, f);
1591 maxval = std::max(maxval, f);
1592 maxvert = std::max(sh->first, maxvert);
1595 GUDHI_CHECK(maxvert < std::numeric_limits<Vertex_handle>::max(), std::invalid_argument(
"Simplex_tree contains a vertex with the largest Vertex_handle"));
1604 std::vector<Vertex_handle> vr;
1612 auto sh = this->
find(vr);
1615 vr.push_back(maxvert);
1635 Extended_filtration_data efd(minval, maxval);
1644 auto filt = filtration_(sh);
1646 if(filtration_(find_vertex(v)) == filt)
1660 auto end = std::end(vertices);
1661 auto vi = std::begin(vertices);
1662 GUDHI_CHECK(vi != end,
"empty simplex");
1665 GUDHI_CHECK(vi != end,
"simplex of dimension 0");
1666 if(std::next(vi) == end)
return sh;
1667 boost::container::static_vector<Vertex_handle, 40> suffix;
1668 suffix.push_back(v0);
1669 auto filt = filtration_(sh);
1673 auto&& children1 = find_vertex(v)->second.children()->members_;
1674 for(
auto w : suffix){
1677 if(filtration_(s) == filt)
1680 suffix.push_back(v);
1691 auto filt = filtration_(sh);
1694 if(filtration_(b) == filt)
1709 rec_reset_filtration(&root_, filt_value, min_dim);
1720 for (
auto sh = sib->members().begin(); sh != sib->members().end(); ++sh) {
1721 if (min_depth <= 0) {
1722 sh->second.assign_filtration(filt_value);
1725 rec_reset_filtration(sh->second.children(), filt_value, min_depth - 1);
1736 std::vector<Simplex_handle> filtration_vect_;
1739 bool dimension_to_be_lowered_ =
false;
1743template<
typename...T>
1755template<
typename...T>
1758 std::vector<typename ST::Vertex_handle> simplex;
1764 int dim =
static_cast<int> (simplex.size() - 1);
1765 if (max_dim < dim) {
1783 typedef int Vertex_handle;
1784 typedef double Filtration_value;
1785 typedef std::uint32_t Simplex_key;
1786 static const bool store_key =
true;
1787 static const bool store_filtration =
true;
1788 static const bool contiguous_vertices =
false;
1799 typedef int Vertex_handle;
1800 typedef float Filtration_value;
1801 typedef std::uint32_t Simplex_key;
1802 static const bool store_key =
true;
1803 static const bool store_filtration =
true;
1804 static const bool contiguous_vertices =
true;
Extended simplex type data structure for representing the type of simplices in an extended filtration...
Iterator over the simplices of the boundary of a simplex and their opposite vertices.
Definition: Simplex_tree_iterators.h:190
Iterator over the simplices of the boundary of a simplex.
Definition: Simplex_tree_iterators.h:83
Iterator over the simplices of a simplicial complex.
Definition: Simplex_tree_iterators.h:300
Iterator over the vertices of a simplex in a SimplexTree.
Definition: Simplex_tree_iterators.h:38
Iterator over the simplices of the skeleton of a given dimension of the simplicial complex.
Definition: Simplex_tree_iterators.h:374
Simplex Tree data structure for representing simplicial complexes.
Definition: Simplex_tree.h:79
static Siblings * self_siblings(SimplexHandle sh)
Definition: Simplex_tree.h:882
Simplex_tree(Simplex_tree &&complex_source)
User-defined move constructor relocates the whole tree structure.
Definition: Simplex_tree.h:347
bool operator==(Simplex_tree &st2)
Checks if two simplex trees are equal.
Definition: Simplex_tree.h:472
Options::Filtration_value Filtration_value
Type for the value of the filtration function.
Definition: Simplex_tree.h:86
Cofaces_simplex_range cofaces_simplex_range(const Simplex_handle simplex, int codimension)
Compute the cofaces of a n simplex.
Definition: Simplex_tree.h:1019
Simplex_tree_boundary_opposite_vertex_simplex_iterator< Simplex_tree > Boundary_opposite_vertex_simplex_iterator
Iterator over the simplices of the boundary of a simplex and their opposite vertices.
Definition: Simplex_tree.h:196
void reset_filtration(Filtration_value filt_value, int min_dim=0)
This function resets the filtration value of all the simplices of dimension at least min_dim....
Definition: Simplex_tree.h:1708
void assign_filtration(Simplex_handle sh, Filtration_value fv)
Sets the filtration value of a simplex.
Definition: Simplex_tree.h:546
bool make_filtration_non_decreasing()
This function ensures that each simplex has a higher filtration value than its faces by increasing th...
Definition: Simplex_tree.h:1386
Dictionary::iterator Simplex_handle
Handle type to a simplex contained in the simplicial complex represented by the simplex tree.
Definition: Simplex_tree.h:152
Vertex_handle vertex_with_same_filtration(Simplex_handle sh)
Returns a vertex of sh that has the same filtration value as sh if it exists, and null_vertex() other...
Definition: Simplex_tree.h:1643
Filtration_simplex_range const & filtration_simplex_range(Indexing_tag=Indexing_tag())
Returns a range over the simplices of the simplicial complex, in the order of the filtration.
Definition: Simplex_tree.h:271
std::pair< Simplex_handle, bool > insert_simplex(const InputVertexRange &simplex, Filtration_value filtration=0)
Insert a simplex, represented by a range of Vertex_handles, in the simplicial complex.
Definition: Simplex_tree.h:778
Vertex_handle null_vertex() const
Returns a Vertex_handle different from all Vertex_handles associated to the vertices of the simplicia...
Definition: Simplex_tree.h:567
boost::iterator_range< Boundary_simplex_iterator > Boundary_simplex_range
Range over the simplices of the boundary of a simplex.
Definition: Simplex_tree.h:192
Simplex_vertex_range simplex_vertex_range(Simplex_handle sh) const
Returns a range over the vertices of a simplex.
Definition: Simplex_tree.h:282
void clear_filtration()
Clears the filtration cache produced by initialize_filtration().
Definition: Simplex_tree.h:945
Simplex_tree_simplex_vertex_iterator< Simplex_tree > Simplex_vertex_iterator
Iterator over the vertices of a simplex.
Definition: Simplex_tree.h:182
static Simplex_key key(Simplex_handle sh)
Returns the key associated to a simplex.
Definition: Simplex_tree.h:518
static Filtration_value filtration(Simplex_handle sh)
Returns the filtration value of a simplex.
Definition: Simplex_tree.h:535
bool operator!=(Simplex_tree &st2)
Checks if two simplex trees are different.
Definition: Simplex_tree.h:480
bool has_children(SimplexHandle sh) const
Returns true if the node in the simplex tree pointed by sh has children.
Definition: Simplex_tree.h:628
Cofaces_simplex_range star_simplex_range(const Simplex_handle simplex)
Compute the star of a n simplex.
Definition: Simplex_tree.h:1008
void expansion_with_blockers(int max_dim, Blocker block_simplex)
Expands a simplex tree containing only a graph. Simplices corresponding to cliques in the graph are a...
Definition: Simplex_tree.h:1267
boost::iterator_range< Simplex_vertex_iterator > Simplex_vertex_range
Range over the vertices of a simplex.
Definition: Simplex_tree.h:184
void remove_maximal_simplex(Simplex_handle sh)
Remove a maximal simplex.
Definition: Simplex_tree.h:1515
std::pair< Simplex_handle, Simplex_handle > endpoints(Simplex_handle sh)
Definition: Simplex_tree.h:875
void assign_key(Simplex_handle sh, Simplex_key key)
Assign a value 'key' to the key of the simplex represented by the Simplex_handle 'sh'.
Definition: Simplex_tree.h:868
Options::Simplex_key Simplex_key
Key associated to each simplex.
Definition: Simplex_tree.h:90
Simplex_tree()
Constructs an empty simplex tree.
Definition: Simplex_tree.h:330
void maybe_initialize_filtration()
Initializes the filtration cache if it isn't initialized yet.
Definition: Simplex_tree.h:936
boost::iterator_range< Complex_simplex_iterator > Complex_simplex_range
Range over the simplices of the simplicial complex.
Definition: Simplex_tree.h:204
Simplex_tree_boundary_simplex_iterator< Simplex_tree > Boundary_simplex_iterator
Iterator over the simplices of the boundary of a simplex.
Definition: Simplex_tree.h:190
Simplex_tree_siblings< Simplex_tree, Dictionary > Siblings
Set of nodes sharing a same parent in the simplex tree.
Definition: Simplex_tree.h:105
Simplex_handle find(const InputVertexRange &s)
Given a range of Vertex_handles, returns the Simplex_handle of the simplex in the simplicial complex ...
Definition: Simplex_tree.h:641
std::vector< Simplex_handle > Cofaces_simplex_range
Range over the cofaces of a simplex.
Definition: Simplex_tree.h:186
Boundary_opposite_vertex_simplex_range boundary_opposite_vertex_simplex_range(SimplexHandle sh)
Given a simplex, returns a range over the simplices of its boundary and their opposite vertices.
Definition: Simplex_tree.h:320
Simplex_handle edge_with_same_filtration(Simplex_handle sh)
Returns an edge of sh that has the same filtration value as sh if it exists, and null_simplex() other...
Definition: Simplex_tree.h:1657
Simplex_tree_complex_simplex_iterator< Simplex_tree > Complex_simplex_iterator
Iterator over the simplices of the simplicial complex.
Definition: Simplex_tree.h:202
Simplex_handle simplex(Simplex_key idx) const
Returns the simplex that has index idx in the filtration.
Definition: Simplex_tree.h:526
void initialize_filtration()
Initializes the filtration cache, i.e. sorts the simplices according to their order in the filtration...
Definition: Simplex_tree.h:912
Skeleton_simplex_range skeleton_simplex_range(int dim)
Returns a range over the simplices of the dim-skeleton of the simplicial complex.
Definition: Simplex_tree.h:251
boost::transform_iterator< return_first, Dictionary_it > Complex_vertex_iterator
Iterator over the vertices of the simplicial complex.
Definition: Simplex_tree.h:176
std::vector< Simplex_handle > Filtration_simplex_range
Range over the simplices of the simplicial complex, ordered by the filtration.
Definition: Simplex_tree.h:214
Filtration_simplex_range::const_iterator Filtration_simplex_iterator
Iterator over the simplices of the simplicial complex, ordered by the filtration.
Definition: Simplex_tree.h:218
Extended_filtration_data extend_filtration()
Extend filtration for computing extended persistence. This function only uses the filtration values a...
Definition: Simplex_tree.h:1581
Simplex_handle minimal_simplex_with_same_filtration(Simplex_handle sh)
Returns a minimal face of sh that has the same filtration value as sh.
Definition: Simplex_tree.h:1690
Options::Vertex_handle Vertex_handle
Type for the vertex handle.
Definition: Simplex_tree.h:94
std::pair< Filtration_value, Extended_simplex_type > decode_extended_filtration(Filtration_value f, const Extended_filtration_data &efd)
Retrieve the original filtration value for a given simplex in the Simplex_tree. Since the computation...
Definition: Simplex_tree.h:1552
size_t num_vertices() const
Returns the number of vertices in the complex.
Definition: Simplex_tree.h:572
void expansion(int max_dim)
Expands the Simplex_tree containing only its one skeleton until dimension max_dim.
Definition: Simplex_tree.h:1170
Simplex_tree(const Simplex_tree &complex_source)
User-defined copy constructor reproduces the whole tree structure.
Definition: Simplex_tree.h:337
boost::iterator_range< Complex_vertex_iterator > Complex_vertex_range
Range over the vertices of the simplicial complex.
Definition: Simplex_tree.h:178
static Simplex_key null_key()
Returns a fixed number not in the interval [0, num_simplices()).
Definition: Simplex_tree.h:561
Boundary_simplex_range boundary_simplex_range(SimplexHandle sh)
Returns a range over the simplices of the boundary of a simplex.
Definition: Simplex_tree.h:303
int dimension(Simplex_handle sh)
Returns the dimension of a simplex.
Definition: Simplex_tree.h:600
bool prune_above_filtration(Filtration_value filtration)
Prune above filtration value given as parameter.
Definition: Simplex_tree.h:1440
int upper_bound_dimension() const
Returns an upper bound on the dimension of the simplicial complex.
Definition: Simplex_tree.h:611
Siblings * root()
Definition: Simplex_tree.h:891
int dimension()
Returns the dimension of the simplicial complex.
Definition: Simplex_tree.h:619
std::pair< Simplex_handle, bool > insert_simplex_and_subfaces(const InputVertexRange &Nsimplex, Filtration_value filtration=0)
Insert a N-simplex and all his subfaces, from a N-simplex represented by a range of Vertex_handles,...
Definition: Simplex_tree.h:807
size_t num_simplices()
returns the number of simplices in the simplex_tree.
Definition: Simplex_tree.h:578
Simplex_tree_skeleton_simplex_iterator< Simplex_tree > Skeleton_simplex_iterator
Iterator over the simplices of the skeleton of the simplicial complex, for a given dimension.
Definition: Simplex_tree.h:209
Simplex_tree & operator=(Simplex_tree &&complex_source)
User-defined move assignment relocates the whole tree structure.
Definition: Simplex_tree.h:381
boost::iterator_range< Boundary_opposite_vertex_simplex_iterator > Boundary_opposite_vertex_simplex_range
Range over the simplices of the boundary of a simplex and their opposite vertices.
Definition: Simplex_tree.h:198
Simplex_tree & operator=(const Simplex_tree &complex_source)
User-defined copy assignment reproduces the whole tree structure.
Definition: Simplex_tree.h:364
void insert_graph(const OneSkeletonGraph &skel_graph)
Inserts a 1-skeleton in an empty Simplex_tree.
Definition: Simplex_tree.h:1106
void set_dimension(int dimension)
Set a dimension for the simplicial complex.
Definition: Simplex_tree.h:899
boost::iterator_range< Skeleton_simplex_iterator > Skeleton_simplex_range
Range over the simplices of the skeleton of the simplicial complex, for a given dimension.
Definition: Simplex_tree.h:212
void print_hasse(std::ostream &os)
Write the hasse diagram of the simplicial complex in os.
Definition: Simplex_tree.h:1368
~Simplex_tree()
Destructor; deallocates the whole tree structure.
Definition: Simplex_tree.h:359
static Simplex_handle null_simplex()
Returns a Simplex_handle different from all Simplex_handles associated to the simplices in the simpli...
Definition: Simplex_tree.h:556
Complex_simplex_range complex_simplex_range()
Returns a range over the simplices of the simplicial complex.
Definition: Simplex_tree.h:237
Complex_vertex_range complex_vertex_range()
Returns a range over the vertices of the simplicial complex. The order is increasing according to < o...
Definition: Simplex_tree.h:226
Graph simplicial complex methods.
This file includes common file reader for GUDHI.
bool read_simplex(std::istream &in_, std::vector< Vertex_handle > &simplex, Filtration_value &fil)
Read a face from a file.
Definition: reader_utils.h:158
Value type for a filtration function on a cell complex.
Definition: FiltrationValue.h:20
Node of a simplex tree with filtration value and simplex key.
Definition: Simplex_tree_node_explicit_storage.h:29
Definition: Simplex_tree.h:1797
Definition: Simplex_tree.h:1781
Tag for a linear ordering of simplices.
Definition: indexing_tag.h:20
Concept describing an indexing scheme (see FilteredComplex) for applying continuous maps to a cell co...
Definition: IndexingTag.h:18
Key type used as simplex identifier.
Definition: SimplexKey.h:15
Concept of the template parameter for the class Gudhi::Simplex_tree<SimplexTreeOptions>.
Definition: SimplexTreeOptions.h:15
Handle type for the vertices of a cell complex.
Definition: VertexHandle.h:15