9 const Tuple& operating_tuple)
11 , ee_accessor(m.create_accessor<int64_t>(m.m_ee_handle))
12 , ev_accessor(m.create_accessor<int64_t>(m.m_ev_handle))
13 , ve_accessor(m.create_accessor<int64_t>(m.m_ve_handle))
16 m_operating_tuple = operating_tuple;
17 Tuple operating_tuple_switch_vertex = m_mesh.switch_vertex(operating_tuple);
19 m_operating_edge_id = m_mesh.id_edge(m_operating_tuple);
20 m_spine_vids[0] = m_mesh.id_vertex(m_operating_tuple);
21 m_spine_vids[1] = m_mesh.id_vertex(operating_tuple_switch_vertex);
24 if (!m_mesh.is_boundary_vertex(m_operating_tuple)) {
25 m_neighbor_eids[0] = m_mesh.id_edge(m_mesh.switch_edge(m_operating_tuple));
27 if (!m_mesh.is_boundary_vertex(operating_tuple_switch_vertex)) {
28 m_neighbor_eids[1] = m_mesh.id_edge(m_mesh.switch_edge(operating_tuple_switch_vertex));
32 if (m_neighbor_eids[0] == m_neighbor_eids[1] && m_neighbor_eids[0] == m_operating_edge_id) {
33 m_is_self_loop =
true;
81 simplex_ids_to_delete = get_split_simplices_to_delete(m_operating_tuple, m_mesh);
85 const auto& data = split_facet_data().add_facet(m_mesh, m_operating_tuple);
86 m_split_e = data.new_facet_indices;
88 if (m_mesh.is_free()) {
89 const std::vector<int64_t> new_vids =
91 assert(new_vids.size() == 2);
92 std::copy(new_vids.begin(), new_vids.end(), m_free_split_v.begin());
93 const int64_t v_new = new_vids[0];
97 const std::vector<int64_t> new_vids =
99 assert(new_vids.size() == 1);
100 const int64_t v_new = new_vids[0];
103 const int64_t local_vid = m_mesh.is_ccw(m_operating_tuple) ? 0 : 1;
106 if (m_mesh.is_free()) {
109 auto ee_new_0 = ee_accessor.vector_attribute(m_split_e[0]);
110 auto ee_new_1 = ee_accessor.vector_attribute(m_split_e[1]);
111 ee_new_0[local_vid ^ 1] = m_split_e[1];
112 ee_new_1[local_vid] = m_split_e[0];
113 if (m_is_self_loop) {
114 ee_new_0[local_vid] = m_split_e[1];
115 ee_new_1[local_vid ^ 1] = m_split_e[0];
117 ee_new_0[local_vid] = m_neighbor_eids[0];
118 ee_new_1[local_vid ^ 1] = m_neighbor_eids[1];
120 for (int64_t i = 0; i < 2; i++) {
121 if (m_neighbor_eids[i] != -1) {
122 auto ee_neighbor = ee_accessor.vector_attribute(m_neighbor_eids[i]);
123 auto ev_neighbor = ev_accessor.vector_attribute(m_neighbor_eids[i]);
124 for (int64_t j = 0; j < 2; j++) {
125 if (ee_neighbor[j] == m_operating_edge_id &&
126 ev_neighbor[j] == m_spine_vids[i]) {
127 ee_neighbor[j] = m_split_e[i];
139 auto ev_new_0 = ev_accessor.vector_attribute(m_split_e[0]);
140 auto ev_new_1 = ev_accessor.vector_attribute(m_split_e[1]);
141 ev_new_0[local_vid] = m_spine_vids[0];
142 if (m_mesh.is_free()) {
143 ev_new_0[local_vid ^ 1] = m_free_split_v[0];
144 ev_new_1[local_vid] = m_free_split_v[1];
146 ev_new_0[local_vid ^ 1] = m_split_v;
147 ev_new_1[local_vid] = m_split_v;
149 ev_new_1[local_vid ^ 1] = m_spine_vids[1];
155 if (m_mesh.is_free()) {
156 ve_accessor.scalar_attribute(m_free_split_v[0]) = m_split_e[0];
157 ve_accessor.scalar_attribute(m_free_split_v[1]) = m_split_e[1];
159 ve_accessor.scalar_attribute(m_split_v) = m_split_e[0];
163 ve_accessor.scalar_attribute(m_spine_vids[0]) = m_split_e[0];
164 ve_accessor.scalar_attribute(m_spine_vids[1]) = m_split_e[1];
169 auto ret_edge = m_mesh.edge_tuple_from_id(m_split_e[1]);
172 if (!m_mesh.is_free()) {
173 if (m_mesh.id_vertex(ret_edge) != m_split_v) {
174 ret_edge = m_mesh.switch_vertex(ret_edge);
176 assert(m_mesh.id_edge(ret_edge) == m_split_e[1]);
177 assert(m_mesh.id_vertex(ret_edge) == m_split_v);
178 assert(m_mesh.id_vertex(m_mesh.switch_vertex(ret_edge)) == m_spine_vids[1]);
196 if (m_mesh.is_free()) {
197 simplex_ids_to_delete = get_collapse_simplices_to_delete(m_operating_tuple, m_mesh);
203 if (m_is_self_loop || (m_mesh.is_boundary_vertex(m_operating_tuple) &&
204 m_mesh.is_boundary_vertex(m_mesh.switch_vertex(m_operating_tuple)))) {
208 simplex_ids_to_delete = get_collapse_simplices_to_delete(m_operating_tuple, m_mesh);
213 for (int64_t i = 0; i < 2; i++) {
214 if (m_neighbor_eids[i] != -1) {
215 auto ee_neighbor = ee_accessor.vector_attribute(m_neighbor_eids[i]);
216 for (int64_t j = 0; j < 2; j++) {
217 if (ee_neighbor[j] == m_operating_edge_id) {
218 ee_neighbor[j] = m_neighbor_eids[i ^ 1];
228 if (m_neighbor_eids[0] != -1) {
229 auto ev_neighbor = ev_accessor.vector_attribute(m_neighbor_eids[0]);
230 for (int64_t j = 0; j < 2; j++) {
231 if (ev_neighbor[j] == m_spine_vids[0]) {
232 ev_neighbor[j] = m_spine_vids[1];
241 ve_accessor.scalar_attribute(m_spine_vids[1]) =
242 (m_neighbor_eids[1] != -1) ? m_neighbor_eids[1] : m_neighbor_eids[0];
247 const int64_t ret_eid = m_neighbor_eids[0] == -1 ? m_neighbor_eids[1] : m_neighbor_eids[0];
248 Tuple ret_tuple = m_mesh.edge_tuple_from_id(ret_eid);
250 if (m_mesh.id_vertex(ret_tuple) != m_spine_vids[1]) {
251 ret_tuple = m_mesh.switch_vertex(ret_tuple);