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 +11/−0
- Distribution/Main.hs +105/−0
- GetInfo/Main.hs +124/−0
- Proportion/Main.hs +0/−143
- uniqueness-periods-vector-examples.cabal +13/−4
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