packages feed

uniqueness-periods-vector-examples 0.12.3.1 → 0.13.0.0

raw patch · 5 files changed

+253/−147 lines, 5 filesdep +bytestringnew-component:exe:distributionTextnew-component:exe:propertiesTextPVP ok

version bump matches the API change (PVP)

Dependencies added: bytestring

API changes (from Hackage documentation)

Files

ChangeLog.md view
@@ -141,3 +141,14 @@ ## 0.12.3.1 -- 2020-10-14  * Twelfth version revised D. Some code improvements.++## 0.13.0.0 -- 2020-10-17++* Thirteenth version. Divided the processText executable into two separate executables: propertiesText and distributionText (the second one is intended to process+the output of the first one). For example, on Linux shell :++	propertiesText <cmdline args> | distributionText <first arg> 1++will produce the similar behaviour to the single passing of the processText in the previous versions. This was made to improve performance of the functionality provided+earlier by the processText executable.+
+ Distribution/Main.hs view
@@ -0,0 +1,105 @@+-- |+-- Module      :  Main+-- Copyright   :  (c) OleksandrZhabenko 2020+-- 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. Since the 0.4.0.0 version+-- the program tries to be more accurate in cases of the lines consisting entirely of the words+-- which are unique in phonetic meaning alongside the line. Another hypothesis is for the seventh command line+-- argument (since the 0.12.0.0 version) equal to \"y0\" that the distribution+-- of the placement of the actual poetic text in Ukrainian is not one of the standard distributions.+-- It can probably have approximately a form of and is different for different authors:+--+-- >    --   --   --+-- >   /  \_/  \_/  \+--+-- 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 Main 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)+import Text.Read (readMaybe)+import System.Environment+import Numeric (showFFloat)+import Data.List (sort)+import Numeric.Stats+import qualified Data.ByteString.Char8 as B+import Data.Lists.FLines+import Data.Statistics.RulesIntervals+#ifdef __GLASGOW_HASKELL__+#if __GLASGOW_HASKELL__==708+/* code that applies only to GHC 7.8.* */+mconcat = concat+#endif+#endif++main :: IO ()+main = do+  args <- getArgs+  let !gzS = concat . take 1 $ args+      !printInput = concat . drop 1 . take 2 $ args+  contents <- B.getContents+  innerProc gzS printInput contents++innerProc :: String -> String -> B.ByteString -> IO ()+innerProc gzS printInput contents = do+  if printInput == "1" then B.putStr contents else B.putStr B.empty+  (!data31,!wordsCnt0_data32) <- processContents contents +  let !gz = getIntervalsN gzS data31 -- Obtained from the first command line argument except those ones that are for RTS+      !data4 = filter (/= 0.0) data31+  if null data4 then putStrLn (replicate 102 '-') >> putStrLn "1.000+-0.000\tALL!" >> putStrLn (replicate 102 '=') -- Well, this means that all the text consists of the unique (in phonetic meaning) words alongside every line. A rather rare occurrence.+  else do+      let (!mean1,!disp) = meanWithDisp data4+          !pairs = sort . filter ((/= 0) . snd) $ wordsCnt0_data32+          g !m !n = (length . takeWhile (\(_,v) -> v == n) . dropWhile (\(_,v) -> v /= n) . takeWhile (\(u,_) -> u == m) . dropWhile (\(u,_) -> u /= m) $ pairs) `using` rdeepseq+          h !y !x = mconcat [mconcat . map (\m1 -> mconcat [mconcat . map (\n1 ->  (if y then show (g m1 n1) else if g m1 n1 == 0 then "." else show (g m1 n1)) ++ "\t") $ [1..gz],newLineEnding]) $ [2..7],replicate 102 x]+      putStrLn . generalInfo1 gz pairs (mean1, disp) $ data31+      putStrLn (h False '~')+      putStrLn (h True '=')++getIntervalsN :: String -> [a] -> Int+getIntervalsN xs yss+  | xs == "s" = sturgesH (length yss)+  | xs == "l" = levynskyiMod (length yss)+  | otherwise = fromMaybe 9 (readMaybe xs::(Maybe Int))+{-# INLINE getIntervalsN #-}++processContents :: B.ByteString -> IO ([Float],[(Int,Int)])+processContents contents = do+  let !anlines = B.lines contents+      !anStrs = map (drop 6 . take 9 . B.words) anlines+      !ratioStrs = map (B.unpack . head) anStrs+      !wordsNStrs = map (B.unpack . (!! 1)) anStrs+      !intervalNStrs = map (B.unpack . last) anStrs+      !ratios = map (\xs -> fromMaybe 1.0 (readMaybe xs::Maybe Float)) ratioStrs+      !wordsNs = map (\xs -> fromMaybe 0 (readMaybe xs::Maybe Int)) wordsNStrs+      !intervalNs = map (\xs -> fromMaybe 0 (readMaybe xs::Maybe Int)) intervalNStrs+  return (ratios,zip wordsNs intervalNs)+  +generalInfo1 :: Int -> [(Int,Int)] -> (Float,Float) -> [Float] -> String+generalInfo1 gz pairs (mean1, disp) data31 =+ let !ks = map (\r -> length . takeWhile (== r) . dropWhile (/= r) . sort . map snd $ pairs) [1..gz]+     !s = sum ks in+       mconcat [replicate 102 '-', newLineEnding, mconcat . map (\r -> show r ++ "\t") $ [1..gz], newLineEnding, mconcat . map (\r ->  show r ++ "\t") $ ks,+         newLineEnding, mconcat . map (\r -> showFFloat (Just 2) (fromIntegral (r * 100) / fromIntegral s)  "%\t") $ ks,newLineEnding,+          mconcat [showFFloat (Just 4) mean1 "+-", showFFloat (Just 4) (sqrt disp) "\t", show (length . filter (== 0.0) $ data31),+           '\t':show (length data31)], newLineEnding, mconcat . map (\r -> show r ++ "\t") $ [2..7], newLineEnding, mconcat .+              map (\r ->  (show . length . takeWhile (== r) . dropWhile (/= r) . map fst $ pairs) ++ "\t") $ [2..7], newLineEnding, replicate 102 '*']+{-# INLINE generalInfo1 #-}+
+ GetInfo/Main.hs view
@@ -0,0 +1,124 @@+-- |+-- Module      :  Main+-- Copyright   :  (c) OleksandrZhabenko 2020+-- 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. Since the 0.4.0.0 version+-- the program tries to be more accurate in cases of the lines consisting entirely of the words+-- which are unique in phonetic meaning alongside the line. Another hypothesis is for the seventh command line+-- argument (since the 0.12.0.0 version) equal to \"y0\" that the distribution+-- of the placement of the actual poetic text in Ukrainian is not one of the standard distributions.+-- It can probably have approximately a form of and is different for different authors:+--+-- >    --   --   --+-- >   /  \_/  \_/  \+--+-- To enable parallel computations (potentially, they can speed up the work), please, run the @propertiesText@ executable with+-- @+RTS -threaded -RTS@ command line options with possibly @-N@ option inside.+--++{-# OPTIONS_GHC -threaded -rtsopts #-}++{-# LANGUAGE CPP, BangPatterns, FlexibleInstances, MultiParamTypeClasses #-}++module Main 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 System.IO+import Control.Concurrent+import Control.Exception+import Control.Parallel.Strategies+import Data.Maybe (fromMaybe)+import Text.Read (readMaybe)+import qualified Data.Vector as V+import Languages.UniquenessPeriods.Vector.General.Debug hiding (newLineEnding)+import Languages.UniquenessPeriods.Vector.Properties+import Melodics.Ukrainian+import System.Environment+import Languages.Phonetic.Ukrainian.PrepareText+import Languages.UniquenessPeriods.Vector.Data+import Languages.UniquenessPeriods.Vector.Auxiliary+import Languages.UniquenessPeriods.Vector.StrictV +import Numeric (showFFloat)+import Languages.UniquenessPeriods.Vector.Filters+import Data.Char (isAlpha)+import Data.Lists.FLines+import Data.Statistics.RulesIntervals+import Languages.UniquenessPeriods.Vector.FuncRepRelated+#ifdef __GLASGOW_HASKELL__+#if __GLASGOW_HASKELL__==708+/* code that applies only to GHC 7.8.* */+mconcat = concat+#endif+#endif+++instance GetTransL (FLines [String]) [String] where+  getTL g (F1 xss) = g xss+  getTL g (FL xsss) = mconcat . map g $ xsss++main :: IO ()+main = do+  args <- getArgs+  let !file = concat . take 1 $ args  -- The first command line arguments except those ones that are RTS arguments+      !printLine = fromMaybe 0 (readMaybe (concat . take 1 . drop 2 $ args)::(Maybe Int)) -- The third command line argument except those ones that are RTS arguments. Set to 1 if you would like to print the current line within the information+      !toOneLine = fromMaybe 0 (readMaybe (concat . take 1 . drop 3 $ args)::(Maybe Int)) -- The fourth command line argument except those ones that are RTS arguments. Set to 1 if you would like to convert the text into one single line before applying to it the processment (it can be more conceptually consistent in such a case)+      !compareMode = fromMaybe 0 (readMaybe (concat . take 1 . drop 4 $ args)::(Maybe Int)) -- The fifth command line argument except those ones that are RTS arguments. Set to 1 if you would like to print the original version and the concatenated one's (into one line) analyses.+      !gzS = concat . take 1 . drop 1 $ args+      !twoInParallel = fromMaybe 1 (readMaybe (concat . take 1 . drop 5 $ args)::(Maybe Int)) -- The sixth command line argument that controls whether if the fifth command line argument is set to \"1\" then the evaluation is done in parallel or not (set to \"1\" --- the default one --- if you would like to evaluate in parallel, otherwise --- just usual sequential evaluation).+      !choice = concat . drop 6 . take 7 $ args -- The seventh command line argument that controls what properties are used.+  contents <- readFile file+  if compareMode == 0 then do+   let !flines = fLines toOneLine contents+   innerProc gzS printLine choice flines+  else let tau !k = (let !flines1 = fLines k contents in innerProc gzS printLine choice flines1) in+    case twoInParallel of+     1 -> ($|) sequence_ rpar (map tau [1, 0])+     _ -> mapM_ tau [1, 0]++innerProc :: String -> Int -> String -> [String] -> IO ()+innerProc gzS printLine choice flInes = getData3 (getIntervalsN gzS flInes) printLine choice flInes++getIntervalsN :: String -> [String] -> Int+getIntervalsN xs yss+  | xs == "s" = sturgesH (length yss)+  | xs == "l" = levynskyiMod (length yss)+  | otherwise = fromMaybe 9 (readMaybe xs::(Maybe Int))+{-# INLINE getIntervalsN #-}++getData3 :: Int -> Int -> String -> [String] -> IO ()+getData3 gz printLine choice = mapM_ (\ts -> bracket (do+ myThread <- forkIO (+  let (!maxE,!minE,!data2) = runEval (parTuple3 rpar rpar rpar ((\k -> if k == 0.0 then 1.0 else k) . (\rs -> if null rs then 0.0 else head rs) . firstFrom3 .+         maximumElBy 1 (V.singleton oneProperty) $ UL2 ([],uniquenessVariants2GN " 01-" (V.singleton oneProperty) (chooseMax choice) ts), (\k -> if k == 0.0 then 1.0 else k) . abs . (\rs -> if null rs then 0.0 else head rs) .+              firstFrom3 . maximumElBy 1 (V.singleton oneProperty) $ UL2 ([],uniquenessVariants2GN " 01-" (V.singleton oneProperty)+                (chooseMin choice) ts),+                  (\k -> if k == 0.0 then 1.0 else k) . head . getAC (chooseMax choice) $ ts))+      (!wordsN,!intervalN)+         | maxE == 1 = (0, 0)+         | otherwise = runEval (parTuple2 rpar rpar (length . words $ ts, intervalNRealFrac minE maxE gz data2))+      !ratio = if maxE == 1.0 then 0.0 else 2.0 * data2 / (minE + maxE) in do+        hPutStr stdout . showFFloat (precChoice choice) minE $ "\t"+        hPutStr stdout . showFFloat (precChoice choice) data2 $ "\t"+        hPutStr stdout . showFFloat (precChoice choice) maxE $ "\t"+        hPutStr stdout . showFFloat (Just 4) (data2 / minE) $ "\t"+        hPutStr stdout . showFFloat (Just 4) (maxE / data2) $ "\t"+        hPutStr stdout . showFFloat (Just 4) (maxE / data2) $ "\t"+        hPutStr stdout . showFFloat Nothing ratio $ "\t"+        hPutStr stdout ('\t':show (wordsN::Int))+        hPutStr stdout ('\t':show (intervalN::Int))+        hPutStrLn stdout (if printLine == 1 then '\t':ts else ""))+ return myThread) (\myThread -> killThread myThread) (\_ -> hPutStr stdout ""))+{-# INLINABLE getData3 #-}++fLines :: Int -> String -> [String]+fLines !toOneLine = getTL (filter (any (\x -> isUkrainian x && isAlpha x))) . F1 . prepareText . (\z -> if toOneLine == 1 then unwords . words $ z else z)+{-# INLINE fLines #-}
− Proportion/Main.hs
@@ -1,143 +0,0 @@--- |--- Module      :  Main--- Copyright   :  (c) OleksandrZhabenko 2020--- 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. Since the 0.4.0.0 version--- the program tries to be more accurate in cases of the lines consisting entirely of the words--- which are unique in phonetic meaning alongside the line. Another hypothesis is for the seventh command line--- argument (since the 0.12.0.0 version) equal to \"y0\" that the distribution--- of the placement of the actual poetic text in Ukrainian is not one of the standard distributions.--- It can probably have approximately a form of and is different for different authors:------ >    --   --   ----- >   /  \_/  \_/  \------ To enable parallel computations (potentially, they can speed up the work), please, run the @uniqVec03@ executable with--- @+RTS -threaded -RTS@ command line options with possibly @-N@ option inside.-----{-# OPTIONS_GHC -threaded -rtsopts #-}--{-# LANGUAGE CPP, BangPatterns, FlexibleInstances, MultiParamTypeClasses #-}--module Main 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)-import Text.Read (readMaybe)-import qualified Data.Vector as V-import String.Languages.UniquenessPeriods.Vector-import Languages.UniquenessPeriods.Vector.General.Debug hiding (newLineEnding)-import Languages.UniquenessPeriods.Vector.Properties-import Languages.UniquenessPeriods.Vector.PropertiesFuncRep-import Melodics.Ukrainian-import System.Environment-import Languages.Phonetic.Ukrainian.PrepareText-import Languages.UniquenessPeriods.Vector.Data-import Languages.UniquenessPeriods.Vector.Auxiliary-import Languages.UniquenessPeriods.Vector.StrictV hiding (mconcat)-import Numeric (showFFloat)-import Languages.UniquenessPeriods.Vector.Filters-import GHC.Float (int2Float)-import GHC.Real (ceiling)-import Data.List (sort)-import Data.Char (isAlpha)-import Numeric.Stats-import Data.Lists.FLines hiding (mconcat)-import Data.Statistics.RulesIntervals-import Languages.UniquenessPeriods.Vector.FuncRepRelated-#ifdef __GLASGOW_HASKELL__-#if __GLASGOW_HASKELL__==708-/* code that applies only to GHC 7.8.* */-mconcat = concat-#endif-#endif---instance GetTransL (FLines [String]) [String] where-  getTL g (F1 xss) = g xss-  getTL g (FL xsss) = mconcat . map g $ xsss--main :: IO ()-main = do-  args <- getArgs-  let !file = concat . take 1 $ args  -- The first command line arguments except those ones that are RTS arguments-      !printLine = fromMaybe 0 (readMaybe (concat . take 1 . drop 2 $ args)::(Maybe Int)) -- The third command line argument except those ones that are RTS arguments. Set to 1 if you would like to print the current line within the information-      !toOneLine = fromMaybe 0 (readMaybe (concat . take 1 . drop 3 $ args)::(Maybe Int)) -- The fourth command line argument except those ones that are RTS arguments. Set to 1 if you would like to convert the text into one single line before applying to it the processment (it can be more conceptually consistent in such a case)-      !compareMode = fromMaybe 0 (readMaybe (concat . take 1 . drop 4 $ args)::(Maybe Int)) -- The fifth command line argument except those ones that are RTS arguments. Set to 1 if you would like to print the original version and the concatenated one's (into one line) analyses.-      !gzS = concat . take 1 . drop 1 $ args-      !twoInParallel = fromMaybe 1 (readMaybe (concat . take 1 . drop 5 $ args)::(Maybe Int)) -- The sixth command line argument that controls whether if the fifth command line argument is set to \"1\" then the evaluation is done in parallel or not (set to \"1\" --- the default one --- if you would like to evaluate in parallel, otherwise --- just usual sequential evaluation).-      !choice = concat . drop 6 . take 7 $ args -- The seventh command line argument that controls what properties are used.-  contents <- readFile file-  if compareMode == 0 then do-   let !flines = fLines toOneLine contents-   innerProc printLine choice flines gzS-  else let tau !k = (let !flines1 = fLines k contents in innerProc printLine choice flines1 gzS) in-    case twoInParallel of-     1 -> ($|) sequence_ rpar (map tau [1, 0])-     _ -> mapM_ tau [1, 0]--innerProc :: Int -> String -> [String] -> String -> IO ()-innerProc printLine choice flInes gzS = do-    let !gz = getIntervalsN gzS flInes -- Obtained from the second command line argument except those ones that are for RTS-        (!data31,!wordsCnt0_data32) = unzip . getData3 printLine gz choice $ flInes-        !data4 = filter (/= 0) . map fst $ data31-    if null data4 then putStrLn (replicate 102 '-') >> putStrLn "1.000+-0.000\tALL!" >> putStrLn (replicate 102 '=') -- Well, this means that all the text consists of the unique (in phonetic meaning) words alongside every line. A rather rare occurrence.-    else do-      let (!mean1,!disp) = meanWithDisp data4-          !pairs = sort . filter ((/= 0) . snd) $ wordsCnt0_data32-          g !m !n = (length . takeWhile (\(_,v) -> v == n) . dropWhile (\(_,v) -> v /= n) . takeWhile (\(u,_) -> u == m) . dropWhile (\(u,_) -> u /= m) $ pairs) `using` rdeepseq-          h !y !x = mconcat [mconcat . map (\m1 -> mconcat [mconcat . map (\n1 ->  (if y then show (g m1 n1) else if g m1 n1 == 0 then "." else show (g m1 n1)) ++ "\t") $ [1..gz],newLineEnding]) $ [2..7],replicate 102 x]-      mapM_ (putStrLn . snd) data31-      putStrLn . generalInfo1 gz pairs (mean1, disp) $ data31-      putStrLn (h False '~')-      putStrLn (h True '=')--getIntervalsN :: String -> [String] -> Int-getIntervalsN xs yss-  | xs == "s" = sturgesH (length yss)-  | xs == "l" = levynskyiMod (length yss)-  | otherwise = fromMaybe 9 (readMaybe xs::(Maybe Int))-{-# INLINE getIntervalsN #-}--getData3 :: Int -> Int -> String -> [String] -> [((Float,String),(Int,Int))]-getData3 printLine gz choice = parMap rseq (\ts ->-  let (!maxE,!minE,!data2) = runEval (parTuple3 rpar rpar rpar ((\k -> if k == 0.0 then 1.0 else k) . (\rs -> if null rs then 0.0 else head rs) . firstFrom3 .-         maximumElBy 1 (V.singleton oneProperty) $ UL2 ([],uniquenessVariants2GN " 01-" (V.singleton oneProperty) (chooseMax choice) ts), (\k -> if k == 0.0 then 1.0 else k) . abs . (\rs -> if null rs then 0.0 else head rs) .-              firstFrom3 . maximumElBy 1 (V.singleton oneProperty) $ UL2 ([],uniquenessVariants2GN " 01-" (V.singleton oneProperty)-                (chooseMin choice) ts),-                  (\k -> if k == 0.0 then 1.0 else k) . head . getAC (chooseMax choice) $ ts))-      (!wordsN,!intervalN)-         | maxE == 1 = (0, 0)-         | otherwise = runEval (parTuple2 rpar rpar (length . words $ ts, intervalNRealFrac minE maxE gz data2))-      (!ratio,!printedLine) = (if maxE == 1.0 then 0.0 else 2.0 * data2 / (minE + maxE), mconcat [showFFloat (precChoice choice) minE "\t",-        showFFloat (precChoice choice) data2 "\t", showFFloat (precChoice choice) maxE "\t", showFFloat (Just 4) (data2 / minE) "\t",-           showFFloat (Just 4) (maxE / data2) "\t", showFFloat (Just 4) ratio "\t", '\t':show (wordsN::Int),-             '\t':show (intervalN::Int), if printLine == 1 then '\t':ts else ""]) in ((ratio,printedLine),(wordsN,intervalN)))-{-# INLINABLE getData3 #-}--fLines :: Int -> String -> [String]-fLines !toOneLine = getTL (filter (any (\x -> isUkrainian x && isAlpha x))) . F1 . prepareText . (\z -> if toOneLine == 1 then unwords . words $ z else z)-{-# INLINE fLines #-}--generalInfo1 :: Int -> [(Int,Int)] -> (Float,Float) -> [(Float,String)] -> String-generalInfo1 gz pairs (mean1, disp) data31 =- let !ks = map (\r -> length . takeWhile (== r) . dropWhile (/= r) . sort . map snd $ pairs) [1..gz]-     !s = sum ks in-       mconcat [replicate 102 '-', newLineEnding, mconcat . map (\r -> show r ++ "\t") $ [1..gz], newLineEnding, mconcat . map (\r ->  show r ++ "\t") $ ks,-         newLineEnding, mconcat . map (\r -> showFFloat (Just 2) (fromIntegral (r * 100) / fromIntegral s)  "%\t") $ ks,newLineEnding,-          mconcat [showFFloat (Just 4) mean1 "+-", showFFloat (Just 4) (sqrt disp) "\t", show (length . filter (== 0) . map fst $ data31),-           '\t':show (length data31)], newLineEnding, mconcat . map (\r -> show r ++ "\t") $ [2..7], newLineEnding, mconcat .-              map (\r ->  (show . length . takeWhile (== r) . dropWhile (/= r) . map fst $ pairs) ++ "\t") $ [2..7], newLineEnding, replicate 102 '*']-{-# INLINE generalInfo1 #-}-
uniqueness-periods-vector-examples.cabal view
@@ -3,7 +3,7 @@ -- http://haskell.org/cabal/users-guide/  name:                uniqueness-periods-vector-examples-version:             0.12.3.1+version:             0.13.0.0 synopsis:            Usage examples for the uniqueness-periods-vector series of packages description:         Usage examples for the uniqueness-periods-vector series of packages. Several executables are planned to demonstrate the libraries work. homepage:            https://hackage.haskell.org/package/uniqueness-periods-vector-examples@@ -43,11 +43,20 @@   hs-source-dirs:      ., Lines   default-language:    Haskell2010 -executable processText+executable propertiesText   main-is:             Main.hs   other-modules:       Languages.UniquenessPeriods.Vector.FuncRepRelated, Data.Statistics.RulesIntervals   other-extensions:    CPP, BangPatterns, FlexibleInstances, MultiParamTypeClasses-  build-depends:       base >=4.7 && <4.15, mmsyn6ukr >=0.8.1 && <1, vector >=0.11 && <0.14, uniqueness-periods-vector >=0.3.1.1 && <1, uniqueness-periods-vector-general >=0.5.1 && < 1, uniqueness-periods-vector-common >=0.5.1.1 && <1, uniqueness-periods-vector-properties >=0.5.5 && <1, print-info >=0.1.3 && <1, phonetic-languages-ukrainian >=0.2.3 && <1, uniqueness-periods-vector-filters >=0.3 && <1, uniqueness-periods-vector-stats >=0.1.2 && <1, parallel >=3.2.0.6 && <4, lists-flines >=0.1.1 && <1, vector >=0.11 && <0.14+  build-depends:       base >=4.7 && <4.15, mmsyn6ukr >=0.8.1 && <1, vector >=0.11 && <0.14, uniqueness-periods-vector >=0.3.1.1 && <1, uniqueness-periods-vector-general >=0.5.1 && < 1, uniqueness-periods-vector-common >=0.5.1.1 && <1, uniqueness-periods-vector-properties >=0.5.5 && <1, phonetic-languages-ukrainian >=0.2.3 && <1, uniqueness-periods-vector-filters >=0.3 && <1, uniqueness-periods-vector-stats >=0.1.2 && <1, parallel >=3.2.0.6 && <4, lists-flines >=0.1.1 && <1   ghc-options:         -threaded -rtsopts-  hs-source-dirs:      ., Proportion+  hs-source-dirs:      ., GetInfo+  default-language:    Haskell2010++executable distributionText+  main-is:             Main.hs+  other-modules:       Data.Statistics.RulesIntervals+  other-extensions:    CPP, BangPatterns+  build-depends:       base >=4.7 && <4.15, bytestring >=0.10 && <0.13, parallel >=3.2.0.6 && <4, lists-flines >=0.1.1 && <1, uniqueness-periods-vector-stats >=0.1.2 && <1+  ghc-options:         -threaded -rtsopts+  hs-source-dirs:      ., Distribution   default-language:    Haskell2010