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}