- java.lang.Object
 - 
- org.jgrapht.alg.flow.MaximumFlowAlgorithmBase<V,E>
 
 
- 
- Type Parameters:
 V- the graph vertex typeE- the graph edge type
- All Implemented Interfaces:
 FlowAlgorithm<V,E>,MaximumFlowAlgorithm<V,E>,MinimumSTCutAlgorithm<V,E>
- Direct Known Subclasses:
 DinicMFImpl,EdmondsKarpMFImpl,PushRelabelMFImpl
public abstract class MaximumFlowAlgorithmBase<V,E> extends java.lang.Object implements MaximumFlowAlgorithm<V,E>, MinimumSTCutAlgorithm<V,E>
Base class backing algorithms allowing to derive maximum-flow from the supplied flow network- Author:
 - Alexey Kudinkin, Joris Kinable
 
 
- 
- 
Nested Class Summary
- 
Nested classes/interfaces inherited from interface org.jgrapht.alg.interfaces.FlowAlgorithm
FlowAlgorithm.Flow<E>, FlowAlgorithm.FlowImpl<E> 
- 
Nested classes/interfaces inherited from interface org.jgrapht.alg.interfaces.MaximumFlowAlgorithm
MaximumFlowAlgorithm.MaximumFlow<E>, MaximumFlowAlgorithm.MaximumFlowImpl<E> 
 - 
 
- 
Field Summary
Fields Modifier and Type Field Description protected java.util.Comparator<java.lang.Double>comparatorprotected java.util.Set<E>cutEdgesstatic doubleDEFAULT_EPSILONDefault tolerance.protected booleandirectedGraphprotected ExtensionManager<E,? extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge>edgeExtensionManagerprotected java.util.Map<E,java.lang.Double>maxFlowprotected doublemaxFlowValueprotected Graph<V,E>networkprotected Vsinkprotected java.util.Set<V>sinkPartitionprotected Vsourceprotected java.util.Set<V>sourcePartitionprotected ExtensionManager<V,? extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.VertexExtensionBase>vertexExtensionManager 
- 
Constructor Summary
Constructors Constructor Description MaximumFlowAlgorithmBase(Graph<V,E> network, double epsilon)Construct a new maximum flow 
- 
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description doublecalculateMinCut(V source, V sink)Computes a minimum capacity $s-t$ cut.protected voidcalculateSourcePartition()Calculate the set of reachable vertices from $s$ in the residual graph.protected java.util.Map<E,java.lang.Double>composeFlow()Create a map which specifies for each edge in the input map the amount of flow that flows through itVgetCurrentSink()Returns current sink vertex, ornullif there was nocalculateMaximumFlowcalls.VgetCurrentSource()Returns current source vertex, ornullif there was nocalculateMaximumFlowcalls.doublegetCutCapacity()Returns the capacity of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)java.util.Set<E>getCutEdges()Returns the set of edges which run from $S$ to $T$, in the $s-t$ cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)In case of a directed graph, only the edges with their tail in $S$ and their head in $T$ are returned.VgetFlowDirection(E e)Returns the direction of the flow on an edge $(u,v)$.java.util.Map<E,java.lang.Double>getFlowMap()Returns maximum flow, that was calculated during lastcalculateMaximumFlowcall, ornull, if there was nocalculateMaximumFlowcalls.doublegetMaximumFlowValue()Returns maximum flow value, that was calculated during lastcalculateMaximumFlowcall.java.util.Set<V>getSinkPartition()Returns the sink partition $T$, $t \in T$, of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)java.util.Set<V>getSourcePartition()Returns the source partition $S$, $s \in S$, of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)protected <VE extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.VertexExtensionBase>
voidinit(V source, V sink, ExtensionFactory<VE> vertexExtensionFactory, ExtensionFactory<org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge> edgeExtensionFactory)Prepares all data structures to start a new invocation of the Maximum Flow or Minimum Cut algorithmsprotected voidpushFlowThrough(org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge edge, double flow)Increase flow in the direction denoted by edge $(u,v)$.- 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 
- 
Methods inherited from interface org.jgrapht.alg.interfaces.FlowAlgorithm
getFlow 
- 
Methods inherited from interface org.jgrapht.alg.interfaces.MaximumFlowAlgorithm
getMaximumFlow, getMaximumFlowValue 
 - 
 
 - 
 
- 
- 
Field Detail
- 
DEFAULT_EPSILON
public static final double DEFAULT_EPSILON
Default tolerance.- See Also:
 - Constant Field Values
 
 
- 
directedGraph
protected final boolean directedGraph
 
- 
comparator
protected java.util.Comparator<java.lang.Double> comparator
 
- 
vertexExtensionManager
protected ExtensionManager<V,? extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.VertexExtensionBase> vertexExtensionManager
 
- 
edgeExtensionManager
protected ExtensionManager<E,? extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge> edgeExtensionManager
 
- 
source
protected V source
 
- 
sink
protected V sink
 
- 
maxFlowValue
protected double maxFlowValue
 
- 
maxFlow
protected java.util.Map<E,java.lang.Double> maxFlow
 
- 
sourcePartition
protected java.util.Set<V> sourcePartition
 
- 
sinkPartition
protected java.util.Set<V> sinkPartition
 
- 
cutEdges
protected java.util.Set<E> cutEdges
 
 - 
 
