57 using Simplex_cell_map = std::map<Simplex_handle, Hasse_cell*, Simplex_comparator<Simplex_handle> >;
75 Simplex_cell_maps& simplex_cell_maps = (is_boundary ? boundary_simplex_cell_maps_ : interior_simplex_cell_maps_);
77 CC_detail_list& cc_detail_list =
78 (is_boundary ? cc_boundary_detail_lists[cell_d] : cc_interior_detail_lists[cell_d]);
79 cc_detail_list.emplace_back(simplex);
82 auto map_it = simplex_cell_map.find(simplex);
83 if (map_it == simplex_cell_map.end()) {
84 hasse_cells_.push_back(
new Hasse_cell(is_boundary, cell_d));
86 simplex_cell_map.emplace(simplex, new_cell);
87 cell_simplex_map_.emplace(new_cell, simplex);
89 cc_detail_list.back().status_ = CC_detail_info::Result_type::inserted;
94 CC_detail_info& cc_info = cc_detail_list.back();
95 cc_info.trigger_ = to_string(map_it->first);
96 cc_info.status_ = CC_detail_info::Result_type::self;
98 return map_it->second;
101 void expand_level(std::size_t cell_d) {
102 bool is_manifold_with_boundary = boundary_simplex_cell_maps_.size() > 0;
103 for (
auto& sc_pair : interior_simplex_cell_maps_[cell_d - 1]) {
104 const Simplex_handle& simplex = sc_pair.first;
106 for (Simplex_handle coface : simplex.coface_range(cod_d_ + cell_d)) {
107 Hasse_cell* new_cell = insert_cell(coface, cell_d,
false);
108 new_cell->get_boundary().emplace_back(cell, 1);
112 if (is_manifold_with_boundary) {
113 for (
auto& sc_pair : boundary_simplex_cell_maps_[cell_d - 1]) {
114 const Simplex_handle& simplex = sc_pair.first;
116 if (cell_d != intr_d_)
117 for (Simplex_handle coface : simplex.coface_range(cod_d_ + cell_d + 1)) {
118 Hasse_cell* new_cell = insert_cell(coface, cell_d,
true);
119 new_cell->get_boundary().emplace_back(cell, 1);
121 auto map_it = interior_simplex_cell_maps_[cell_d].find(simplex);
122 if (map_it == interior_simplex_cell_maps_[cell_d].end())
123 std::cerr <<
"Cell_complex::expand_level error: A boundary cell does not have an interior counterpart.\n";
126 i_cell->get_boundary().emplace_back(cell, 1);
132 void construct_complex_(
const Out_simplex_map_& out_simplex_map) {
134 cc_interior_summary_lists.resize(interior_simplex_cell_maps_.size());
135 cc_interior_prejoin_lists.resize(interior_simplex_cell_maps_.size());
136 cc_interior_detail_lists.resize(interior_simplex_cell_maps_.size());
138 for (
auto& os_pair : out_simplex_map) {
140 const Eigen::VectorXd& point = os_pair.second;
141 Hasse_cell* new_cell = insert_cell(simplex, 0,
false);
142 cell_point_map_.emplace(new_cell, point);
144 for (std::size_t cell_d = 1;
145 cell_d < interior_simplex_cell_maps_.size() && !interior_simplex_cell_maps_[cell_d - 1].empty(); ++cell_d) {
146 expand_level(cell_d);
150 void construct_complex_(
const Out_simplex_map_& interior_simplex_map,
const Out_simplex_map_& boundary_simplex_map) {
152 cc_interior_summary_lists.resize(interior_simplex_cell_maps_.size());
153 cc_interior_prejoin_lists.resize(interior_simplex_cell_maps_.size());
154 cc_interior_detail_lists.resize(interior_simplex_cell_maps_.size());
155 cc_boundary_summary_lists.resize(boundary_simplex_cell_maps_.size());
156 cc_boundary_prejoin_lists.resize(boundary_simplex_cell_maps_.size());
157 cc_boundary_detail_lists.resize(boundary_simplex_cell_maps_.size());
159 for (
auto& os_pair : boundary_simplex_map) {
161 const Eigen::VectorXd& point = os_pair.second;
162 Hasse_cell* new_cell = insert_cell(simplex, 0,
true);
163 cell_point_map_.emplace(new_cell, point);
165 for (
auto& os_pair : interior_simplex_map) {
167 const Eigen::VectorXd& point = os_pair.second;
168 Hasse_cell* new_cell = insert_cell(simplex, 0,
false);
169 cell_point_map_.emplace(new_cell, point);
172 for (
const auto& sc_pair : interior_simplex_cell_maps_[0])
173 cc_interior_summary_lists[0].push_back(CC_summary_info(sc_pair));
174 for (
const auto& sc_pair : boundary_simplex_cell_maps_[0])
175 cc_boundary_summary_lists[0].push_back(CC_summary_info(sc_pair));
178 for (std::size_t cell_d = 1;
179 cell_d < interior_simplex_cell_maps_.size() && !interior_simplex_cell_maps_[cell_d - 1].empty(); ++cell_d) {
180 expand_level(cell_d);
183 for (
const auto& sc_pair : interior_simplex_cell_maps_[cell_d])
184 cc_interior_summary_lists[cell_d].push_back(CC_summary_info(sc_pair));
185 if (cell_d < boundary_simplex_cell_maps_.size())
186 for (
const auto& sc_pair : boundary_simplex_cell_maps_[cell_d])
187 cc_boundary_summary_lists[cell_d].push_back(CC_summary_info(sc_pair));
203 interior_simplex_cell_maps_.resize(intr_d_ + 1);
204 if (!out_simplex_map.empty()) cod_d_ = out_simplex_map.begin()->first.dimension();
205 construct_complex_(out_simplex_map);
220 interior_simplex_cell_maps_.resize(limit_dimension + 1);
221 if (!out_simplex_map.empty()) cod_d_ = out_simplex_map.begin()->first.dimension();
222 construct_complex_(out_simplex_map);
237 void construct_complex(
const Out_simplex_map_& interior_simplex_map,
const Out_simplex_map_& boundary_simplex_map) {
238 interior_simplex_cell_maps_.resize(intr_d_ + 1);
239 boundary_simplex_cell_maps_.resize(intr_d_);
240 if (!interior_simplex_map.empty()) cod_d_ = interior_simplex_map.begin()->first.dimension();
241 construct_complex_(interior_simplex_map, boundary_simplex_map);
258 void construct_complex(
const Out_simplex_map_& interior_simplex_map,
const Out_simplex_map_& boundary_simplex_map,
259 std::size_t limit_dimension) {
260 interior_simplex_cell_maps_.resize(limit_dimension + 1);
261 boundary_simplex_cell_maps_.resize(limit_dimension);
262 if (!interior_simplex_map.empty()) cod_d_ = interior_simplex_map.begin()->first.dimension();
263 construct_complex_(interior_simplex_map, boundary_simplex_map);
293 return interior_simplex_cell_maps_[cell_d];
304 return boundary_simplex_cell_maps_[cell_d];
328 for (
Hasse_cell* hs_ptr : hasse_cells_)
delete hs_ptr;
332 std::size_t intr_d_, cod_d_;
336 std::vector<Hasse_cell*> hasse_cells_;