packages feed

integreat-0.2.2.1: src/Print.hs

{- Print
Gregory W. Schwartz

Collections the functions pertaining to the printing of results.
-}

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}

module Print
    ( printNodeCorrScores
    ) where

-- Standard
import Control.Monad
import Data.List
import Data.Maybe
import qualified Data.Map.Strict as Map
import Data.Monoid

-- Cabal
import Statistics.Resampling.Bootstrap
import qualified Data.Text as T
import TextShow
import qualified Data.Vector as V
import qualified Data.Vector.Storable as VS

-- Local
import Types
import Utility

-- | Print the node correlation scores after integration.
printNodeCorrScores :: IDVec
                    -> Maybe UnifiedData
                    -> NodeCorrScoresMap
                    -> V.Vector NodeCorrScoresInfo
                    -> T.Text
printNodeCorrScores (IDVec idVec) unified scoreMap infos =
    T.append (header <> "\n")
        . T.unlines
        . zipWith
            (\x y -> T.intercalate "," $ x : fmap (fromMaybe "" . fmap showt) y)
            vertexCols
        . fmap getRow
        . V.toList
        $ infos
  where
    header = T.intercalate "," $ startHeader <> endHeader
    startHeader = ("vertex,numSamples" :)
                $ ( fmap ((\(LevelName !x, LevelName !y) -> x <> "_" <> y) . fst)
                  . Map.toAscList
                  . unNodeCorrScoresMap
                  $ scoreMap
                  )
    endHeader   = [ "average"
                  , "estPoint"
                  , "CILower"
                  , "CIUpper"
                  , "CIWidth"
                  , "rankProd"
                  , "pValRankProd"
                  ]
    vertexCols  = fmap vertexCol [0..(V.length idVec - 1)]
    vertexCol x = T.intercalate "," [ unID . (V.!) idVec $ x
                                    , maybe "0" (T.pack . show . Map.size)
                                    . (=<<) ( Map.lookup ((V.!) idVec x)
                                            . unUnifiedData
                                            )
                                    $ unified
                                    ]
    getRow info = (fmap Just . nodeCorrScore $ info)
               <> [ avgNodeCorrScores info
                  , fmap (estPoint . unBootstrap)
                  . avgStatisticNodeCorrScores
                  $ info
                  , ciLower info
                  , ciUpper info
                  , ciWidth info
                  , rankProdNodeCorrScores info
                  , rankProdPValNodeCorrScores info
                  ]
    ciLower info =
        fmap (estLowerBound . unBootstrap) . avgStatisticNodeCorrScores $ info
    ciUpper info =
        fmap (estUpperBound . unBootstrap) . avgStatisticNodeCorrScores $ info
    ciWidth info = fmap abs $ (-) <$> ciLower info <*> ciUpper info