networkit-rs 0.1.0

Rust bindings for Networkit
Documentation
use cxx::UniquePtr;
use miette::IntoDiagnostic;

use crate::{
    base::Algorithm,
    bridge::{self, *},
    tools::NodeIter,
};

pub struct EdmondsKarp {
    inner: UniquePtr<bridge::EdmondsKarp>,
}

impl EdmondsKarp {
    pub fn new(g: &crate::Graph, source: u64, sink: u64) -> Self {
        Self {
            inner: NewEdmondsKarp(g, source, sink),
        }
    }
    pub fn get_max_flow(&self) -> f64 {
        self.inner.getMaxFlow()
    }

    pub fn get_source_set(&self) -> NodeIter {
        NodeIter {
            at: 0,
            nodes: EdmondsKarpGetSourceSet(&self.inner),
        }
    }
    pub fn get_flow(&self, u: u64, v: u64) -> f64 {
        self.inner.getFlow(u, v)
    }
    pub fn get_edge_flow(&self, e: u64) -> f64 {
        self.inner.getEdgeFlow(e)
    }
    pub fn get_flow_vector(&self) -> Vec<f64> {
        EdmondsKarpGetFlowVector(&self.inner)
            .iter()
            .cloned()
            .collect()
    }
}

impl Algorithm for EdmondsKarp {
    fn run(&mut self) -> miette::Result<()> {
        self.inner.pin_mut().run().into_diagnostic()
    }

    fn has_finished(&self) -> bool {
        self.inner.hasFinished()
    }
}