packages feed

hgraph-1.2.0.0: src/HGraph/Undirected/Expanders.hs

module HGraph.Undirected.Expanders
       ( edgeExpansion
       , vertexExpansion
       )
where

import HGraph.Undirected
import qualified Data.Map as M

edgeExpansion :: (UndirectedGraph g, Adjacency g) => g a -> (Double, [a])
-- | Edge expansion of a graph, together with a set of verticies certifying that the expansion is not greater.
edgeExpansion g = (expansion, cert)
  where
    (expansion, cert') = edgeExpansion' (numVertices gi `div` 2) (vertices gi) []
    cert = map (idT M.!) cert'
    (gi, itol) = linearizeVertices g
    idT = M.fromList itol
    edgeExpansion' budget [] [] = (fromIntegral $ numVertices gi, [])
    edgeExpansion' budget [] as = (fromIntegral e / (fromIntegral $ length as), as)
      where
        e = sum [degree gi v | v <- as]
    edgeExpansion' 0 _ as = edgeExpansion' 0 [] as
    edgeExpansion' budget (v:vs) as = (e, c)
      where
        (e0,c0) = edgeExpansion' (budget - 1) vs (v : as)
        (e1,c1) = edgeExpansion' budget vs as
        (e,c) = if e0 < e1 then (e0,c0) else (e1,c1)

vertexExpansion :: (Adjacency g) => g a -> (Double, [a])
-- | Vertex expansion of a graph, together with a set of verticies certifying that the expansion is not greater.
vertexExpansion g = (0,[])