case_emptyVertColorMapEmpty =
assertEqual "" 0 $ IntMap.size emptyVertColorMap
+-- | Check that our generated graphs are colorable
+prop_isColorableTestableGraph :: TestableGraph -> Property
+prop_isColorableTestableGraph (TestableGraph g) = isColorable g ==? True
+
+-- | Check that our generated graphs are colorable
+prop_isColorableTestableClique :: TestableClique -> Property
+prop_isColorableTestableClique (TestableClique g) = isColorable g ==? True
+
-- | Check that the given algorithm colors a clique with the same number of
-- colors as the vertices number.
prop_colorClique :: (Graph.Graph -> ColorVertMap) -> TestableClique -> Property
, 'prop_colorDsaturClique
, 'prop_colorLFAllNodes
, 'prop_colorDsaturAllNodes
+ , 'prop_isColorableTestableGraph
+ , 'prop_isColorableTestableClique
]
, colorInOrder
, colorLF
, colorDsatur
+ , isColorable
-- * Color map transformations
, colorVertMap
- -- * Vertex sorting
+ -- * Vertex characteristics
, verticesByDegreeDesc
, verticesByDegreeAsc
+ , neighbors
+ , hasLoop
+ , isUndirected
) where
import Data.Maybe
neighbors :: Graph.Graph -> Graph.Vertex -> [Graph.Vertex]
neighbors g v = g Array.! v
+-- | Check whether a graph has no loops.
+-- (vertices connected to themselves)
+hasLoop :: Graph.Graph -> Bool
+hasLoop g = any vLoops $ Graph.vertices g
+ where vLoops v = v `elem` neighbors g v
+
+-- | Check whether a graph is undirected
+isUndirected :: Graph.Graph -> Bool
+isUndirected g =
+ (sort . Graph.edges) g == (sort . Graph.edges . Graph.transposeG) g
+
-- * Coloring
-- | Empty color map.
emptyVertColorMap :: VertColorMap
emptyVertColorMap = IntMap.empty
+-- | Check whether a graph is colorable.
+isColorable :: Graph.Graph -> Bool
+isColorable g = isUndirected g && not (hasLoop g)
+
-- | Get the colors of a list of vertices.
-- Any uncolored vertices are ignored.
listColors :: VertColorMap -> [Graph.Vertex] -> [Color]