{-# LANGUAGE CPP #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Numeric.Wrapper.R.GLPK.Phonetics.Ukrainian.Durations
-- Copyright   :  (c) OleksandrZhabenko 2020-2021
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Can be used to calculate the durations of the approximations of the Ukrainian phonemes
-- using some prepared text with its correct (at least mostly) pronunciation.
-- The prepared text is located in the same directory and contains lines --- the
-- Ukrainian word and its duration in seconds separated with whitespace.
-- The library is intended to use the functionality of the :
--
-- 1) R programming language https://www.r-project.org/
--
-- 2) Rglpk library https://cran.r-project.org/web/packages/Rglpk/index.html
--
-- 3) GNU GLPK library https://www.gnu.org/software/glpk/glpk.html
--
-- For more information, please, see the documentation for them.
--
-- For the model correctness the js here refers to \"ABCEFXYabcdefghijklmnopqrstuvxyz\".
-- To get such js some of the Ukrainian words in the abovementioned file must contain an apostrophe and there should be
-- somewhat like \"їх_друг\".

module Numeric.Wrapper.R.GLPK.Phonetics.Ukrainian.Durations 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 Data.Monoid hiding (mconcat)
import Text.Read
import Data.Maybe
import CaseBi.Arr (getBFstLSorted')
import Data.Foldable (foldl')
import GHC.Arr
import GHC.Int
import Numeric
import Data.List (intercalate)
import Data.Lists.FLines (newLineEnding)
import Data.Foldable.Ix (findIdx1)
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

createCoeffsObj :: Int -> [String] -> [Double]
createCoeffsObj :: Int -> [String] -> [Double]
createCoeffsObj Int
l [String]
xss
  | [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
xss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
l = [String] -> [Double]
f ([String]
xss  [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend`  Int -> String -> [String]
forall a. Int -> a -> [a]
replicate (Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
xss) String
"1.0")
  | Bool
otherwise = [String] -> [Double]
f (Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
l [String]
xss)
      where f :: [String] -> [Double]
f [String]
tss = (String -> Double) -> [String] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (\String
ts -> 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
ts::Maybe Double)) [String]
tss

countCharInWords :: [String] -> Char -> [Int]
countCharInWords :: [String] -> Char -> [Int]
countCharInWords [String]
xss Char
x
  | [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss = []
  | Bool
otherwise = (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (String -> Int) -> (String -> String) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x)) [String]
xss

matrix1Column :: [String] -> String -> Char -> [Int]
matrix1Column :: [String] -> String -> Char -> [Int]
matrix1Column [String]
xss String
js Char
x = Char -> [Int] -> [Int]
pairwiseComparings Char
x ([String] -> Char -> [Int]
countCharInWords [String]
xss Char
x  [Int] -> [Int] -> [Int]
forall a. Monoid a => a -> a -> a
`mappend`  [Int]
rs  [Int] -> [Int] -> [Int]
forall a. Monoid a => a -> a -> a
`mappend`  [Int]
rs)
  where l :: Int
l =  String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
js
        iX :: Int
iX = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (-Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Maybe Int -> Int) -> (String -> Maybe Int) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> Maybe Int
forall a (t :: * -> *) b.
(Eq a, Foldable t, Integral b) =>
a -> t a -> Maybe b
findIdx1 Char
x (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
js
        rs :: [Int]
rs = if Int
iX Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 then [] else Int -> Int -> [Int]
forall a. Int -> a -> [a]
replicate Int
iX Int
0  [Int] -> [Int] -> [Int]
forall a. Monoid a => a -> a -> a
`mappend`  [Int
1]  [Int] -> [Int] -> [Int]
forall a. Monoid a => a -> a -> a
`mappend`  Int -> Int -> [Int]
forall a. Int -> a -> [a]
replicate (Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
iX) Int
0

pairwiseComparings :: Char -> [Int] -> [Int]
pairwiseComparings :: Char -> [Int] -> [Int]
pairwiseComparings Char
x [Int]
ys = [Int]
ys [Int] -> [Int] -> [Int]
forall a. Monoid a => a -> a -> a
`mappend` Char -> [Int]
pairs' Char
x

{-| @since 0.3.0.0
Changed the \'f\' -- \'v\' (\'ф\' -- \'в\') proportions. The Ukrainian \'в\' is almost always shorter than
\'ф\'.
-}
pairs' :: Char -> [Int]
pairs' :: Char -> [Int]
pairs' Char
x
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'f' =  [Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'v' =  [-Int
9,-Int
20,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'x' =  [Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'h' =  [Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'g' =  [Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'k' =  [Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'j' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'B' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
10,-Int
15,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'A' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'z' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
10,-Int
15,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'd' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'b' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
10,Int
10,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'p' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
't' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
's' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'F' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
7,-Int
13,Int
0,Int
0,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'E' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
8,-Int
14,Int
0,Int
0]
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'c' =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,-Int
8,-Int
14]
  | Bool
otherwise =  [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0,Int
0]

-- | Actually @n@ is a 'length' bss.
matrixLine :: [String] -> String -> Int -> String
matrixLine :: [String] -> String -> Int -> String
matrixLine [String]
bss String
js Int
n
  | [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
bss Bool -> Bool -> Bool
|| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
0 = []
  | Bool
otherwise = String
"mat1 <- matrix(c("  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
", " ([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 -> String
forall a. Show a => a -> String
show ([Int] -> String) -> [Int] -> String
forall a b. (a -> b) -> a -> b
$ ((Char -> [Int]) -> String -> [Int]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ([String] -> String -> Char -> [Int]
matrix1Column ([String]
bss  [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend`  [String]
bss) String
js) String
js))  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
"), nrow = "  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  Int -> String
forall a. Show a => a -> String
show (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
js Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
24)  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
")" String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding

{-| @since 0.3.0.0
Switched to the array representation as the cheaper one.
-}
objLine :: Array Int Double -> String
objLine :: Array Int Double -> String
objLine Array Int Double
v
 | Array Int Double -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Array Int Double
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
32 = String
"obj1 <- c("  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
", " ([String] -> String)
-> ([Double] -> [String]) -> [Double] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Double -> String) -> [Double] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Double
t -> Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing Double
t String
"") ([Double] -> String) -> [Double] -> String
forall a b. (a -> b) -> a -> b
$ Array Int Double -> [Double]
objCoeffs Array Int Double
v)  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
")" String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
 | Bool
