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