- 
Method Detail
- 
init
protected <VE extends org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.VertexExtensionBase> void init(V source, V sink, ExtensionFactory<VE> vertexExtensionFactory, ExtensionFactory<org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge> edgeExtensionFactory)
Prepares all data structures to start a new invocation of the Maximum Flow or Minimum Cut algorithms- Type Parameters:
 VE- vertex extension type- Parameters:
 source- sourcesink- sinkvertexExtensionFactory- vertex extension factoryedgeExtensionFactory- edge extension factory
 
- 
pushFlowThrough
protected void pushFlowThrough(org.jgrapht.alg.flow.MaximumFlowAlgorithmBase.AnnotatedFlowEdge edge, double flow)Increase flow in the direction denoted by edge $(u,v)$. Any existing flow in the reverse direction $(v,u)$ gets reduced first. More precisely, let $f_2$ be the existing flow in the direction $(v,u)$, and $f_1$ be the desired increase of flow in direction $(u,v)$. If $f_1 \geq f_2$, then the flow on $(v,u)$ becomes $0$, and the flow on $(u,v)$ becomes $f_1-f_2$. Else, if $f_1 \textlptr f_2$, the flow in the direction $(v, u)$ is reduced, i.e. the flow on $(v, u)$ becomes $f_2 - f_1$, whereas the flow on $(u,v)$ remains zero.- Parameters:
 edge- desired direction in which the flow is increasedflow- increase of flow in the the direction indicated by the forwardEdge
 
- 
composeFlow
protected java.util.Map<E,java.lang.Double> composeFlow()
Create a map which specifies for each edge in the input map the amount of flow that flows through it- Returns:
 - a map which specifies for each edge in the input map the amount of flow that flows through it
 
 
- 
getCurrentSource
public V getCurrentSource()
Returns current source vertex, ornullif there was nocalculateMaximumFlowcalls.- Returns:
 - current source
 
 
- 
getCurrentSink
public V getCurrentSink()
Returns current sink vertex, ornullif there was nocalculateMaximumFlowcalls.- Returns:
 - current sink
 
 
- 
getMaximumFlowValue
public double getMaximumFlowValue()
Returns maximum flow value, that was calculated during lastcalculateMaximumFlowcall.- Returns:
 - maximum flow value
 
 
- 
getFlowMap
public java.util.Map<E,java.lang.Double> getFlowMap()
Returns maximum flow, that was calculated during lastcalculateMaximumFlowcall, ornull, if there was nocalculateMaximumFlowcalls.- Specified by:
 getFlowMapin interfaceFlowAlgorithm<V,E>- Returns:
 - read-only mapping from edges to doubles - flow values
 
 
- 
getFlowDirection
public V getFlowDirection(E e)
Returns the direction of the flow on an edge $(u,v)$. In case $(u,v)$ is a directed edge (arc), this function will always return the edge target $v$. However, if $(u,v)$ is an edge in an undirected graph, flow may go through the edge in either side. If the flow goes from $u$ to $v$, we return $v$, otherwise $u$. If the flow on an edge equals $0$, the returned value has no meaning.- Specified by:
 getFlowDirectionin interfaceFlowAlgorithm<V,E>- Parameters:
 e- edge- Returns:
 - the vertex where the flow leaves the edge
 
 
- 
calculateMinCut
public double calculateMinCut(V source, V sink)
Description copied from interface:MinimumSTCutAlgorithmComputes a minimum capacity $s-t$ cut.- Specified by:
 calculateMinCutin interfaceMinimumSTCutAlgorithm<V,E>- Parameters:
 source- ssink- t- Returns:
 - capacity of the cut
 
 
- 
getCutCapacity
public double getCutCapacity()
Description copied from interface:MinimumSTCutAlgorithmReturns the capacity of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)- Specified by:
 getCutCapacityin interfaceMinimumSTCutAlgorithm<V,E>- Returns:
 - capacity of the cut
 
 
- 
getSourcePartition
public java.util.Set<V> getSourcePartition()
Description copied from interface:MinimumSTCutAlgorithmReturns the source partition $S$, $s \in S$, of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)- Specified by:
 getSourcePartitionin interfaceMinimumSTCutAlgorithm<V,E>- Returns:
 - source partition S
 
 
- 
getSinkPartition
public java.util.Set<V> getSinkPartition()
Description copied from interface:MinimumSTCutAlgorithmReturns the sink partition $T$, $t \in T$, of the cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)- Specified by:
 getSinkPartitionin interfaceMinimumSTCutAlgorithm<V,E>- Returns:
 - source partition T
 
 
- 
getCutEdges
public java.util.Set<E> getCutEdges()
Description copied from interface:MinimumSTCutAlgorithmReturns the set of edges which run from $S$ to $T$, in the $s-t$ cut obtained after the last invocation ofMinimumSTCutAlgorithm.calculateMinCut(Object, Object)In case of a directed graph, only the edges with their tail in $S$ and their head in $T$ are returned. In cased of a undirected graph, all edges with one endpoint in $S$ and one endpoint in $T$ are returned.- Specified by:
 getCutEdgesin interfaceMinimumSTCutAlgorithm<V,E>- Returns:
 - set of edges which run from $S$ to $T$
 
 
- 
calculateSourcePartition
protected void calculateSourcePartition()
Calculate the set of reachable vertices from $s$ in the residual graph. 
 - 
 
 -