hgraph/src/DCB/Structures.hs

55 lines
2.0 KiB
Haskell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
module DCB.Structures where
import Data.Array.Repa as A hiding ((++))
import Data.Int
import Util
-- | a one-dimensional array
type Vector r e = Array r DIM1 e
-- | a two-dimensional array
type Matrix r e = Array r DIM2 e
-- | A 'Matrix' of attribute values assigned to a graphs nodes.
-- Each row contains the corresponding nodes attribute values.
type Attr = Matrix A.U Double
-- | Adjacency-Matrix
type Adj = Matrix A.U Int8
-- | Matrix storing the extent of a 'Graph's constraints fulfillment.
-- It stores the minimum (zeroth column) and maximum (first column) value of all
-- the 'Graph's nodes per attribute.
-- The 'Vector' stores values of @1@ if the bounds are within the allowed range
-- ragarding the corresponding attribute, or @0@ if not.
type Constraints = (Vector A.U Int, Matrix A.U Double)
-- | A 'Vector' of weights indicating how much divergence is allowed in which dimension.
-- Each dimension represents an attribute.
type MaxDivergence = Vector A.U Double
-- | A graphs density.
type Density = Double
-- | consists of a 'Vector' denoting which columns of the 'Matrix' represents which originating
-- column in the global adjancency-matrix, a 'Matrix' of 'Constraints' and a scalar denoting the graphs 'Density'
type Graph = (Vector A.U Int, Constraints, Density)
-- | inverse sorting on graphs.
--
-- "smallest" graph has max number of Nodes
--
-- If Nodecount is identical we prioritize the number of fulfilled Constraints
instance Ord Graph where
(nodes, (const,_), _) `compare` (nodes', (const',_), _) =
let
s1 = (A.size $ A.extent nodes')
s2 = (A.size $ A.extent nodes)
in
if s1 == s2 then
(A.sumAllS const') `compare` (A.sumAllS const)
else
s1 `compare` s2