{-# OPTIONS_GHC -threaded -rtsopts #-}
{-# LANGUAGE CPP, BangPatterns #-}
module Distribution.Processment where
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import Control.Parallel.Strategies
import Data.Maybe (fromMaybe,isJust,fromJust)
import Text.Read (readMaybe)
import Numeric (showFFloat)
import Data.List (sort)
import Numeric.Stats
import Data.Char (isDigit)
import qualified Data.ByteString.Char8 as B
import Data.Lists.FLines hiding (mconcat)
import Data.Statistics.RulesIntervals
import Data.Statistics.RulesIntervalsPlus
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif
data ControlStatsIntervals = U ([Double],[(Int,Int)]) | M [(Int,Int)] deriving (ControlStatsIntervals -> ControlStatsIntervals -> Bool
(ControlStatsIntervals -> ControlStatsIntervals -> Bool)
-> (ControlStatsIntervals -> ControlStatsIntervals -> Bool)
-> Eq ControlStatsIntervals
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ControlStatsIntervals -> ControlStatsIntervals -> Bool
$c/= :: ControlStatsIntervals -> ControlStatsIntervals -> Bool
== :: ControlStatsIntervals -> ControlStatsIntervals -> Bool
$c== :: ControlStatsIntervals -> ControlStatsIntervals -> Bool
Eq,Int -> ControlStatsIntervals -> ShowS
[ControlStatsIntervals] -> ShowS
ControlStatsIntervals -> String
(Int -> ControlStatsIntervals -> ShowS)
-> (ControlStatsIntervals -> String)
-> ([ControlStatsIntervals] -> ShowS)
-> Show ControlStatsIntervals
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ControlStatsIntervals] -> ShowS
$cshowList :: [ControlStatsIntervals] -> ShowS
show :: ControlStatsIntervals -> String
$cshow :: ControlStatsIntervals -> String
showsPrec :: Int -> ControlStatsIntervals -> ShowS
$cshowsPrec :: Int -> ControlStatsIntervals -> ShowS
Show)
isU :: ControlStatsIntervals -> Bool
isU :: ControlStatsIntervals -> Bool
isU (U ([Double], [(Int, Int)])
_) = Bool
True
isU ControlStatsIntervals
_ = Bool
False
isM :: ControlStatsIntervals -> Bool
isM :: ControlStatsIntervals -> Bool
isM (M [(Int, Int)]
_) = Bool
True
isM ControlStatsIntervals
_ = Bool
False
data31F :: ControlStatsIntervals -> Maybe [Double]
data31F (U ([Double]
x,[(Int, Int)]
y)) = [Double] -> Maybe [Double]
forall a. a -> Maybe a
Just [Double]
x
data31F (M [(Int, Int)]
_) = Maybe [Double]
forall a. Maybe a
Nothing
wordsCnt0_data32F :: ControlStatsIntervals -> [(Int, Int)]
wordsCnt0_data32F (U ([Double]
x,[(Int, Int)]
y)) = [(Int, Int)]
y
wordsCnt0_data32F (M [(Int, Int)]
y) = [(Int, Int)]
y
maybeDII :: (Int -> Bool) -> ControlStatsIntervals -> Maybe [(Double,(Int,Int))]
maybeDII :: (Int -> Bool)
-> ControlStatsIntervals -> Maybe [(Double, (Int, Int))]
maybeDII Int -> Bool
p (U ([Double]
xs,[(Int, Int)]
ys)) = [(Double, (Int, Int))] -> Maybe [(Double, (Int, Int))]
forall a. a -> Maybe a
Just ([(Double, (Int, Int))] -> Maybe [(Double, (Int, Int))])
-> ([(Int, Int)] -> [(Double, (Int, Int))])
-> [(Int, Int)]
-> Maybe [(Double, (Int, Int))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Double, (Int, Int)) -> Bool)
-> [(Double, (Int, Int))] -> [(Double, (Int, Int))]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(Double
_,(Int
y,Int
_)) -> Int -> Bool
p Int
y) ([(Double, (Int, Int))] -> [(Double, (Int, Int))])
-> ([(Int, Int)] -> [(Double, (Int, Int))])
-> [(Int, Int)]
-> [(Double, (Int, Int))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Double] -> [(Int, Int)] -> [(Double, (Int, Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [Double]
xs ([(Int, Int)] -> Maybe [(Double, (Int, Int))])
-> [(Int, Int)] -> Maybe [(Double, (Int, Int))]
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
ys
maybeDII Int -> Bool
_ ControlStatsIntervals
_ = Maybe [(Double, (Int, Int))]
forall a. Maybe a
Nothing
numberProps :: B.ByteString -> Int
numberProps :: ByteString -> Int
numberProps ByteString
contents = [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum ([Int] -> Int) -> (ByteString -> [Int]) -> ByteString -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> Int) -> [ByteString] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1 (Int -> Int) -> (ByteString -> Int) -> ByteString -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([ByteString] -> Int)
-> (ByteString -> [ByteString]) -> ByteString -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> Bool) -> [ByteString] -> [ByteString]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Char -> Bool) -> ByteString -> Bool
B.all Char -> Bool
isDigit) ([ByteString] -> [ByteString])
-> (ByteString -> [ByteString]) -> ByteString -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.words) ([ByteString] -> [Int])
-> (ByteString -> [ByteString]) -> ByteString -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.lines (ByteString -> Int) -> ByteString -> Int
forall a b. (a -> b) -> a -> b
$ ByteString
contents
innerProcG :: Bool -> Bool -> String -> Bool -> B.ByteString -> IO ()
innerProcG :: Bool -> Bool -> String -> Bool -> ByteString -> IO ()
innerProcG Bool
pairwisePermutations Bool
whitelines String
gzS Bool
multiprop ByteString
contents
| Bool
multiprop = (Int -> IO ()) -> [Int] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\Int
i -> Int -> ByteString -> IO ControlStatsIntervals
processContentsMultiprop Int
i ByteString
contents IO ControlStatsIntervals
-> (ControlStatsIntervals -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ControlStatsIntervals
csi -> Bool
-> Bool -> String -> ControlStatsIntervals -> ByteString -> IO ()
innerProc Bool
pairwisePermutations Bool
whitelines String
gzS ControlStatsIntervals
csi ByteString
contents) [Int
1..ByteString -> Int
numberProps ByteString
contents]
| Bool
otherwise = Bool -> ByteString -> IO ControlStatsIntervals
processContents Bool
whitelines ByteString
contents IO ControlStatsIntervals
-> (ControlStatsIntervals -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ControlStatsIntervals
csi -> Bool
-> Bool -> String -> ControlStatsIntervals -> ByteString -> IO ()
innerProc Bool
pairwisePermutations Bool
whitelines String
gzS ControlStatsIntervals
csi ByteString
contents
innerProc :: Bool -> Bool -> String -> ControlStatsIntervals -> B.ByteString -> IO ()
innerProc :: Bool
-> Bool -> String -> ControlStatsIntervals -> ByteString -> IO ()
innerProc Bool
pairwisePermutations Bool
whitelines String
gzS ControlStatsIntervals
csi ByteString
contents = do
if ((Int, Int) -> Bool) -> [(Int, Int)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ((Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
2) (Int -> Bool) -> ((Int, Int) -> Int) -> (Int, Int) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> a
fst) ([(Int, Int)] -> Bool)
-> (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControlStatsIntervals -> [(Int, Int)]
wordsCnt0_data32F (ControlStatsIntervals -> Bool) -> ControlStatsIntervals -> Bool
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi
then String -> IO ()
putStrLn (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
102 Char
'-') IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStrLn String
"1.000+-0.000\tALL!" IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStrLn (Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
102 Char
'=')
else do
let !gz :: Int
gz
| ControlStatsIntervals -> Bool
isU ControlStatsIntervals
csi = String -> [Double] -> Int
forall a. String -> [a] -> Int
getIntervalsN String
gzS (Maybe [Double] -> [Double]
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe [Double] -> [Double])
-> (ControlStatsIntervals -> Maybe [Double])
-> ControlStatsIntervals
-> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControlStatsIntervals -> Maybe [Double]
data31F (ControlStatsIntervals -> [Double])
-> ControlStatsIntervals -> [Double]
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi)
| Bool
otherwise = String -> [(Int, Int)] -> Int
forall a. String -> [a] -> Int
getIntervalsN String
gzS ([(Int, Int)] -> Int)
-> (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControlStatsIntervals -> [(Int, Int)]
wordsCnt0_data32F (ControlStatsIntervals -> Int) -> ControlStatsIntervals -> Int
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi
!mndsp :: Maybe (Double, Double)
mndsp
| ControlStatsIntervals -> Bool
isU ControlStatsIntervals
csi = (Double, Double) -> Maybe (Double, Double)
forall a. a -> Maybe a
Just ((Double, Double) -> Maybe (Double, Double))
-> (ControlStatsIntervals -> (Double, Double))
-> ControlStatsIntervals
-> Maybe (Double, Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Double] -> (Double, Double)
meanWithDispD2 ([Double] -> (Double, Double))
-> (ControlStatsIntervals -> [Double])
-> ControlStatsIntervals
-> (Double, Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Double, (Int, Int)) -> Double)
-> [(Double, (Int, Int))] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double, (Int, Int)) -> Double
forall a b. (a, b) -> a
fst ([(Double, (Int, Int))] -> [Double])
-> (ControlStatsIntervals -> [(Double, (Int, Int))])
-> ControlStatsIntervals
-> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe [(Double, (Int, Int))] -> [(Double, (Int, Int))]
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe [(Double, (Int, Int))] -> [(Double, (Int, Int))])
-> (ControlStatsIntervals -> Maybe [(Double, (Int, Int))])
-> ControlStatsIntervals
-> [(Double, (Int, Int))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool)
-> ControlStatsIntervals -> Maybe [(Double, (Int, Int))]
maybeDII (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
1) (ControlStatsIntervals -> Maybe (Double, Double))
-> ControlStatsIntervals -> Maybe (Double, Double)
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi
| Bool
otherwise = Maybe (Double, Double)
forall a. Maybe a
Nothing
!pairs :: [(Int, Int)]
pairs = [(Int, Int)] -> [(Int, Int)]
forall a. Ord a => [a] -> [a]
sort ([(Int, Int)] -> [(Int, Int)])
-> (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals
-> [(Int, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
0) (Int -> Bool) -> ((Int, Int) -> Int) -> (Int, Int) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> b
snd) ([(Int, Int)] -> [(Int, Int)])
-> (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals
-> [(Int, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControlStatsIntervals -> [(Int, Int)]
wordsCnt0_data32F (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals -> [(Int, Int)]
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi
g :: Int -> Int -> Int
g !Int
m !Int
n = ([(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([(Int, Int)] -> Int)
-> ([(Int, Int)] -> [(Int, Int)]) -> [(Int, Int)] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (\(Int
_,Int
v) -> Int
v Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
n) ([(Int, Int)] -> [(Int, Int)])
-> ([(Int, Int)] -> [(Int, Int)]) -> [(Int, Int)] -> [(Int, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (\(Int
_,Int
v) -> Int
v Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
n) ([(Int, Int)] -> [(Int, Int)])
-> ([(Int, Int)] -> [(Int, Int)]) -> [(Int, Int)] -> [(Int, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (\(Int
u,Int
_) -> Int
u Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
m) ([(Int, Int)] -> [(Int, Int)])
-> ([(Int, Int)] -> [(Int, Int)]) -> [(Int, Int)] -> [(Int, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (\(Int
u,Int
_) -> Int
u Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
m) ([(Int, Int)] -> Int) -> [(Int, Int)] -> Int
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
pairs) Int -> Strategy Int -> Int
forall a. a -> Strategy a -> a
`using` Strategy Int
forall a. NFData a => Strategy a
rdeepseq
h :: Bool -> Char -> String
h !Bool
y !Char
x = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [[String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
m1 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [[String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
n1 -> (if Bool
y then Int -> String
forall a. Show a => a -> String
show (Int -> Int -> Int
g Int
m1 Int
n1)
else if Int -> Int -> Int
g Int
m1 Int
n1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 then String
"." else Int -> String
forall a. Show a => a -> String
show (Int -> Int -> Int
g Int
m1 Int
n1)) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\t") ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$ [Int
1..Int
gz],String
newLineEnding]) ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$
[Int
2..(if Bool
pairwisePermutations then Int
10 else Int
7)],Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
102 Char
x]
String -> IO ()
putStrLn (String -> IO ())
-> (ControlStatsIntervals -> String)
-> ControlStatsIntervals
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool
-> Int -> [(Int, Int)] -> Maybe (Double, Double) -> Int -> String
generalInfo1 Bool
pairwisePermutations Int
gz [(Int, Int)]
pairs Maybe (Double, Double)
mndsp (Int -> String)
-> (ControlStatsIntervals -> Int)
-> ControlStatsIntervals
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([(Int, Int)] -> Int)
-> (ControlStatsIntervals -> [(Int, Int)])
-> ControlStatsIntervals
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControlStatsIntervals -> [(Int, Int)]
wordsCnt0_data32F (ControlStatsIntervals -> IO ()) -> ControlStatsIntervals -> IO ()
forall a b. (a -> b) -> a -> b
$ ControlStatsIntervals
csi
String -> IO ()
putStrLn (Bool -> Char -> String
h Bool
False Char
'~')
String -> IO ()
putStrLn (Bool -> Char -> String
h Bool
True Char
'=')
processContents :: Bool -> B.ByteString -> IO ControlStatsIntervals
processContents :: Bool -> ByteString -> IO ControlStatsIntervals
processContents Bool
whitelines ByteString
contents = do
let !anlines :: [ByteString]
anlines = ByteString -> [ByteString]
B.lines ByteString
contents
!anStrs :: [[ByteString]]
anStrs
| Bool
whitelines = ([ByteString] -> Bool) -> [[ByteString]] -> [[ByteString]]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> ([ByteString] -> Bool) -> [ByteString] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([[ByteString]] -> [[ByteString]])
-> ([ByteString] -> [[ByteString]])
-> [ByteString]
-> [[ByteString]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> [ByteString]) -> [ByteString] -> [[ByteString]]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
drop Int
6 ([ByteString] -> [ByteString])
-> (ByteString -> [ByteString]) -> ByteString -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
take Int
9 ([ByteString] -> [ByteString])
-> (ByteString -> [ByteString]) -> ByteString -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.words) ([ByteString] -> [[ByteString]]) -> [ByteString] -> [[ByteString]]
forall a b. (a -> b) -> a -> b
$ [ByteString]
anlines
| Bool
otherwise = (ByteString -> [ByteString]) -> [ByteString] -> [[ByteString]]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
drop Int
6 ([ByteString] -> [ByteString])
-> (ByteString -> [ByteString]) -> ByteString -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
take Int
9 ([ByteString] -> [ByteString])
-> (ByteString -> [ByteString]) -> ByteString -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.words) [ByteString]
anlines
!ratioStrs :: [String]
ratioStrs = ([ByteString] -> String) -> [[ByteString]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> String
B.unpack (ByteString -> String)
-> ([ByteString] -> ByteString) -> [ByteString] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> ByteString
forall a. [a] -> a
head) [[ByteString]]
anStrs
!wordsNStrs :: [String]
wordsNStrs = ([ByteString] -> String) -> [[ByteString]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> String
B.unpack (ByteString -> String)
-> ([ByteString] -> ByteString) -> [ByteString] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([ByteString] -> Int -> ByteString
forall a. [a] -> Int -> a
!! Int
1)) [[ByteString]]
anStrs
!intervalNStrs :: [String]
intervalNStrs = ([ByteString] -> String) -> [[ByteString]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> String
B.unpack (ByteString -> String)
-> ([ByteString] -> ByteString) -> [ByteString] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> ByteString
forall a. [a] -> a
last) [[ByteString]]
anStrs
!ratios :: [Double]
ratios = (String -> Double) -> [String] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (\String
xs -> Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
1.0 (String -> Maybe Double
forall a. Read a => String -> Maybe a
readMaybe String
xs::Maybe Double)) [String]
ratioStrs
!wordsNs :: [Int]
wordsNs = (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
xs -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::Maybe Int)) [String]
wordsNStrs
!intervalNs :: [Int]
intervalNs = (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
xs -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::Maybe Int)) [String]
intervalNStrs
ControlStatsIntervals -> IO ControlStatsIntervals
forall (m :: * -> *) a. Monad m => a -> m a
return (ControlStatsIntervals -> IO ControlStatsIntervals)
-> (([Double], [(Int, Int)]) -> ControlStatsIntervals)
-> ([Double], [(Int, Int)])
-> IO ControlStatsIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Double], [(Int, Int)]) -> ControlStatsIntervals
U (([Double], [(Int, Int)]) -> IO ControlStatsIntervals)
-> ([Double], [(Int, Int)]) -> IO ControlStatsIntervals
forall a b. (a -> b) -> a -> b
$ ([Double]
ratios,[Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int]
wordsNs [Int]
intervalNs)
processContentsMultiprop :: Int -> B.ByteString -> IO ControlStatsIntervals
processContentsMultiprop :: Int -> ByteString -> IO ControlStatsIntervals
processContentsMultiprop Int
propN ByteString
contents = do
let !anwords :: [[ByteString]]
anwords = (ByteString -> [ByteString]) -> [ByteString] -> [[ByteString]]
forall a b. (a -> b) -> [a] -> [b]
map ByteString -> [ByteString]
B.words ([ByteString] -> [[ByteString]])
-> (ByteString -> [ByteString]) -> ByteString -> [[ByteString]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.lines (ByteString -> [[ByteString]]) -> ByteString -> [[ByteString]]
forall a b. (a -> b) -> a -> b
$ ByteString
contents
!wordsNStrs :: [String]
wordsNStrs = ([ByteString] -> String) -> [[ByteString]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> String
B.unpack (ByteString -> String)
-> ([ByteString] -> ByteString) -> [ByteString] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> ByteString
forall a. [a] -> a
head) [[ByteString]]
anwords
!intervalNStrs :: [String]
intervalNStrs = ([ByteString] -> String) -> [[ByteString]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> String
B.unpack (ByteString -> String)
-> ([ByteString] -> ByteString) -> [ByteString] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> ByteString
B.concat ([ByteString] -> ByteString)
-> ([ByteString] -> [ByteString]) -> [ByteString] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
drop Int
propN ([ByteString] -> [ByteString])
-> ([ByteString] -> [ByteString]) -> [ByteString] -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
take (Int
propN Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) [[ByteString]]
anwords
!wordsNs :: [Int]
wordsNs = Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
drop Int
1 ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
xs -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::Maybe Int)) ([String] -> [Int]) -> [String] -> [Int]
forall a b. (a -> b) -> a -> b
$ [String]
wordsNStrs
!intervalNs :: [Int]
intervalNs = (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
xs -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::Maybe Int)) ([String] -> [Int]) -> [String] -> [Int]
forall a b. (a -> b) -> a -> b
$ [String]
intervalNStrs
ControlStatsIntervals -> IO ControlStatsIntervals
forall (m :: * -> *) a. Monad m => a -> m a
return (ControlStatsIntervals -> IO ControlStatsIntervals)
-> ([Int] -> ControlStatsIntervals)
-> [Int]
-> IO ControlStatsIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, Int)] -> ControlStatsIntervals
M ([(Int, Int)] -> ControlStatsIntervals)
-> ([Int] -> [(Int, Int)]) -> [Int] -> ControlStatsIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int]
wordsNs ([Int] -> IO ControlStatsIntervals)
-> [Int] -> IO ControlStatsIntervals
forall a b. (a -> b) -> a -> b
$ [Int]
intervalNs
generalInfo1 :: Bool -> Int -> [(Int,Int)] -> Maybe (Double,Double) -> Int -> String
generalInfo1 :: Bool
-> Int -> [(Int, Int)] -> Maybe (Double, Double) -> Int -> String
generalInfo1 Bool
pairwisePermutations Int
gz [(Int, Int)]
pairs Maybe (Double, Double)
mndsp Int
ll =
let !ks :: [Int]
ks = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> [Int] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Int] -> Int) -> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
r) ([Int] -> [Int])
-> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
r) ([Int] -> [Int])
-> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. Ord a => [a] -> [a]
sort ([Int] -> [Int])
-> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Int) -> [(Int, Int)] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int, Int) -> Int
forall a b. (a, b) -> b
snd ([(Int, Int)] -> Int) -> [(Int, Int)] -> Int
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
pairs) [Int
1..Int
gz]
!s :: Int
s = [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Int]
ks
stringMD :: String
stringMD
| Maybe (Double, Double) -> Bool
forall a. Maybe a -> Bool
isJust Maybe (Double, Double)
mndsp = let (Double
mean1,Double
disp) = Maybe (Double, Double) -> (Double, Double)
forall a. HasCallStack => Maybe a -> a
fromJust Maybe (Double, Double)
mndsp in [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) Double
mean1 String
"+-", Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4) (Double -> Double
forall a. Floating a => a -> a
sqrt Double
disp) String
"\t"]
| Bool
otherwise = String
"" in
[String] -> String
forall a. Monoid a => [a] -> a
mconcat [Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
102 Char
'-', String
newLineEnding, [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> Int -> String
forall a. Show a => a -> String
show Int
r String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\t") ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$ [Int
1..Int
gz], String
newLineEnding,
[String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> Int -> String
forall a. Show a => a -> String
show Int
r String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\t") ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$ [Int]
ks,
String
newLineEnding, [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2) (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
100) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
s) String
"%\t") ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$ [Int]
ks,
String
newLineEnding, String
stringMD, Int -> String
forall a. Show a => a -> String
show ([(Int, Int)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([(Int, Int)] -> Int)
-> ([(Int, Int)] -> [(Int, Int)]) -> [(Int, Int)] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
1) (Int -> Bool) -> ((Int, Int) -> Int) -> (Int, Int) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> a
fst) ([(Int, Int)] -> Int) -> [(Int, Int)] -> Int
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
pairs), Char
'\t'Char -> ShowS
forall a. a -> [a] -> [a]
:Int -> String
forall a. Show a => a -> String
show Int
ll, String
newLineEnding,
[String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String)
-> ([Integer] -> [String]) -> [Integer] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> String) -> [Integer] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Integer
r -> Integer -> String
forall a. Show a => a -> String
show Integer
r String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\t") ([Integer] -> String) -> [Integer] -> String
forall a b. (a -> b) -> a -> b
$ [Integer
2..(if Bool
pairwisePermutations then Integer
10 else Integer
7)], String
newLineEnding, [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Int] -> [String]) -> [Int] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> ([(Int, Int)] -> Int) -> [(Int, Int)] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Int] -> Int) -> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
r) ([Int] -> [Int])
-> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
r) ([Int] -> [Int])
-> ([(Int, Int)] -> [Int]) -> [(Int, Int)] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Int) -> [(Int, Int)] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int, Int) -> Int
forall a b. (a, b) -> a
fst ([(Int, Int)] -> String) -> [(Int, Int)] -> String
forall a b. (a -> b) -> a -> b
$ [(Int, Int)]
pairs) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\t") ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$
[Int
2..(if Bool
pairwisePermutations then Int
10 else Int
7)], String
newLineEnding, Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
102 Char
'*']
{-# INLINE generalInfo1 #-}