otherwise = String -> String
forall a. HasCallStack => String -> a
error String
"Numeric.Wrapper.R.GLPK.Phonetics.Ukrainian.Durations.objLine: Not defined for the short argument. "

{-| @since 0.3.0.0
Switched to the array representation as the cheaper one.
-}
objCoeffs :: Array Int Double -> [Double]
objCoeffs :: Array Int Double -> [Double]
objCoeffs Array Int Double
arr =
  let lst :: [(Integer, Double)]
lst = [(Integer
0, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
14), (Integer
1, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
16), (Integer
2, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
9), (Integer
3, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
17),
        (Integer
4, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
18), (Integer
5, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
1), (Integer
6, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
2), (Integer
7, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
3), (Integer
8, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
19),
          (Integer
9, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
20), (Integer
10, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
21), (Integer
11, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
4), (Integer
12, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
22),
           (Integer
13, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
23), (Integer
14, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
24), (Integer
15, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
5), (Integer
16, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
25),
            (Integer
17, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
26), (Integer
18, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
10), (Integer
19, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
11), (Integer
20, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
12),
             (Integer
21, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
6), (Integer
22, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
27), (Integer
23, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
0), (Integer
24, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
13),
              (Integer
25, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
28), (Integer
26, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
29), (Integer
27, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
7), (Integer
28, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
14),
                (Integer
29, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
30), (Integer
30, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
8), (Integer
31, Array Int Double -> Int -> Double
forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
31)] in
                  Int -> [Double] -> [Double]
forall a. Int -> [a] -> [a]
take Int
32 ([Double] -> [Double])
-> ([Integer] -> [Double]) -> [Integer] -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Double) -> [Integer] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> [(Integer, Double)] -> Integer -> Double
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Double
1.0 [(Integer, Double)]
lst) ([Integer] -> [Double]) -> [Integer] -> [Double]
forall a b. (a -> b) -> a -> b
$ [Integer
0..Integer
31]

maxLine :: String
maxLine :: String
maxLine = String
"max1 <- TRUE\n"

