module Data.Graph.AdjacencyList.Network
(
Network (..)
, Capacity
, Capacities
, Flow
, uniformCapacities
) where
import Data.List
import Data.Maybe
import qualified Data.Map.Lazy as M
import qualified Data.IntSet as Set
import Data.Graph.AdjacencyList
type Capacity = Rational
type Capacities = M.Map Edge Capacity
type Flow = Capacity
showCapacities :: Capacities -> String
showCapacities :: Capacities -> String
showCapacities Capacities
cps =
Map Edge Double -> String
forall a. Show a => a -> String
show (Map Edge Double -> String) -> Map Edge Double -> String
forall a b. (a -> b) -> a -> b
$ (Capacity -> Double) -> Capacities -> Map Edge Double
forall a b. (a -> b) -> Map Edge a -> Map Edge b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Capacity
c -> Capacity -> Double
forall a. Fractional a => Capacity -> a
fromRational Capacity
c :: Double) Capacities
cps
data Network = Network { Network -> Graph
graph :: !Graph
, Network -> Vertex
source :: Vertex
, Network -> Vertex
sink :: Vertex
, Network -> Capacities
capacities :: Capacities
, Network -> Capacities
flow :: Capacities
}
deriving (Network -> Network -> Bool
(Network -> Network -> Bool)
-> (Network -> Network -> Bool) -> Eq Network
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Network -> Network -> Bool
== :: Network -> Network -> Bool
$c/= :: Network -> Network -> Bool
/= :: Network -> Network -> Bool
Eq)
instance Show Network where
show :: Network -> String
show Network
net =
String
"Network" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Graph -> String
forall a. Show a => a -> String
show (Network -> Graph
graph Network
net) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"\n"
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" source: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Vertex -> String
forall a. Show a => a -> String
show (Network -> Vertex
source Network
net) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"\n"
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" sink : " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Vertex -> String
forall a. Show a => a -> String
show (Network -> Vertex
sink Network
net) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"\n"
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" capacities: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Capacities -> String
showCapacities (Network -> Capacities
capacities Network
net) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"\n"
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" flows: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Capacities -> String
showCapacities (Network -> Capacities
flow Network
net) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"\n"
uniformCapacities :: Graph -> Capacities
uniformCapacities :: Graph -> Capacities
uniformCapacities Graph
g =
[(Edge, Capacity)] -> Capacities
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Edge, Capacity)] -> Capacities)
-> [(Edge, Capacity)] -> Capacities
forall a b. (a -> b) -> a -> b
$ (Edge -> (Edge, Capacity)) -> [Edge] -> [(Edge, Capacity)]
forall a b. (a -> b) -> [a] -> [b]
map (\Edge
e -> (Edge
e,Capacity
1)) ([Edge] -> [(Edge, Capacity)]) -> [Edge] -> [(Edge, Capacity)]
forall a b. (a -> b) -> a -> b
$ Graph -> [Edge]
edges Graph
g