11#ifndef BITMAP_CUBICAL_COMPLEX_H_
12#define BITMAP_CUBICAL_COMPLEX_H_
14#include <gudhi/Debug_utils.h>
15#include <gudhi/Bitmap_cubical_complex_base.h>
16#include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
19#include <tbb/parallel_sort.h>
32namespace cubical_complex {
35class is_before_in_filtration;
54 typedef std::size_t Simplex_key;
55 typedef typename T::filtration_type Filtration_value;
56 typedef Simplex_key Simplex_handle;
71 : T(perseus_style_file), key_associated_to_simplex(
num_simplices()) {
73 std::clog <<
"Bitmap_cubical_complex( const char* perseus_style_file )\n";
84 const std::vector<Filtration_value>& cells,
85 bool input_top_cells =
true)
86 : T(dimensions, cells, input_top_cells), key_associated_to_simplex(
num_simplices()) {
97 const std::vector<Filtration_value>& cells,
98 const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed,
99 bool input_top_cells =
true)
100 : T(dimensions, cells, directions_in_which_periodic_b_cond_are_to_be_imposed, input_top_cells),
123 std::clog <<
"Simplex_handle null_simplex()\n";
125 return std::numeric_limits<Simplex_handle>::max();
131 inline std::size_t
dimension()
const {
return this->sizes.size(); }
138 std::clog <<
"unsigned dimension(const Simplex_handle& sh)\n";
140 GUDHI_CHECK(sh !=
null_simplex(), std::logic_error(
"Only real cells have a dimension"));
141 return this->get_dimension_of_a_cell(sh);
149 std::clog <<
"Filtration_value filtration(const Simplex_handle& sh)\n";
153 return std::numeric_limits<Filtration_value>::infinity();
161 std::clog <<
"Simplex_key null_key()\n";
163 return std::numeric_limits<Simplex_handle>::max();
169 Simplex_key
key(Simplex_handle sh)
const {
171 std::clog <<
"Simplex_key key(const Simplex_handle& sh)\n";
173 GUDHI_CHECK(sh !=
null_simplex(), std::invalid_argument(
"key(null_simplex()) is not supported"));
174 return this->key_associated_to_simplex[sh];
184 std::clog <<
"Simplex_handle simplex(Simplex_key key)\n";
186 GUDHI_CHECK (k !=
null_key(), std::invalid_argument(
"simplex(null_key()) is not supported"));
187 GUDHI_CHECK (!sorted_cells.empty(), std::logic_error(
"initialize_filtration() or filtration_simplex_range() must be called before simplex()"));
188 return this->sorted_cells[k];
196 std::clog <<
"void assign_key(Simplex_handle& sh, Simplex_key key)\n";
198 GUDHI_CHECK(sh !=
null_simplex(), std::invalid_argument(
"assign_key(null_simplex()) is not supported"));
199 this->key_associated_to_simplex[sh] =
key;
216 typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
245 std::clog <<
"Filtration_simplex_range filtration_simplex_range()\n";
265 std::pair<Simplex_handle, Simplex_handle>
endpoints(Simplex_handle e) {
266 std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(e);
268 std::clog <<
"std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle e )\n";
269 std::clog <<
"bdry.size() : " << bdry.size() <<
"\n";
271 if (bdry.size() != 2)
273 "Error in endpoints in Bitmap_cubical_complex class. The cell is not an edge.");
274 return std::make_pair(bdry[0], bdry[1]);
277 class Skeleton_simplex_range;
279 class Skeleton_simplex_iterator {
282 typedef std::input_iterator_tag iterator_category;
283 typedef Simplex_handle value_type;
284 typedef std::ptrdiff_t difference_type;
285 typedef value_type* pointer;
286 typedef value_type reference;
290 std::clog <<
"Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , std::size_t d )\n";
294 while ((this->position != b->data.size()) &&
295 (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
300 Skeleton_simplex_iterator() : b(NULL), position(0),
dimension(0) {}
302 Skeleton_simplex_iterator operator++() {
304 std::clog <<
"Skeleton_simplex_iterator operator++()\n";
308 while ((this->position != this->b->data.size()) &&
309 (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
315 Skeleton_simplex_iterator operator++(
int) {
316 Skeleton_simplex_iterator result = *
this;
321 bool operator==(
const Skeleton_simplex_iterator& rhs)
const {
323 std::clog <<
"bool operator ==\n";
325 return (this->position == rhs.position);
328 bool operator!=(
const Skeleton_simplex_iterator& rhs)
const {
330 std::clog <<
"bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
332 return !(*
this == rhs);
335 Simplex_handle operator*() {
337 std::clog <<
"Simplex_handle operator*() \n";
339 return this->position;
342 friend class Skeleton_simplex_range;
345 Bitmap_cubical_complex<T>* b;
346 std::size_t position;
357 typedef Skeleton_simplex_iterator const_iterator;
358 typedef Skeleton_simplex_iterator iterator;
362 Skeleton_simplex_iterator begin() {
364 std::clog <<
"Skeleton_simplex_iterator begin()\n";
366 return Skeleton_simplex_iterator(this->b, this->dimension);
369 Skeleton_simplex_iterator end() {
371 std::clog <<
"Skeleton_simplex_iterator end()\n";
373 Skeleton_simplex_iterator it(this->b, this->dimension);
374 it.position = this->b->data.size();
388 std::clog <<
"Skeleton_simplex_range skeleton_simplex_range( unsigned dimension )\n";
393 friend class is_before_in_filtration<T>;
396 std::vector<std::size_t> key_associated_to_simplex;
397 std::vector<std::size_t> sorted_cells;
403 std::clog <<
"void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
405 this->sorted_cells.resize(this->data.size());
406 std::iota(std::begin(sorted_cells), std::end(sorted_cells), 0);
408 tbb::parallel_sort(sorted_cells.begin(), sorted_cells.end(),
409 is_before_in_filtration<T>(
this));
411 std::sort(sorted_cells.begin(), sorted_cells.end(), is_before_in_filtration<T>(
this));
416class is_before_in_filtration {
420 bool operator()(
const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
421 const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2)
const {
430 std::size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
431 std::size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
441 Bitmap_cubical_complex<T>* CC_;
446namespace Cubical_complex = cubical_complex;
A range containing all the cells of dimension at most k.
Definition: Bitmap_cubical_complex.h:353
Cubical complex represented as a bitmap.
Definition: Bitmap_cubical_complex.h:49
Filtration_simplex_range const & filtration_simplex_range()
Definition: Bitmap_cubical_complex.h:243
Bitmap_cubical_complex(const std::vector< unsigned > &dimensions, const std::vector< Filtration_value > &cells, const std::vector< bool > &directions_in_which_periodic_b_cond_are_to_be_imposed, bool input_top_cells=true)
Definition: Bitmap_cubical_complex.h:96
std::pair< Simplex_handle, Simplex_handle > endpoints(Simplex_handle e)
Definition: Bitmap_cubical_complex.h:265
Simplex_handle simplex(Simplex_key k)
Definition: Bitmap_cubical_complex.h:182
Bitmap_cubical_complex(const char *perseus_style_file)
Definition: Bitmap_cubical_complex.h:70
Simplex_key key(Simplex_handle sh) const
Definition: Bitmap_cubical_complex.h:169
std::size_t dimension() const
Definition: Bitmap_cubical_complex.h:131
std::vector< Simplex_handle >::iterator Boundary_simplex_iterator
Definition: Bitmap_cubical_complex.h:215
std::vector< Simplex_handle > Filtration_simplex_range
Definition: Bitmap_cubical_complex.h:224
Filtration_value filtration(Simplex_handle sh)
Definition: Bitmap_cubical_complex.h:147
Boundary_simplex_range boundary_simplex_range(Simplex_handle sh)
Definition: Bitmap_cubical_complex.h:233
void assign_key(Simplex_handle sh, Simplex_key key)
Definition: Bitmap_cubical_complex.h:194
static Simplex_key null_key()
Definition: Bitmap_cubical_complex.h:159
unsigned dimension(Simplex_handle sh) const
Definition: Bitmap_cubical_complex.h:136
Bitmap_cubical_complex(const std::vector< unsigned > &dimensions, const std::vector< Filtration_value > &cells, bool input_top_cells=true)
Definition: Bitmap_cubical_complex.h:83
std::size_t num_simplices() const
Definition: Bitmap_cubical_complex.h:116
Skeleton_simplex_range skeleton_simplex_range(unsigned dimension)
Definition: Bitmap_cubical_complex.h:386
void initialize_filtration()
Definition: Bitmap_cubical_complex.h:401
static Simplex_handle null_simplex()
Definition: Bitmap_cubical_complex.h:121
virtual ~Bitmap_cubical_complex()
Definition: Bitmap_cubical_complex.h:107
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14
Value type for a filtration function on a cell complex.
Definition: FiltrationValue.h:20