-- |
-- Module      :  Distribution.Processment
-- Copyright   :  (c) OleksandrZhabenko 2020-2022
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Analyzes a poetic text in Ukrainian, for every line prints statistic data and
-- then for the whole poem prints the hypothesis evaluation information.
-- Is used in pair with some other programs, e. g. with propertiesTextG3 from phonetic-languages-simplified-examples-array package
-- or with a new phonetic-languages-ukrainian series.
-- The module contains library functions for the program.
-- 
--
-- To enable parallel computations (potentially, they can speed up the work), please, run the @distributionText@ executable with
-- @+RTS -threaded -RTS@ command line options with possibly @-N@ option inside.
--

{-# 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

-- | Sum data type to control whether the functions work with multiple properties or with just one.
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
'=') -- Well, this means that all the text consists of the lines that have no variativity from the program perspective and, therefore, they cannot be analyzed effectively by it. Nevertheless, you can accurately exclude them from the consideration. A rather rare occurrence.
    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) -- Obtained from the first command line argument except those ones that are for RTS
            | 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 -- Since the 0.6.0.0 version switched to the sample unbiased dispersion with (n - 1) in the denominator.
            | 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 #-}