{-# LANGUAGE BangPatterns #-}
module Math.Graph.Components
( getComponentMats
, getComponentMatsItems
) where
import Data.List (sort)
import qualified Data.Graph.Inductive as G
import qualified Data.Vector as V
import Math.Graph.Types
import Math.Clustering.Hierarchical.Spectral.Utility
getComponentMats :: (Graphable a) => a -> [a]
getComponentMats mat = fmap (fromGraph . flip G.subgraph gr) . G.components $ gr
where
gr = toGraph mat
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