packages feed

HLearn-distributions 1.1.0 → 1.1.0.1

raw patch · 2 files changed

+136/−2 lines, 2 files

Files

HLearn-distributions.cabal view
@@ -1,5 +1,5 @@ Name:                HLearn-distributions-Version:             1.1.0+Version:             1.1.0.1 Synopsis:            Distributions for use with the HLearn library Description:         This module is used to estimate statistical distributions from data.  It is based on the algebraic properties of the "HomTrainer" type class from the HLearn-algebra package. Category:            Data Mining, Machine Learning, Statistics@@ -54,7 +54,7 @@         HLearn.Models.Distributions.Common         HLearn.Models.Distributions.Kernels         HLearn.Models.Distributions.Visualization.Gnuplot-        --HLearn.Models.Distributions.Visualization.Graphviz+        HLearn.Models.Distributions.Visualization.Graphviz         HLearn.Models.Distributions.Univariate.Binomial         HLearn.Models.Distributions.Univariate.Categorical         HLearn.Models.Distributions.Univariate.Exponential
+ src/HLearn/Models/Distributions/Visualization/Graphviz.hs view
@@ -0,0 +1,134 @@+++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE OverloadedStrings #-}++-- | Displays Multivariate dependencies++module HLearn.Models.Distributions.Visualization.Graphviz+    ( MultivariateLabels (..)+    , MarkovNetwork (..)+    )+    where++import HLearn.Algebra+import HLearn.Models.Distributions.Multivariate.Interface+import HLearn.Models.Distributions.Multivariate.Internal.CatContainer+import HLearn.Models.Distributions.Multivariate.Internal.Container+import HLearn.Models.Distributions.Multivariate.Internal.TypeLens++import Data.GraphViz.Exception+import Data.GraphViz hiding (graphToDot)+import Data.GraphViz.Attributes.Complete{-( Attribute(RankDir, Splines, FontName)+                                        , RankDir(FromLeft), EdgeType(SplineEdges))-}+import Control.Arrow(second)+import GHC.TypeLits++-------------------------------------------------------------------------------+-- clases++class (Trainable datatype) => MultivariateLabels datatype where+    getLabels :: datatype -> [String]+                       +class (MultivariateLabels (Datapoint dist)) => MarkovNetwork dist where+    graphL :: dist -> [String] -> [(String,[String])]+    +    plotNetwork :: FilePath -> dist -> IO Bool+    plotNetwork file dist = graphToDotPng file $ graphL dist $ getLabels (undefined :: Datapoint dist)+    +-------------------------------------------------------------------------------+-- instances++instance +    ( MultivariateLabels datapoint+    ) => MarkovNetwork (Multivariate datapoint '[] prob) +        where+    graphL _ labels = []++instance +    ( MultivariateLabels datapoint+    , MarkovNetwork (Multivariate datapoint xs prob)+    ) => MarkovNetwork (Multivariate datapoint ( ('[]) ': xs) prob) +        where+    graphL _ labels = graphL (undefined :: Multivariate datapoint xs prob) labels++instance +    ( MultivariateLabels datapoint+    , MarkovNetwork (Multivariate datapoint ( ys ': xs) prob)+    ) => MarkovNetwork (Multivariate datapoint ( (Ignore' label ': ys) ': xs) prob) +        where+    graphL _ labels = (graphL (undefined :: Multivariate datapoint ( ys ': xs) prob) (tail labels))++instance +    ( MultivariateLabels datapoint+    , MarkovNetwork (Multivariate datapoint ( ys ': xs) prob)+    ) => MarkovNetwork (Multivariate datapoint ( (CatContainer label ': ys) ': xs) prob) +        where+    graphL _ labels = (head labels, tail labels)+                    : (graphL (undefined :: Multivariate datapoint ( ys ': xs) prob) (tail labels))++instance +    ( MultivariateLabels datapoint+    , MarkovNetwork (Multivariate datapoint (ys ': xs) prob) +    ) => MarkovNetwork (Multivariate datapoint ( (Container dist label ': ys) ': xs) prob) +        where+    graphL _ l = (head l,[]):(graphL (undefined::Multivariate datapoint (ys ': xs) prob) (tail l))++instance +    ( MultivariateLabels datapoint+    , SingI (Length labelL)+    , MarkovNetwork (Multivariate datapoint ( ys ': xs) prob) +    ) => MarkovNetwork (Multivariate datapoint ( (MultiContainer dist (labelL:: [*]) ': ys) ': xs) prob) +        where+    graphL _ l = go (take n l) ++ (graphL (undefined ::  Multivariate datapoint ( ys ': xs ) prob) $ drop n l)+        where+            go [] = []+            go (x:xs) = (x,xs):(go xs)+              +            n = fromIntegral $ fromSing $ (sing :: Sing (Length labelL))++-------------------------------------------------------------------------------+-- Graphviz helpers++---------------------------------------+-- These functions are taken from the graphviz tutorial at:+-- http://ivanmiljenovic.wordpress.com/2011/10/16/graphviz-in-vacuum/++graphToDot :: (Ord a) => [(a, [a])] -> DotGraph a+graphToDot = graphToDotParams vacuumParams+ +graphToDotParams :: (Ord a, Ord cl) => GraphvizParams a () () cl l -> [(a, [a])] -> DotGraph a+graphToDotParams params nes = graphElemsToDot params ns es+  where+    ns = map (second $ const ()) nes+    es = concatMap mkEs nes+    mkEs (f,ts) = map (\t -> (f,t,())) ts+ +------------------------------------------------+ +vacuumParams :: GraphvizParams a () () () ()+vacuumParams = defaultParams { globalAttributes = gStyle }+ +gStyle :: [GlobalAttributes]+gStyle = [ GraphAttrs [RankDir FromLeft, {-Splines SplineEdges, -}FontName "courier", Layout Circo]+         , NodeAttrs  [textLabel "\\N", shape PlainText, fontColor Black, Shape Ellipse, style filled, fillColor AliceBlue, penWidth 2, color Navy]+         , EdgeAttrs  [color Black, Dir NoDir]+         ]+         +graphToDotPng :: FilePath -> [(String,[String])] -> IO Bool+graphToDotPng fpre g = handle (\(e::GraphvizException) -> return False)+                       $ addExtension (runGraphviz (graphToDot g)) Png fpre >> return True+