pub(crate) mod bi_hash_map;
#[doc(hidden)]
pub mod errors;
#[doc(hidden)]
pub mod hyperedges;
mod indexes;
#[doc(hidden)]
pub mod iterator;
mod shared;
#[doc(hidden)]
mod types;
mod utils;
#[doc(hidden)]
pub mod vertices;
use std::{
fmt::{Debug, Display, Formatter, Result},
hash::Hash,
ops::Deref,
};
use bi_hash_map::BiHashMap;
use types::{AIndexMap, AIndexSet, ARandomState};
pub use crate::core::indexes::{HyperedgeIndex, VertexIndex};
pub trait VertexTrait: Copy + Debug + Display + Eq + Hash + Send + Sync {}
impl<T> VertexTrait for T where T: Copy + Debug + Display + Eq + Hash + Send + Sync {}
pub trait HyperedgeTrait: VertexTrait + Into<usize> {}
impl<T> HyperedgeTrait for T where T: VertexTrait + Into<usize> {}
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub(crate) struct HyperedgeKey<HE> {
vertices: Vec<usize>,
weight: HE,
}
impl<HE> HyperedgeKey<HE> {
pub(crate) fn new(vertices: Vec<usize>, weight: HE) -> HyperedgeKey<HE> {
Self { vertices, weight }
}
}
impl<HE> Deref for HyperedgeKey<HE> {
type Target = HE;
fn deref(&self) -> &HE {
&self.weight
}
}
pub struct Hypergraph<V, HE> {
vertices: AIndexMap<V, AIndexSet<usize>>,
hyperedges: AIndexSet<HyperedgeKey<HE>>,
hyperedges_mapping: BiHashMap<HyperedgeIndex>,
vertices_mapping: BiHashMap<VertexIndex>,
hyperedges_count: usize,
vertices_count: usize,
}
impl<V, HE> Debug for Hypergraph<V, HE>
where
V: Eq + Hash + Debug,
HE: Debug,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("Hypergraph")
.field("vertices", &self.vertices)
.field("hyperedges", &self.hyperedges)
.finish_non_exhaustive()
}
}
impl<V, HE> Default for Hypergraph<V, HE>
where
V: VertexTrait,
HE: HyperedgeTrait,
{
fn default() -> Self {
Hypergraph::new()
}
}
impl<V, HE> Hypergraph<V, HE>
where
V: VertexTrait,
HE: HyperedgeTrait,
{
pub fn clear(&mut self) {
self.hyperedges.clear();
self.vertices.clear();
self.hyperedges_mapping = BiHashMap::default();
self.vertices_mapping = BiHashMap::default();
self.hyperedges_count = 0;
self.vertices_count = 0;
}
pub fn new() -> Self {
Hypergraph::with_capacity(0, 0)
}
pub fn with_capacity(vertices: usize, hyperedges: usize) -> Self {
Hypergraph {
hyperedges_count: 0,
hyperedges_mapping: BiHashMap::default(),
hyperedges: AIndexSet::with_capacity_and_hasher(hyperedges, ARandomState::default()),
vertices_count: 0,
vertices_mapping: BiHashMap::default(),
vertices: AIndexMap::with_capacity_and_hasher(vertices, ARandomState::default()),
}
}
}