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>
31namespace cubical_complex {
34class is_before_in_filtration;
53 typedef std::size_t Simplex_key;
54 typedef typename T::filtration_type Filtration_value;
55 typedef Simplex_key Simplex_handle;
70 : T(perseus_style_file), key_associated_to_simplex(
num_simplices()) {
72 std::clog <<
"Bitmap_cubical_complex( const char* perseus_style_file )\n";
83 const std::vector<Filtration_value>& cells,
84 bool input_top_cells =
true)
85 : T(dimensions, cells, input_top_cells), key_associated_to_simplex(
num_simplices()) {
96 const std::vector<Filtration_value>& cells,
97 const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed,
98 bool input_top_cells =
true)
99 : T(dimensions, cells, directions_in_which_periodic_b_cond_are_to_be_imposed, input_top_cells),
122 std::clog <<
"Simplex_handle null_simplex()\n";
124 return std::numeric_limits<Simplex_handle>::max();
130 inline std::size_t
dimension()
const {
return this->sizes.size(); }
137 std::clog <<
"unsigned dimension(const Simplex_handle& sh)\n";
139 if (sh !=
null_simplex())
return this->get_dimension_of_a_cell(sh);
148 std::clog <<
"Filtration_value filtration(const Simplex_handle& sh)\n";
152 return std::numeric_limits<Filtration_value>::infinity();
160 std::clog <<
"Simplex_key null_key()\n";
162 return std::numeric_limits<Simplex_handle>::max();
168 Simplex_key
key(Simplex_handle sh)
const {
170 std::clog <<
"Simplex_key key(const Simplex_handle& sh)\n";
172 GUDHI_CHECK(sh !=
null_simplex(), std::invalid_argument(
"key(null_simplex()) is not supported"));
173 return this->key_associated_to_simplex[sh];
183 std::clog <<
"Simplex_handle simplex(Simplex_key key)\n";
185 GUDHI_CHECK (k !=
null_key(), std::invalid_argument(
"simplex(null_key()) is not supported"));
186 GUDHI_CHECK (!sorted_cells.empty(), std::logic_error(
"initialize_filtration() or filtration_simplex_range() must be called before simplex()"));
187 return this->sorted_cells[k];
195 std::clog <<
"void assign_key(Simplex_handle& sh, Simplex_key key)\n";
197 GUDHI_CHECK(sh !=
null_simplex(), std::invalid_argument(
"assign_key(null_simplex()) is not supported"));
198 this->key_associated_to_simplex[sh] =
key;
215 typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
242 std::clog <<
"Filtration_simplex_range filtration_simplex_range()\n";
262 std::pair<Simplex_handle, Simplex_handle>
endpoints(Simplex_handle e) {
263 std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(e);
265 std::clog <<
"std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle e )\n";
266 std::clog <<
"bdry.size() : " << bdry.size() <<
"\n";
268 if (bdry.size() != 2)
270 "Error in endpoints in Bitmap_cubical_complex class. The cell is not an edge.");
271 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;
Class needed for compatibility with Gudhi. Not useful for other purposes.
Definition: Bitmap_cubical_complex.h:353
Cubical complex represented as a bitmap.
Definition: Bitmap_cubical_complex.h:48
Filtration_simplex_range const & filtration_simplex_range()
Definition: Bitmap_cubical_complex.h:240
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:95
std::pair< Simplex_handle, Simplex_handle > endpoints(Simplex_handle e)
Definition: Bitmap_cubical_complex.h:262
Simplex_handle simplex(Simplex_key k)
Definition: Bitmap_cubical_complex.h:181
Bitmap_cubical_complex(const char *perseus_style_file)
Definition: Bitmap_cubical_complex.h:69
Simplex_key key(Simplex_handle sh) const
Definition: Bitmap_cubical_complex.h:168
std::size_t dimension() const
Definition: Bitmap_cubical_complex.h:130
std::vector< Simplex_handle >::iterator Boundary_simplex_iterator
Definition: Bitmap_cubical_complex.h:214
std::vector< Simplex_handle > Filtration_simplex_range
Definition: Bitmap_cubical_complex.h:223
Filtration_value filtration(Simplex_handle sh)
Definition: Bitmap_cubical_complex.h:146
Boundary_simplex_range boundary_simplex_range(Simplex_handle sh)
Definition: Bitmap_cubical_complex.h:232
void assign_key(Simplex_handle sh, Simplex_key key)
Definition: Bitmap_cubical_complex.h:193
static Simplex_key null_key()
Definition: Bitmap_cubical_complex.h:158
unsigned dimension(Simplex_handle sh) const
Definition: Bitmap_cubical_complex.h:135
Bitmap_cubical_complex(const std::vector< unsigned > &dimensions, const std::vector< Filtration_value > &cells, bool input_top_cells=true)
Definition: Bitmap_cubical_complex.h:82
std::size_t num_simplices() const
Definition: Bitmap_cubical_complex.h:115
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:120
virtual ~Bitmap_cubical_complex()
Definition: Bitmap_cubical_complex.h:106
Value type for a filtration function on a cell complex.
Definition: FiltrationValue.h:20