pub struct DirectedTwoCommodityIntegralFlow { /* private fields */ }Expand description
Directed Two-Commodity Integral Flow problem.
Given a directed graph G = (V, A) with arc capacities c(a), two source-sink pairs (s_1, t_1) and (s_2, t_2), and requirements R_1, R_2, determine whether two integral flow functions f_1, f_2: A -> Z_0^+ exist such that:
- Joint capacity: f_1(a) + f_2(a) <= c(a) for all a in A
- Flow conservation: for each commodity i, flow is conserved at every vertex except its own source and sink
- Requirements: net flow into t_i under f_i is at least R_i
§Variables
2|A| variables: first |A| for commodity 1’s flow on each arc, next |A| for commodity 2’s flow on each arc. Variable j for arc a of commodity i ranges over {0, …, c(a)}.
§Example
use problemreductions::models::graph::DirectedTwoCommodityIntegralFlow;
use problemreductions::topology::DirectedGraph;
use problemreductions::{Problem, Solver, BruteForce};
// 6-vertex network: s1=0, s2=1, t1=4, t2=5
let graph = DirectedGraph::new(6, vec![
(0, 2), (0, 3), (1, 2), (1, 3),
(2, 4), (2, 5), (3, 4), (3, 5),
]);
let problem = DirectedTwoCommodityIntegralFlow::new(
graph, vec![1; 8], 0, 4, 1, 5, 1, 1,
);
let solver = BruteForce::new();
assert!(solver.find_witness(&problem).is_some());Implementations§
Source§impl DirectedTwoCommodityIntegralFlow
impl DirectedTwoCommodityIntegralFlow
Sourcepub fn new(
graph: DirectedGraph,
capacities: Vec<u64>,
source_1: usize,
sink_1: usize,
source_2: usize,
sink_2: usize,
requirement_1: u64,
requirement_2: u64,
) -> Self
pub fn new( graph: DirectedGraph, capacities: Vec<u64>, source_1: usize, sink_1: usize, source_2: usize, sink_2: usize, requirement_1: u64, requirement_2: u64, ) -> Self
Create a new Directed Two-Commodity Integral Flow problem.
§Panics
Panics if:
capacities.len() != graph.num_arcs()- Any terminal vertex index >=
graph.num_vertices()
Sourcepub fn graph(&self) -> &DirectedGraph
pub fn graph(&self) -> &DirectedGraph
Get a reference to the underlying directed graph.
Sourcepub fn capacities(&self) -> &[u64]
pub fn capacities(&self) -> &[u64]
Get a reference to the capacities.
Sourcepub fn requirement_1(&self) -> u64
pub fn requirement_1(&self) -> u64
Get requirement for commodity 1.
Sourcepub fn requirement_2(&self) -> u64
pub fn requirement_2(&self) -> u64
Get requirement for commodity 2.
Sourcepub fn num_vertices(&self) -> usize
pub fn num_vertices(&self) -> usize
Get the number of vertices.
Sourcepub fn max_capacity(&self) -> u64
pub fn max_capacity(&self) -> u64
Get the maximum capacity across all arcs.
Sourcepub fn is_feasible(&self, config: &[usize]) -> bool
pub fn is_feasible(&self, config: &[usize]) -> bool
Check whether a flow assignment is feasible.
config has 2*|A| entries: first |A| for commodity 1, next |A| for commodity 2.
Trait Implementations§
Source§impl Clone for DirectedTwoCommodityIntegralFlow
impl Clone for DirectedTwoCommodityIntegralFlow
Source§fn clone(&self) -> DirectedTwoCommodityIntegralFlow
fn clone(&self) -> DirectedTwoCommodityIntegralFlow
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<'de> Deserialize<'de> for DirectedTwoCommodityIntegralFlow
impl<'de> Deserialize<'de> for DirectedTwoCommodityIntegralFlow
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Problem for DirectedTwoCommodityIntegralFlow
impl Problem for DirectedTwoCommodityIntegralFlow
Source§const NAME: &'static str = "DirectedTwoCommodityIntegralFlow"
const NAME: &'static str = "DirectedTwoCommodityIntegralFlow"
Source§fn dims(&self) -> Vec<usize>
fn dims(&self) -> Vec<usize>
Source§fn variant() -> Vec<(&'static str, &'static str)>
fn variant() -> Vec<(&'static str, &'static str)>
Source§fn num_variables(&self) -> usize
fn num_variables(&self) -> usize
Source§fn problem_type() -> ProblemType
fn problem_type() -> ProblemType
impl DeclaredVariant for DirectedTwoCommodityIntegralFlow
Auto Trait Implementations§
impl Freeze for DirectedTwoCommodityIntegralFlow
impl RefUnwindSafe for DirectedTwoCommodityIntegralFlow
impl Send for DirectedTwoCommodityIntegralFlow
impl Sync for DirectedTwoCommodityIntegralFlow
impl Unpin for DirectedTwoCommodityIntegralFlow
impl UnsafeUnpin for DirectedTwoCommodityIntegralFlow
impl UnwindSafe for DirectedTwoCommodityIntegralFlow
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
Source§impl<T> DynProblem for T
impl<T> DynProblem for T
Source§fn evaluate_dyn(&self, config: &[usize]) -> String
fn evaluate_dyn(&self, config: &[usize]) -> String
Source§fn evaluate_json(&self, config: &[usize]) -> Value
fn evaluate_json(&self, config: &[usize]) -> Value
Source§fn serialize_json(&self) -> Value
fn serialize_json(&self) -> Value
Source§fn problem_name(&self) -> &'static str
fn problem_name(&self) -> &'static str
Problem::NAME).Source§fn num_variables_dyn(&self) -> usize
fn num_variables_dyn(&self) -> usize
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.