networkit_rs/
flow.rs

1use cxx::UniquePtr;
2use miette::IntoDiagnostic;
3
4use crate::{
5    base::Algorithm,
6    bridge::{self, *},
7    tools::NodeIter,
8};
9
10pub struct EdmondsKarp {
11    inner: UniquePtr<bridge::EdmondsKarp>,
12}
13
14impl EdmondsKarp {
15    pub fn new(g: &crate::Graph, source: u64, sink: u64) -> Self {
16        Self {
17            inner: NewEdmondsKarp(g, source, sink),
18        }
19    }
20    pub fn get_max_flow(&self) -> f64 {
21        self.inner.getMaxFlow()
22    }
23
24    pub fn get_source_set(&self) -> NodeIter {
25        NodeIter {
26            at: 0,
27            nodes: EdmondsKarpGetSourceSet(&self.inner),
28        }
29    }
30    pub fn get_flow(&self, u: u64, v: u64) -> f64 {
31        self.inner.getFlow(u, v)
32    }
33    pub fn get_edge_flow(&self, e: u64) -> f64 {
34        self.inner.getEdgeFlow(e)
35    }
36    pub fn get_flow_vector(&self) -> Vec<f64> {
37        EdmondsKarpGetFlowVector(&self.inner)
38            .iter()
39            .cloned()
40            .collect()
41    }
42}
43
44impl Algorithm for EdmondsKarp {
45    fn run(&mut self) -> miette::Result<()> {
46        self.inner.pin_mut().run().into_diagnostic()
47    }
48
49    fn has_finished(&self) -> bool {
50        self.inner.hasFinished()
51    }
52}