1use miette::Result;
2
3pub trait Algorithm {
4 fn run(&mut self) -> Result<()>;
5 fn has_finished(&self) -> bool;
6}
7
8#[derive(Debug, Clone, PartialEq)]
9pub struct GraphEvent {
10 pub(crate) kind: GraphEventType,
11 pub(crate) u: u64,
12 pub(crate) v: u64,
13 pub(crate) ew: f64,
14}
15
16impl GraphEvent {
17 pub fn new(kind: GraphEventType, u: u64, v: u64, ew: Option<f64>) -> Self {
18 Self {
19 kind,
20 u,
21 v,
22 ew: ew.unwrap_or(1.),
23 }
24 }
25}
26
27#[derive(Debug, Copy, Clone, PartialEq, Eq)]
28#[repr(u8)]
29pub enum GraphEventType {
30 NodeAddition = 0,
31 NodeRemoval = 1,
32 NodeRestoration = 2,
33 EdgeAddition = 3,
34 EdgeRemoval = 4,
35 EdgeWeightUpdate = 5,
36 EdgeWeightIncrement = 6,
37 TimeStep = 7,
38}
39
40impl From<u8> for GraphEventType {
41 fn from(value: u8) -> Self {
42 match value {
43 0 => Self::NodeAddition,
44 1 => Self::NodeRemoval,
45 2 => Self::NodeRestoration,
46 3 => Self::EdgeAddition,
47 4 => Self::EdgeRemoval,
48 5 => Self::EdgeWeightUpdate,
49 6 => Self::EdgeWeightIncrement,
50 7 => Self::TimeStep,
51 _ => panic!(),
52 }
53 }
54}
55
56pub trait DynAlgorithm {
57 fn update(&mut self, e: GraphEvent);
58 fn update_batch(&mut self, es: &[GraphEvent]);
59}
60
61#[derive(Debug, Copy, Clone, PartialEq, Eq)]
62#[repr(u8)]
63pub enum EdgeDirection {
64 InEdges = 0,
65 OutEdges = 1,
66}