dirLine :: [String] -> String -> String
dirLine :: [String] -> String -> String
dirLine [String]
bss String
js = String
"dir1 <- c(\"<"  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String -> [String] -> String
forall (t :: * -> *) a. Foldable t => String -> t a -> String
g String
"<" [String]
bss  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
"\", \">"  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String -> [String] -> String
forall (t :: * -> *) a. Foldable t => String -> t a -> String
g String
">" ([String]
bss  [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend`  (Char -> String) -> String -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Char -> String -> String
forall a. a -> [a] -> [a]
:[]) String
js)  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
"\""  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  Int -> String
h0 Int
32  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  Int -> String
h Int
12  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
")" String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
  where g :: String -> t a -> String
g String
xs t a
ys = (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate (String
"\", \""  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
xs) ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [String]
forall a. Int -> a -> [a]
replicate (t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
ys) (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
"=")
        h :: Int -> String
h Int
n = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [String]
forall a. Int -> a -> [a]
replicate Int
n (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
", \">=\", \"<=\""
        h0 :: Int -> String
h0 Int
n = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [String]
forall a. Int -> a -> [a]
replicate Int
n (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
", \"<=\""

rhsLineG :: [Double] -> [Double] -> [Double] -> String
rhsLineG :: [Double] -> [Double] -> [Double] -> String
rhsLineG [Double]
zs [Double]
xs [Double]
ys = String
"rhs1 <- c("  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  [Double] -> String
forall a. RealFloat a => [a] -> String
f ([Double]
xs  [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend`  [Double]
ys  [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend`  [Double]
zs)  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
")" String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
  where f :: [a] -> String
f [a]
ts = (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
", " ([String] -> String) -> ([a] -> [String]) -> [a] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\a
t -> Maybe Int -> a -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing a
t String
"") ([a] -> String) -> [a] -> String
forall a b. (a -> b) -> a -> b
$ [a]
ts)

rhsLine :: [Double] -> [Double] -> String
rhsLine :: [Double] -> [Double] -> String
rhsLine = [Double] -> [Double] -> [Double] -> String
rhsLineG ([Double]
minDurations  [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend`  [Double]
maxDurations  [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend`  Int -> [Double]
constraintsR1 Int
12)

constraintsR1 :: Int -> [Double]
constraintsR1 :: Int -> [Double]
constraintsR1 Int
n = Int -> Double -> [Double]
forall a. Int -> a -> [a]
replicate (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
n) Double
0.0

minDurations :: [Double]
minDurations :: [Double]
minDurations = (Integer -> Double) -> [Integer] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> Double
forall a p. (Fractional p, Ord a, Num a) => a -> p
h [Integer
0..Integer
31]
  where h :: a -> p
h a
i = if a
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
23 then p
0.02 else p -> [(a, p)] -> a -> p
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' p
0.06 ([a] -> [p] -> [(a, p)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a
7,a
11,a
15,a
21,a
27,a
30] ([p] -> [(a, p)]) -> (p -> [p]) -> p -> [(a, p)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> p -> [p]
forall a. Int -> a -> [a]
replicate Int
6 (p -> [(a, p)]) -> p -> [(a, p)]
forall a b. (a -> b) -> a -> b
$ p
0.2) a
i

maxDurations :: [Double]
maxDurations :: [Double]
maxDurations = Int -> Double -> [Double]
forall a. Int -> a -> [a]
replicate Int
32 Double
0.3

-- | A variant of the more general 'answer2' where the randomization parameters are used to produce every time being run a new result (e. g. this
-- allows to model accents).
answer :: Array Int Double -> [String] -> [Double] -> [Double] -> String -> String
answer :: Array Int Double
-> [String] -> [Double] -> [Double] -> String -> String
answer = Double
-> Double
-> Double
-> Double
-> Array Int Double
-> [String]
-> [Double]
-> [Double]
-> String
-> String
answer2 (-Double
0.003) Double
0.003 (-Double
0.0012) Double
0.0012

answer2 :: Double -> Double -> Double -> Double -> Array Int Double -> [String] -> [Double] -> [Double] -> String -> String
answer2 :: Double
-> Double
-> Double
-> Double
-> Array Int Double
-> [String]
-> [Double]
-> [Double]
-> String
-> String
answer2 Double
min1 Double
max1 Double
min2 Double
max2 Array Int Double
lsts [String]
bss [Double]
xs [Double]
ys String
js = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"library(\"Rglpk\")",String
newLineEnding,Array Int Double -> String
objLine Array Int Double
lsts,[String] -> String -> Int -> String
matrixLine [String]
bss String
js ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
bss),[String] -> String -> String
dirLine [String]
bss String
js,
 [Double] -> [Double] -> String
rhsLine [Double]
xs [Double]
ys,String
maxLine,String
newLineEnding,String
"k <- Rglpk_solve_LP(obj = obj1, mat = mat1, dir = dir1, rhs = rhs1, max = max1)",String
newLineEnding,
  String
"y <- runif(32, min = ",Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing (-(Double -> Double
forall a. Num a => a -> a
abs Double
min1)) String
", max = ", Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing (Double -> Double
forall a. Num a => a -> a
abs Double
max1) String
")", String
newLineEnding,
   String
"if (k$status == 0){k$solution / mean(k$solution)} else {c()}", String
newLineEnding,
    String
"if (k$status == 0){z<- k$solution * 0.02 / k$solution[24] + y; z[24] <- 0.02 + runif(1, min = ", Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing (- (Double -> Double
forall a. Num a => a -> a
abs Double
min2)) String
", max = ",
     Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
forall a. Maybe a
Nothing (Double -> Double
forall a. Num a => a -> a
abs Double
max2) String
"); z;} else {c()}",String
newLineEnding,
      String
"if (k$status == 0){sprintf(\"uzpp2DurationN = X.getBFst\' (%.8f, VB.fromList [(UZ \'A\' D, %.8f), (UZ \'A\' K, %.8f), (UZ \'B\' D, %.8f), ",
       String
"(UZ \'B\' K, %.8f), (UZ \'C\' S, %.8f), (UZ \'D\' N, %.8f), (UZ \'E\' L, %.8f), (UZ \'E\' M, %.8f), (UZ \'F\' L, %.8f), (UZ \'F\' M, %.8f), ",
        String
"(UZ \'a\' W, %.8f), ",
          String
"(UZ \'b\' D, %.8f), (UZ \'b\' K, %.8f), (UZ \'c\' D, %.8f), (UZ \'d\' D, %.8f), (UZ \'d\' K, %.8f), (UZ \'e\' W, %.8f), (UZ \'f\' L, %.8f), ",
            String
"(UZ \'f\' M, %.8f), (UZ \'g\' D, %.8f), (UZ \'g\' K, %.8f), (UZ \'h\' D, %.8f), (UZ \'h\' K, %.8f), (UZ \'i\' W, %.8f), (UZ \'j\' D, %.8f),",
              String
" (UZ \'j\' K, %.8f), (UZ \'k\' L, %.8f), (UZ \'k\' M, %.8f), (UZ \'l\' S, %.8f), (UZ \'l\' O, %.8f), (UZ \'m\' S, %.8f), ",
                String
"(UZ \'m\' O, %.8f), (UZ \'n\' S, %.8f), (UZ \'n\' O, %.8f), (UZ \'o\' W, %.8f), (UZ \'p\' L, %.8f), (UZ \'p\' M, %.8f), ",
                  String
"(UZ \'q\' E, %.8f), (UZ \'r\' S, %.8f), (UZ \'r\' O, %.8f), (UZ \'s\' L, %.8f), (UZ \'t\' L, %.8f), (UZ \'t\' M, %.8f), ",
                    String
"(UZ \'u\' W, %.8f), (UZ \'v\' S, %.8f), (UZ \'v\' O, %.8f), (UZ \'w\' N, %.8f), (UZ \'x\' L, %.8f), (UZ \'x\' M, %.8f), ",
                      String
"(UZ \'y\' W, %.8f), (UZ \'z\' D, %.8f), (UZ \'z\' K, %.8f)])\",(z[6] + z[7]) / 2,z[1],z[1],z[2],z[2],z[3],z[26]+z[24],",
                        String
"z[4],z[4],z[5],z[5],z[8],z[9],z[9],z[10],z[11],z[11],z[12],z[13],z[13],z[14],z[14],z[15],z[15],z[16],z[17],z[17],z[18],",
                          String
"z[18],z[19],z[19],z[20],z[20],z[21],z[21],z[22],z[23],z[23],z[24],z[25],z[25],z[26],z[27],z[27],z[28],z[29],z[29],",
                            String
"z[10]+z[24],z[30],z[30],z[31],z[32],z[32])} else {print(\"", String
newLineEnding, String
"\")}"]

charReplace :: [Char] -> [Char]
charReplace :: String -> String
charReplace = (Char -> String) -> String -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> String
g
 where g :: Char -> String
g Char
x
        | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'0' = String
"Y"
        | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'w' = String
"cq"
        | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'D' = String
"sq"
        | Bool
otherwise = [Char
x]
{-# INLINE charReplace #-}

s8toChar :: Int8 -> Char
s8toChar :: Int8 -> Char
s8toChar = Char -> [(Int8, Char)] -> Int8 -> Char
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Char
' ' [(Int8
1,Char
'a'),(Int8
2,Char
'e'),(Int8
3,Char
'o'),(Int8
4,Char
'u'),(Int8
5,Char
'y'),(Int8
6,Char
'i'),(Int8
7,Char
'q'),(Int8
8,Char
'A'),(Int8
10,Char
'B'),(Int8
15,Char
'b'),(Int8
17,Char
'd'),
   (Int8
19,Char
'g'),(Int8
21,Char
'h'),(Int8
23,Char
'j'),(Int8
25,Char
'z'),(Int8
27,Char
'C'),(Int8
28,Char
'l'),(Int8
30,Char
'm'),(Int8
32,Char
'n'),(Int8
34,Char
'r'),(Int8
36,Char
'v'),(Int8
38,Char
'c'),(Int8
39,Char
'E'),(Int8
41,Char
'F'),
     (Int8
43,Char
'f'),(Int8
45,Char
'k'),(Int8
47,Char
'p'),(Int8
49,Char
's'),(Int8
50,Char
't'),(Int8
52,Char
'x'),(Int8
54,Char
'D'),(Int8
66,Char
'w')]
{-# INLINE s8toChar #-}