1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use crate::{
errors::HypergraphError, HyperedgeIndex, HyperedgeKey, HyperedgeTrait, Hypergraph, VertexIndex,
VertexTrait,
};
impl<V, HE> Hypergraph<V, HE>
where
V: VertexTrait,
HE: HyperedgeTrait,
{
pub fn add_hyperedge(
&mut self,
vertices: Vec<VertexIndex>,
weight: HE,
) -> Result<HyperedgeIndex, HypergraphError<V, HE>> {
if vertices.is_empty() {
return Err(HypergraphError::HyperedgeCreationNoVertices(weight));
}
let internal_vertices = self.get_internal_vertices(vertices)?;
if self.hyperedges.iter().any(
|HyperedgeKey {
weight: current_weight,
..
}| { *current_weight == weight },
) {
return Err(HypergraphError::HyperedgeWeightAlreadyAssigned(weight));
}
let (internal_index, _) = self
.hyperedges
.insert_full(HyperedgeKey::new(internal_vertices.clone(), weight));
for vertex in internal_vertices.into_iter() {
let (_, index_set) = self
.vertices
.get_index_mut(vertex)
.ok_or(HypergraphError::InternalVertexIndexNotFound(vertex))?;
index_set.insert(internal_index);
}
Ok(self.add_hyperedge_index(internal_index))
}
}