{- Math.Graph.Components
Gregory W. Schwartz
Find connected components of matrices.
-}
{-# LANGUAGE BangPatterns #-}
module Math.Graph.Components
( getComponentMats
, getComponentMatsItems
) where
-- Remote
import Data.List (sort)
import qualified Data.Graph.Inductive as G
import qualified Data.Vector as V
-- Local
import Math.Graph.Types
import Math.Clustering.Hierarchical.Spectral.Utility
-- | Get the components of a graphable object, an adjacency matrix.
getComponentMats :: (Graphable a) => a -> [a]
getComponentMats mat = fmap (fromGraph . flip G.subgraph gr) . G.components $ gr
where
gr = toGraph mat
-- | Get the components of a graphable object, an adjacency matrix with the
-- associated items.
getComponentMatsItems :: (Graphable b) => V.Vector a -> b -> [(V.Vector a, b)]
getComponentMatsItems items mat =
fmap (\ !xs -> (subsetVector items . sort $ xs, fromGraph . G.subgraph xs $ gr))
. G.components
$ gr
where
gr = toGraph mat