Skip to main content

linnet/half_edge/nodestore/
vec.rs

1use std::collections::HashSet;
2
3use crate::{
4    half_edge::{
5        builder::HedgeNodeBuilder,
6        involution::{EdgeIndex, Hedge, HedgeVec, Involution},
7        subgraph::{
8            subset::SubSet, BaseSubgraph, HedgeNode, Inclusion, InternalSubGraph, ModifySubSet,
9            SuBitGraph, SubSetIter, SubSetLike, SubSetOps,
10        },
11        swap::Swap,
12        HedgeGraph, HedgeGraphError, NodeIndex, NodeVec,
13    },
14    tree::{
15        parent_pointer::{PPNode, ParentPointerStore},
16        Forest, RootData, RootId,
17    },
18};
19
20use super::{NodeStorage, NodeStorageOps};
21
22#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
25/// An implementation of [`NodeStorage`] and [`NodeStorageOps`] that uses `Vec`s
26/// and `BitVec`s to store node information and their incident half-edges.
27///
28/// This strategy is often straightforward but can have performance implications
29/// for certain operations like node deletion or identification if it involves
30/// frequent re-indexing or large data movements.
31///
32/// # Type Parameters
33///
34/// - `N`: The type of custom data associated with each node.
35///
36/// # Fields
37///
38/// - `node_data`: A `Vec<N>` storing the custom data for each node. The index
39///   in this vector corresponds to a `NodeIndex`.
40/// - `hedge_data`: A `Vec<NodeIndex>` where the index of the vector is a `Hedge`'s
41///   underlying `usize` value, and the element at that index is the `NodeIndex`
42///   to which the hedge is incident.
43/// - `nodes`: A `Vec<BitVec>`. Each index in the outer `Vec` corresponds to a
44///   `NodeIndex`. The `BitVec` at that index is a bitmask representing the set
45///   of half-edges incident to that node.
46pub struct NodeStorageVec<N> {
47    /// Stores the custom data for each node. Indexed by `NodeIndex.0`.
48    pub(crate) node_data: NodeVec<N>,
49    /// Maps each half-edge index (`Hedge.0`) to the `NodeIndex` it belongs to.
50    pub(crate) hedge_data: HedgeVec<NodeIndex>,
51    /// For each node (indexed by `NodeIndex.0`), stores a `BitVec` representing
52    /// the set of half-edges incident to it.
53    pub(crate) nodes: NodeVec<SuBitGraph>, // Nodes
54}
55
56#[derive(Clone, Debug)]
57/// An iterator that yields the [`Hedge`] identifiers incident to a node,
58/// based on iterating over the set bits in a `BitVec`.
59///
60/// This is typically used by [`NodeStorageVec`] to provide an iterator
61/// for its `NeighborsIter` associated type.
62pub struct BitVecNeighborIter<'a> {
63    /// The underlying iterator over set bits in the `BitVec`.
64    iter_ones: SubSetIter<'a>,
65    /// The total number of possible hedges (size of the `BitVec`), used for `ExactSizeIterator`.
66    len: Hedge,
67}
68
69impl<'a> From<&'a SuBitGraph> for BitVecNeighborIter<'a> {
70    fn from(value: &'a SuBitGraph) -> Self {
71        Self {
72            iter_ones: value.included_iter(),
73            len: Hedge(value.size()),
74        }
75    }
76}
77
78impl<'a> From<BitVecNeighborIter<'a>> for SuBitGraph {
79    fn from(value: BitVecNeighborIter<'a>) -> Self {
80        let len = value.len;
81        SuBitGraph::from_hedge_iter(value, len.0)
82    }
83}
84
85impl<'a> From<BitVecNeighborIter<'a>> for HedgeNode {
86    fn from(value: BitVecNeighborIter<'a>) -> Self {
87        HedgeNode {
88            internal_graph: InternalSubGraph::empty(value.len.0),
89            hairs: value.into(),
90        }
91    }
92}
93
94impl Iterator for BitVecNeighborIter<'_> {
95    type Item = Hedge;
96    fn next(&mut self) -> Option<Self::Item> {
97        self.iter_ones.next()
98    }
99}
100
101impl ExactSizeIterator for BitVecNeighborIter<'_> {
102    fn len(&self) -> usize {
103        self.iter_ones.len()
104    }
105}
106
107impl<N> NodeStorage for NodeStorageVec<N> {
108    type NodeData = N;
109    type Neighbors = SuBitGraph;
110    type NeighborsIter<'a>
111        = BitVecNeighborIter<'a>
112    where
113        Self: 'a;
114    type Storage<M> = NodeStorageVec<M>;
115}
116
117impl<N> NodeStorageVec<N> {
118    // fn swap_nodes(&mut self, a: NodeIndex, b: NodeIndex) {
119    //     if a != b {
120    //         for i in self.nodes[a].included_iter() {
121    //             self.hedge_data[i] = b;
122    //         }
123    //         for i in self.nodes[b].included_iter() {
124    //             self.hedge_data[i] = a;
125    //         }
126    //         self.node_data.swap(a, b);
127    //         self.nodes.swap(a, b);
128    //     }
129    // }
130
131    fn from_hairs_and_data(
132        node_data: impl Into<NodeVec<N>>,
133        nodes: impl Into<NodeVec<SuBitGraph>>,
134    ) -> Option<Self> {
135        let nodes = nodes.into();
136        let node_data = node_data.into();
137        let n_hedges = nodes[NodeIndex(0)].size();
138        let mut hedge_data: HedgeVec<_> = vec![None; n_hedges].into();
139
140        for (i, n) in nodes.iter() {
141            // println!("{:?}", n);
142            for h in n.included_iter() {
143                hedge_data[h] = Some(i);
144            }
145        }
146        Some(Self {
147            node_data,
148            hedge_data: hedge_data
149                .into_iter()
150                .map(|(_, i)| i)
151                .collect::<Option<HedgeVec<_>>>()?,
152            nodes,
153        })
154    }
155}
156
157impl<N> Swap<Hedge> for NodeStorageVec<N> {
158    fn is_zero_length(&self) -> bool {
159        self.hedge_data.is_zero_length()
160    }
161    fn len(&self) -> Hedge {
162        self.hedge_data.len()
163    }
164
165    fn swap(&mut self, a: Hedge, b: Hedge) {
166        if a != b {
167            let node_a = self.hedge_data[a];
168            let node_b = self.hedge_data[b];
169
170            self.hedge_data.swap(a, b);
171            self.hedge_data[a] = node_b;
172            self.hedge_data[b] = node_a;
173
174            self.nodes[node_a].swap(a, b);
175            self.nodes[node_b].swap(a, b);
176        }
177    }
178}
179
180impl<N> Swap<NodeIndex> for NodeStorageVec<N> {
181    fn is_zero_length(&self) -> bool {
182        self.nodes.is_zero_length()
183    }
184
185    fn len(&self) -> NodeIndex {
186        self.nodes.len()
187    }
188
189    fn swap(&mut self, a: NodeIndex, b: NodeIndex) {
190        if a != b {
191            for i in self.nodes[a].included_iter() {
192                self.hedge_data[i] = b;
193            }
194            for i in self.nodes[b].included_iter() {
195                self.hedge_data[i] = a;
196            }
197            self.node_data.swap(a, b);
198            self.nodes.swap(a, b);
199        }
200    }
201}
202
203impl<N> NodeStorageOps for NodeStorageVec<N> {
204    type OpStorage<A> = Self::Storage<A>;
205    type Base = SuBitGraph;
206
207    fn check_nodes(&self) -> Result<(), HedgeGraphError> {
208        for (h, n) in &self.hedge_data {
209            if !self.nodes[*n].includes(&h) {
210                Err(HedgeGraphError::NodeDoesNotContainHedge(*n, h))?;
211            }
212        }
213
214        let self_n_h: Hedge = self.len();
215        let mut cover = Self::Base::empty(self_n_h.0);
216        for (i, node) in self.nodes.iter() {
217            for h in node.included_iter() {
218                if cover.includes(&h) {
219                    return Err(HedgeGraphError::NodesDoNotPartition(format!(
220                        "They overlap for node {i}: Cover:{cover:?}, crown: {h:?}"
221                    )));
222                } else {
223                    cover.add(h);
224                }
225            }
226        }
227
228        let full = !Self::Base::empty(self_n_h.0);
229
230        if !(cover.sym_diff(&full).is_empty()) {
231            return Err(HedgeGraphError::NodesDoNotPartition(format!(
232                "They do not cover the whole graph: cover {cover:?}"
233            )));
234        }
235
236        Ok(())
237    }
238
239    fn delete<S: SubSetLike<Base = Self::Base>>(&mut self, subgraph: &S) {
240        // println!("Deleting subgraph");
241        let mut left = Hedge(0);
242        let mut extracted = self.len();
243        while left < extracted {
244            if !subgraph.includes(&left) {
245                //left is in the right place
246                left.0 += 1;
247            } else {
248                //left needs to be swapped
249                extracted.0 -= 1;
250                if !subgraph.includes(&extracted) {
251                    //only with an extracted that is in the wrong spot
252                    self.swap(left, extracted);
253                    left.0 += 1;
254                }
255            }
256        }
257
258        // println!("left{}", left);
259
260        let mut left_nodes = NodeIndex(0);
261        let mut extracted_nodes = self.len();
262        while left_nodes < extracted_nodes {
263            if !self.nodes[left_nodes].has_greater(left) {
264                //left is in the right place
265                left_nodes.0 += 1;
266            } else {
267                //left needs to be swapped
268                extracted_nodes.0 -= 1;
269                if !self.nodes[extracted_nodes].has_greater(left) {
270                    //only with an extracted that is in the wrong spot
271                    self.swap(left_nodes, extracted_nodes);
272                    left_nodes.0 += 1;
273                }
274            }
275        }
276
277        let mut overlapping_nodes = left_nodes;
278        let mut non_overlapping_extracted = self.len();
279
280        while overlapping_nodes < non_overlapping_extracted {
281            if self.nodes[overlapping_nodes].intersects(&(..left)) {
282                //overlapping is in the right place, as it intersects (is after left_nodes) but isn't fully included
283                overlapping_nodes.0 += 1;
284            } else {
285                //overlapping needs to be swapped
286                non_overlapping_extracted.0 -= 1;
287                if self.nodes[non_overlapping_extracted].intersects(&(..left)) {
288                    //only with an extracted that is in the wrong spot
289                    self.swap(overlapping_nodes, non_overlapping_extracted);
290                    overlapping_nodes.0 += 1;
291                }
292            }
293        }
294
295        let _ = self.nodes.split_off(overlapping_nodes);
296        let _ = self.node_data.split_off(overlapping_nodes);
297        let _ = self.hedge_data.split_off(left);
298
299        for i in 0..(left_nodes.0) {
300            let _ = self.nodes[NodeIndex(i)].split_off(left);
301            // self.nodes[i].internal_graph.filter.split_off(left.0);
302
303            // split == 0;
304        }
305        for i in (left_nodes.0)..(overlapping_nodes.0) {
306            let _ = self.nodes[NodeIndex(i)].split_off(left);
307        }
308    }
309
310    fn extract_nodes(&mut self, nodes: impl IntoIterator<Item = NodeIndex>) -> (SuBitGraph, Self) {
311        let nodes: HashSet<NodeIndex> = nodes.into_iter().collect();
312        let left_nodes = <Self as Swap<NodeIndex>>::partition(self, |n| !nodes.contains(n));
313
314        let mut extracted = SuBitGraph::empty(self.hedge_data.len().0);
315
316        for i in left_nodes.0..self.node_data.len().0 {
317            extracted.union_with(&self.nodes[NodeIndex(i)]);
318        }
319
320        let left = <Self as Swap<Hedge>>::partition(self, |h| !extracted.includes(h));
321
322        let mut extracted_neighbors = self.nodes.split_off(left_nodes);
323        for (_, s) in &mut self.nodes {
324            s.split_off(left);
325        }
326
327        for (_, s) in &mut extracted_neighbors {
328            *s = s.split_off(left);
329        }
330
331        let extracted_data = self.node_data.split_off(left_nodes);
332        let extracted_hedges = self
333            .hedge_data
334            .split_off(left)
335            .into_iter()
336            .map(|(h, mut n)| {
337                n -= left_nodes;
338                // println!("Extracted hedge: {:?}{n:?}", h);
339                (h, n)
340            })
341            .collect();
342
343        (
344            extracted,
345            Self {
346                nodes: extracted_neighbors,
347                node_data: extracted_data,
348                hedge_data: extracted_hedges,
349            },
350        )
351    }
352
353    fn extract<S: SubSetLike<Base = SuBitGraph>, V2>(
354        &mut self,
355        subgraph: &S,
356        mut split_node: impl FnMut(&Self::NodeData) -> V2,
357        mut owned_node: impl FnMut(Self::NodeData) -> V2,
358    ) -> Self::OpStorage<V2> {
359        let mut left = Hedge(0);
360        let mut extracted = self.len();
361        // println!("HOI");
362        while left < extracted {
363            if !subgraph.includes(&left) {
364                //left is in the right place
365                left.0 += 1;
366            } else {
367                //left needs to be swapped
368                extracted.0 -= 1;
369                if !subgraph.includes(&extracted) {
370                    //only with an extracted that is in the wrong spot
371                    self.swap(left, extracted);
372                    left.0 += 1;
373                }
374            }
375        }
376
377        // println!("left{}", left);
378
379        let mut left_nodes = NodeIndex(0);
380        let mut extracted_nodes = self.len();
381        while left_nodes < extracted_nodes {
382            if !self.nodes[left_nodes].has_greater(left) {
383                //left is in the right place
384                left_nodes.0 += 1;
385            } else {
386                // println!(
387                //     "Needs swapping left {} extracted {}",
388                //     left_nodes.0, extracted_nodes.0
389                // );
390                //left needs to be swapped
391                extracted_nodes.0 -= 1;
392                // println!("{}", self.nodes[extracted_nodes].nhedges());
393                // println!("{:?}", self.nodes[extracted_nodes]);
394                if !self.nodes[extracted_nodes].has_greater(left) {
395                    //only with an extracted that is in the wrong spot
396                    self.swap(left_nodes, extracted_nodes);
397                    left_nodes.0 += 1;
398                }
399            }
400        }
401        // println!("left: {}", left_nodes.0);
402        // println!("extracted: {}", extracted_nodes.0);
403        let mut overlapping_nodes = left_nodes;
404        let mut non_overlapping_extracted = self.len();
405
406        while overlapping_nodes < non_overlapping_extracted {
407            if self.nodes[overlapping_nodes].intersects(&(..left)) {
408                //overlapping is in the right place, as it intersects (is after left_nodes) but isn't fully included
409                overlapping_nodes.0 += 1;
410            } else {
411                //overlapping needs to be swapped
412                non_overlapping_extracted.0 -= 1;
413                if self.nodes[non_overlapping_extracted].intersects(&(..left)) {
414                    //only with an extracted that is in the wrong spot
415                    self.swap(overlapping_nodes, non_overlapping_extracted);
416                    overlapping_nodes.0 += 1;
417                }
418            }
419        }
420
421        // println!("overlapping_nodes: {}", overlapping_nodes.0);
422        // println!("non_overlapping_extracted: {}", non_overlapping_extracted.0);
423
424        let mut extracted_nodes = self.nodes.split_off(overlapping_nodes);
425        let mut extracted_data: NodeVec<_> = self
426            .node_data
427            .split_off(overlapping_nodes)
428            .into_iter()
429            .map(|(_nid, n)| owned_node(n))
430            .collect();
431
432        let _ = self.hedge_data.split_off(left);
433
434        let mut overlapping_node_hairs = NodeVec::new();
435        let mut overlapping_data = NodeVec::new();
436
437        for i in 0..(left_nodes.0) {
438            let _ = self.nodes[NodeIndex(i)].split_off(left);
439            // self.nodes[i].internal_graph.filter.split_off(left.0);
440
441            // split == 0;
442        }
443        for i in (left_nodes.0)..(overlapping_nodes.0) {
444            overlapping_data.push(split_node(&self.node_data[NodeIndex(i)]));
445            // println!("og {}", self.nodes[i].nhedges());
446
447            let overlapped = self.nodes[NodeIndex(i)].split_off(left);
448            // println!("overlapped {}", overlapped.nhedges());
449            overlapping_node_hairs.push(overlapped);
450        }
451
452        for (_, h) in &mut extracted_nodes {
453            // println!("Init nhedges {}", h.nhedges());
454            *h = h.split_off(left);
455
456            // println!("After nhedges {}", h.nhedges());
457        }
458
459        extracted_nodes.extend(overlapping_node_hairs);
460        extracted_data.extend(overlapping_data);
461
462        NodeStorageVec::from_hairs_and_data(extracted_data, extracted_nodes)
463            .expect("Extracted nodes should cover extracted hedges")
464    }
465
466    // fn add_node(&mut self, node_data: Self::NodeData) -> NodeIndex {
467    //     let empty = HedgeNode::empty(self.hedge_len());
468    //     self.nodes.push(empty);
469    //     self.node_data.push(node_data);
470    //     NodeIndex(self.nodes.len() - 1)
471    // }
472
473    fn identify_nodes(
474        &mut self,
475        nodes: &[NodeIndex],
476        node_data_merge: Self::NodeData,
477    ) -> NodeIndex {
478        let n_nodes: NodeIndex = self.len();
479        let n_hedgs: Hedge = self.len();
480        let mut removed = SubSet::<NodeIndex>::empty(n_nodes.0);
481        let mut full_node = SuBitGraph::empty(n_hedgs.0);
482
483        for n in nodes {
484            removed.add(*n);
485            full_node.union_with(&self.nodes[*n]);
486        }
487
488        let replacement = removed.included_iter().next().unwrap();
489
490        for r in removed.included_iter().skip(1).rev() {
491            // let last_index = self.nodes.len() - 1;
492
493            // Before doing anything, update any hedge pointers that point to the node being removed.
494            for (_, hedge) in self.hedge_data.iter_mut() {
495                if *hedge == r {
496                    *hedge = replacement;
497                }
498            }
499
500            // if r != last_index {
501            //     // Swap the target with the last element in both vectors.
502            //     self.nodes.swap(r, last_index);
503            //     self.node_data.swap(r, last_index);
504
505            //     // After swapping, update any hedge pointer that pointed to the moved element.
506            //     // It used to be at last_index, now it is at r.
507            //     for hedge in self.hedge_data.iter_mut() {
508            //         if *hedge == NodeIndex(last_index) {
509            //             *hedge = NodeIndex(r);
510            //         }
511            //     }
512            // }
513            // // Remove the (now last) element.
514
515            // self.nodes.pop();
516            // self.node_data.pop();
517        }
518
519        self.nodes[replacement] = full_node;
520        self.node_data[replacement] = node_data_merge;
521
522        replacement
523    }
524
525    fn forget_identification_history(&mut self) -> NodeVec<Self::NodeData> {
526        let n_nodes: NodeIndex = self.len();
527        let mut to_keep: SubSet<NodeIndex> = SubSet::empty(n_nodes.0);
528
529        for (_, h) in &self.hedge_data {
530            to_keep.add(*h);
531        }
532
533        let notk = !to_keep.clone();
534        let n_hedges: Hedge = self.len();
535        for n in notk.included_iter() {
536            self.nodes[n] = SuBitGraph::empty(n_hedges.0);
537        }
538
539        let mut left_nodes = NodeIndex(0);
540        let mut extracted_nodes = n_nodes;
541        while left_nodes < extracted_nodes {
542            if to_keep[left_nodes] {
543                //left is in the right place
544                left_nodes.0 += 1;
545            } else {
546                //left needs to be swapped
547                extracted_nodes.0 -= 1;
548                if to_keep[extracted_nodes] {
549                    //only with an extracted that is in the wrong spot
550                    self.swap(left_nodes, extracted_nodes);
551                    // self.nodes.swap(left_nodes.0, extracted_nodes.0);
552                    left_nodes.0 += 1;
553                }
554            }
555        }
556
557        let _ = self.nodes.split_off(left_nodes);
558        self.node_data.split_off(left_nodes)
559    }
560
561    fn to_forest<U, H>(
562        &self,
563        map_data: impl Fn(&Self::NodeData) -> U,
564    ) -> Forest<U, ParentPointerStore<H>> {
565        let n_hedges: Hedge = self.len();
566        let mut nodes: Vec<_> = std::iter::repeat_with(|| None).take(n_hedges.0).collect();
567
568        let mut roots = vec![];
569
570        for ((_, set), (_, d)) in self.nodes.iter().zip(&self.node_data) {
571            let mut first = None;
572            for i in set.included_iter() {
573                if let Some(root) = first {
574                    nodes[i.0] = Some(PPNode::dataless_child(root))
575                } else {
576                    first = Some(i.into());
577                    nodes[i.0] = Some(PPNode::dataless_root(RootId(roots.len())));
578                }
579            }
580            roots.push(RootData {
581                root_id: first.unwrap(),
582                data: map_data(d),
583            });
584        }
585        Forest {
586            nodes: nodes
587                .into_iter()
588                .collect::<Option<Vec<_>>>()
589                .unwrap()
590                .into_iter()
591                .collect(),
592            roots,
593        }
594    }
595
596    fn iter(&self) -> impl Iterator<Item = (NodeIndex, &Self::NodeData)> {
597        self.node_data.iter()
598    }
599
600    fn drain(self) -> impl Iterator<Item = (NodeIndex, Self::NodeData)> {
601        self.node_data.into_iter()
602    }
603    fn build<I: IntoIterator<Item = HedgeNodeBuilder<N>>>(node_iter: I, n_hedges: usize) -> Self {
604        let mut nodes: NodeVec<SuBitGraph> = NodeVec::new();
605        let mut node_data = NodeVec::new();
606        let mut hedgedata: HedgeVec<_> = vec![None; n_hedges].into();
607
608        for (i, n) in node_iter.into_iter().enumerate() {
609            for h in &n.hedges {
610                hedgedata[*h] = Some(NodeIndex(i));
611            }
612            nodes.push(n.to_base(n_hedges));
613            node_data.push(n.data);
614        }
615
616        let hedge_data = hedgedata.into_iter().map(|(_, x)| x.unwrap()).collect();
617
618        NodeStorageVec {
619            node_data,
620            hedge_data,
621            nodes,
622        }
623    }
624
625    fn build_with_mapping<I: IntoIterator<Item = HedgeNodeBuilder<ND>>, ND>(
626        node_iter: I,
627        n_hedges: usize,
628        mut map_data: impl FnMut(ND) -> Self::NodeData,
629    ) -> Self {
630        let mut nodes: NodeVec<SuBitGraph> = NodeVec::new();
631        let mut node_data = NodeVec::new();
632        let mut hedgedata: HedgeVec<_> = vec![None; n_hedges].into();
633
634        for (i, n) in node_iter.into_iter().enumerate() {
635            for h in &n.hedges {
636                hedgedata[*h] = Some(NodeIndex(i));
637            }
638            nodes.push(n.to_base(n_hedges));
639            node_data.push(map_data(n.data));
640        }
641
642        let hedge_data = hedgedata.into_iter().map(|(_, x)| x.unwrap()).collect();
643
644        NodeStorageVec {
645            node_data,
646            hedge_data,
647            nodes,
648        }
649    }
650
651    fn iter_nodes(
652        &self,
653    ) -> impl Iterator<Item = (NodeIndex, Self::NeighborsIter<'_>, &Self::NodeData)> {
654        self.nodes
655            .iter()
656            .map(|(_, b)| b.into())
657            .zip(self.node_data.iter())
658            .map(|(node, (id, data))| (id, node, data))
659    }
660
661    fn iter_nodes_mut(
662        &mut self,
663    ) -> impl Iterator<Item = (NodeIndex, Self::NeighborsIter<'_>, &mut Self::NodeData)> {
664        self.nodes
665            .iter()
666            .map(|(_, b)| b.into())
667            .zip(self.node_data.iter_mut())
668            .map(|(node, (id, data))| (id, node, data))
669    }
670
671    fn node_id_ref(&self, hedge: Hedge) -> NodeIndex {
672        self.hedge_data[hedge]
673    }
674
675    // fn get_node(&self, node_id: NodeIndex) -> Self:: {
676    //     &self.nodes[node_id.0]
677    // }
678
679    fn get_neighbor_iterator(&self, node_id: NodeIndex) -> Self::NeighborsIter<'_> {
680        BitVecNeighborIter {
681            iter_ones: self.nodes[node_id].included_iter(),
682            len: self.len(),
683        }
684    }
685
686    fn get_node_data(&self, node_id: NodeIndex) -> &N {
687        &self.node_data[node_id]
688    }
689
690    fn get_node_data_mut(&mut self, node_id: NodeIndex) -> &mut Self::NodeData {
691        &mut self.node_data[node_id]
692    }
693
694    fn extend(self, other: Self) -> Self {
695        let self_n_h: Hedge = self.len();
696        let other_n_h: Hedge = other.len();
697        let self_empty_filter = SuBitGraph::empty(self_n_h.0);
698        let other_empty_filter = SuBitGraph::empty(other_n_h.0);
699        let mut node_data = self.node_data;
700        node_data.extend(other.node_data);
701
702        let nodes: NodeVec<_> = self
703            .nodes
704            .into_iter()
705            .map(|(_, k)| k.join(other_empty_filter.clone()))
706            .chain(other.nodes.into_iter().map(|(_, k)| {
707                let new_hairs = self_empty_filter.clone();
708                new_hairs.join(k.clone())
709            }))
710            .collect();
711
712        let mut hedge_data = self.hedge_data;
713        hedge_data.extend(other.hedge_data);
714
715        NodeStorageVec {
716            node_data,
717            hedge_data,
718            nodes,
719        }
720    }
721
722    fn extend_mut(&mut self, other: Self) {
723        let self_n_h: Hedge = self.len();
724        let other_n_h: Hedge = other.len();
725        let self_empty_filter = SuBitGraph::empty(self_n_h.0);
726        let other_empty_filter = SuBitGraph::empty(other_n_h.0);
727        let node_data = &mut self.node_data;
728        node_data.extend(other.node_data);
729
730        for (_, n) in self.nodes.iter_mut() {
731            n.join_mut(other_empty_filter.clone());
732        }
733
734        let nodes: NodeVec<_> = other
735            .nodes
736            .into_iter()
737            .map(|(_, k)| {
738                let new_hairs = self_empty_filter.clone();
739                new_hairs.join(k.clone())
740            })
741            .collect();
742
743        self.nodes.extend(nodes);
744
745        self.hedge_data.extend(other.hedge_data);
746    }
747    fn add_dangling_edge(self, source: NodeIndex) -> Result<Self, HedgeGraphError> {
748        if self.nodes.len() <= source {
749            return Err(HedgeGraphError::NoNode);
750        }
751        let nodes: NodeVec<_> = self
752            .nodes
753            .into_iter()
754            .map(|(i, mut k)| {
755                if i == source {
756                    k.push(true);
757                } else {
758                    k.push(false);
759                }
760                k
761            })
762            .collect();
763        let mut hedge_data = self.hedge_data;
764        hedge_data.push(source);
765
766        Ok(NodeStorageVec {
767            node_data: self.node_data,
768            hedge_data,
769            nodes,
770        })
771    }
772
773    fn random(sources: &[Self::Neighbors], sinks: &[Self::Neighbors]) -> Self
774    where
775        N: Default,
776    {
777        let mut nodes = NodeVec::new();
778        let mut node_data: NodeVec<N> = NodeVec::new();
779
780        let mut hedge_data: HedgeVec<_> = vec![NodeIndex(0); sources[0].n_included()].into();
781
782        for (nid, n) in sources.iter().enumerate() {
783            nodes.push(n.clone());
784            node_data.push(N::default());
785            for i in n.included_iter() {
786                hedge_data[i] = NodeIndex(nid);
787            }
788        }
789
790        let len = nodes.len();
791
792        for (nid, n) in sinks.iter().enumerate() {
793            nodes.push(n.clone());
794            node_data.push(N::default());
795
796            for i in n.included_iter() {
797                hedge_data[i] = NodeIndex(nid) + len;
798            }
799        }
800
801        NodeStorageVec {
802            node_data,
803            hedge_data,
804            nodes,
805        }
806    }
807
808    fn check_and_set_nodes(&mut self) -> Result<(), HedgeGraphError> {
809        let self_n_h: Hedge = self.len();
810        let mut cover = SuBitGraph::empty(self_n_h.0);
811        for (i, node) in self.nodes.iter() {
812            for h in node.included_iter() {
813                if cover.includes(&h) {
814                    return Err(HedgeGraphError::NodesDoNotPartition(format!(
815                        "They overlap. Cover:{cover:?}, crown: {h:?}"
816                    )));
817                } else {
818                    cover.add(h);
819                    self.hedge_data[h] = i;
820                }
821            }
822        }
823
824        let full = !SuBitGraph::empty(self_n_h.0);
825
826        if !(cover.sym_diff(&full).is_empty()) {
827            return Err(HedgeGraphError::NodesDoNotPartition(format!(
828                "They do not cover the whole graph: cover {cover:?}"
829            )));
830        }
831
832        Ok(())
833    }
834
835    fn map_data_ref_graph<'a, E, V2, H>(
836        &'a self,
837        graph: &'a HedgeGraph<E, Self::NodeData, H, Self>,
838        mut node_map: impl FnMut(
839            &'a HedgeGraph<E, Self::NodeData, H, Self>,
840            Self::NeighborsIter<'a>,
841            &'a Self::NodeData,
842        ) -> V2,
843    ) -> Self::OpStorage<V2> {
844        let node_data = self
845            .node_data
846            .iter()
847            .zip(self.nodes.iter())
848            .map(|((_, v), (_, h))| node_map(graph, h.into(), v))
849            .collect();
850
851        NodeStorageVec {
852            node_data,
853            hedge_data: self.hedge_data.clone(),
854            nodes: self.nodes.clone(),
855        }
856    }
857
858    // fn map_data_ref_graph<'a, E, V2>(
859    //     &'a self,
860    //     graph: &'a HedgeGraph<E, Self::NodeData, Self>,
861    //     mut node_map: impl FnMut(
862    //         &'a HedgeGraph<E, Self::NodeData, Self>,
863    //         &'a HedgeNode,
864    //         &'a Self::NodeData,
865    //     ) -> V2,
866    // ) -> Self::Storage<V2> {
867    //     let node_data = self
868    //         .node_data
869    //         .iter()
870    //         .zip(self.nodes.iter())
871    //         .map(|(v, h)| node_map(graph, h, v))
872    //         .collect();
873
874    //     NodeStorageVec {
875    //         node_data,
876    //         hedge_data: self.hedge_data.clone(),
877    //         nodes: self.nodes.clone(),
878    //     }
879    // }
880
881    // fn map_data_ref_mut_graph<'a, V2>(
882    //     &'a mut self,
883    //     mut node_map: impl FnMut(&'a HedgeNode, &'a mut Self::NodeData) -> V2,
884    // ) -> Self::Storage<V2> {
885    //     let node_data = self
886    //         .node_data
887    //         .iter_mut()
888    //         .zip(self.nodes.iter())
889    //         .map(|(v, h)| node_map(h, v))
890    //         .collect();
891
892    //     NodeStorageVec {
893    //         node_data,
894    //         hedge_data: self.hedge_data.clone(),
895    //         nodes: self.nodes.clone(),
896    //     }
897    // }
898    fn map_data_ref_mut_graph<'a, V2>(
899        &'a mut self,
900        mut node_map: impl FnMut(Self::NeighborsIter<'a>, &'a mut Self::NodeData) -> V2,
901    ) -> Self::OpStorage<V2> {
902        let node_data = self
903            .node_data
904            .iter_mut()
905            .zip(self.nodes.iter())
906            .map(|((_, v), (_, h))| node_map(h.into(), v))
907            .collect();
908
909        NodeStorageVec {
910            node_data,
911            hedge_data: self.hedge_data.clone(),
912            nodes: self.nodes.clone(),
913        }
914    }
915
916    fn map_data_ref_graph_result<'a, E, V2, H, Er>(
917        &'a self,
918        graph: &'a HedgeGraph<E, Self::NodeData, H, Self>,
919        mut node_map: impl FnMut(
920            &'a HedgeGraph<E, Self::NodeData, H, Self>,
921            Self::NeighborsIter<'a>,
922            &'a Self::NodeData,
923        ) -> Result<V2, Er>,
924    ) -> Result<Self::OpStorage<V2>, Er> {
925        let node_data: Result<NodeVec<_>, Er> = self
926            .node_data
927            .iter()
928            .zip(self.nodes.iter())
929            .map(|((_, v), (_, h))| node_map(graph, h.into(), v))
930            .collect();
931
932        Ok(NodeStorageVec {
933            node_data: node_data?,
934            hedge_data: self.hedge_data.clone(),
935            nodes: self.nodes.clone(),
936        })
937    }
938
939    fn map_data_graph<'a, V2>(
940        self,
941        involution: &'a Involution<EdgeIndex>,
942        mut f: impl FnMut(&'a Involution<EdgeIndex>, NodeIndex, Self::NodeData) -> V2,
943    ) -> Self::OpStorage<V2> {
944        let node_data = self
945            .node_data
946            .into_iter()
947            .map(|(i, v)| f(involution, i, v))
948            .collect();
949
950        NodeStorageVec {
951            node_data,
952            hedge_data: self.hedge_data,
953            nodes: self.nodes,
954        }
955    }
956
957    fn map_data_graph_result<'a, V2, Err>(
958        self,
959        involution: &'a Involution<EdgeIndex>,
960        mut f: impl FnMut(&'a Involution<EdgeIndex>, NodeIndex, Self::NodeData) -> Result<V2, Err>,
961    ) -> Result<Self::OpStorage<V2>, Err> {
962        let node_data = self
963            .node_data
964            .into_iter()
965            .map(|(i, v)| f(involution, i, v))
966            .collect::<Result<NodeVec<_>, Err>>()?;
967        Ok(NodeStorageVec {
968            node_data,
969            hedge_data: self.hedge_data,
970            nodes: self.nodes,
971        })
972    }
973
974    fn new_nodevec<'a, V2>(
975        &'a self,
976        mut node_map: impl FnMut(NodeIndex, Self::NeighborsIter<'a>, &'a Self::NodeData) -> V2,
977    ) -> NodeVec<V2> {
978        self.node_data
979            .iter()
980            .zip(self.nodes.iter())
981            .map(|((i, v), (_, h))| node_map(i, h.into(), v))
982            .collect()
983    }
984}