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

-- |
-- Module      :  Phladiprelio.RGLPK.Ukrainian
-- Copyright   :  (c) OleksandrZhabenko 2020-2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@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 Phladiprelio.RGLPK.Ukrainian where

import GHC.Base
import GHC.List
import GHC.Num ((+),(-),(*),abs)
import Text.Read
import Text.Show (Show(..))
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)

createCoeffsObj :: Int -> [String] -> [Double]
createCoeffsObj :: Int -> [String] -> [Double]
createCoeffsObj Int
l [String]
xss
  | forall a. [a] -> Int
length [String]
xss forall a. Ord a => a -> a -> Bool
< Int
l = [String] -> [Double]
f ([String]
xss  forall a. Monoid a => a -> a -> a
`mappend`  forall a. Int -> a -> [a]
replicate (Int
l forall a. Num a => a -> a -> a
- forall a. [a] -> Int
length [String]
xss) String
"1.0")
  | Bool
otherwise = [String] -> [Double]
f (forall a. Int -> [a] -> [a]
take Int
l [String]
xss)
      where f :: [String] -> [Double]
f [String]
tss = forall a b. (a -> b) -> [a] -> [b]
map (\String
ts -> forall a. a -> Maybe a -> a
fromMaybe Double
1.0 (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
  | forall a. [a] -> Bool
null [String]
xss = []
  | Bool
otherwise = forall a b. (a -> b) -> [a] -> [b]
map (forall a. [a] -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (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  forall a. Monoid a => a -> a -> a
`mappend`  [Int]
rs  forall a. Monoid a => a -> a -> a
`mappend`  [Int]
rs)
  where l :: Int
l =  forall a. [a] -> Int
length String
js
        iX :: Int
iX = forall a. a -> Maybe a -> a
fromMaybe (-Int
l forall a. Num a => a -> a -> a
- Int
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (t :: * -> *) b.
(Eq a, Foldable t, Integral b) =>
a -> t a -> Maybe b
findIdx1 Char
x forall a b. (a -> b) -> a -> b
$ String
js
        rs :: [Int]
rs = if Int
iX forall a. Ord a => a -> a -> Bool
< Int
0 then [] else forall a. Int -> a -> [a]
replicate Int
iX Int
0  forall a. Monoid a => a -> a -> a
`mappend`  [Int
1]  forall a. Monoid a => a -> a -> a
`mappend`  forall a. Int -> a -> [a]
replicate (Int
l forall a. Num a => a -> a -> a
- Int
1 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
  | forall a. [a] -> Bool
null [String]
bss Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
<=Int
0 = []
  | Bool
otherwise = String
"mat1 <- matrix(c("  forall a. Monoid a => a -> a -> a
`mappend`  (forall a. [a] -> [[a]] -> [a]
intercalate String
", " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ (forall a b. (a -> [b]) -> [a] -> [b]
concatMap ([String] -> String -> Char -> [Int]
matrix1Column ([String]
bss  forall a. Monoid a => a -> a -> a
`mappend`  [String]
bss) String
js) String
js))  forall a. Monoid a => a -> a -> a
`mappend`  String
"), nrow = "  forall a. Monoid a => a -> a -> a
`mappend`  forall a. Show a => a -> String
show (Int
2 forall a. Num a => a -> a -> a
* Int
n forall a. Num a => a -> a -> a
+ Int
2 forall a. Num a => a -> a -> a
* forall a. [a] -> Int
length String
js forall a. Num a => a -> a -> a
+ Int
24)  forall a. Monoid a => a -> a -> a
`mappend`  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
 | forall i e. Array i e -> Int
numElements Array Int Double
v forall a. Ord a => a -> a -> Bool
>= Int
32 = String
"obj1 <- c("  forall a. Monoid a => a -> a -> a
`mappend`  (forall a. [a] -> [[a]] -> [a]
intercalate String
", " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (\Double
t -> forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing Double
t String
"") forall a b. (a -> b) -> a -> b
$ Array Int Double -> [Double]
objCoeffs Array Int Double
v)  forall a. Monoid a => a -> a -> a
`mappend`  String
")" forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
 | Bool
otherwise = forall a. HasCallStack => String -> a
error String
"Phladiprelio.RGLPK.Ukrainian.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, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
14), (Integer
1, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
16), (Integer
2, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
9), (Integer
3, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
17),
        (Integer
4, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
18), (Integer
5, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
1), (Integer
6, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
2), (Integer
7, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
3), (Integer
8, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
19),
          (Integer
9, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
20), (Integer
10, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
21), (Integer
11, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
4), (Integer
12, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
22),
           (Integer
13, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
23), (Integer
14, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
24), (Integer
15, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
5), (Integer
16, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
25),
            (Integer
17, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
26), (Integer
18, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
10), (Integer
19, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
11), (Integer
20, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
12),
             (Integer
21, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
6), (Integer
22, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
27), (Integer
23, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
0), (Integer
24, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
13),
              (Integer
25, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
28), (Integer
26, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
29), (Integer
27, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
7), (Integer
28, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
14),
                (Integer
29, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
30), (Integer
30, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
8), (Integer
31, forall i e. Array i e -> Int -> e
unsafeAt Array Int Double
arr Int
31)] in
                  forall a. Int -> [a] -> [a]
take Int
32 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Double
1.0 [(Integer, Double)]
lst) 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] -> ShowS
dirLine [String]
bss String
js = String
"dir1 <- c(\"<"  forall a. Monoid a => a -> a -> a
`mappend`  forall {a}. String -> [a] -> String
g String
"<" [String]
bss  forall a. Monoid a => a -> a -> a
`mappend`  String
"\", \">"  forall a. Monoid a => a -> a -> a
`mappend`  forall {a}. String -> [a] -> String
g String
">" ([String]
bss  forall a. Monoid a => a -> a -> a
`mappend`  forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> [a] -> [a]
:[]) String
js)  forall a. Monoid a => a -> a -> a
`mappend`  String
"\""  forall a. Monoid a => a -> a -> a
`mappend`  Int -> String
h0 Int
32  forall a. Monoid a => a -> a -> a
`mappend`  Int -> String
h Int
12  forall a. Monoid a => a -> a -> a
`mappend`  String
")" forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
  where g :: String -> [a] -> String
g String
xs [a]
ys = (forall a. [a] -> [[a]] -> [a]
intercalate (String
"\", \""  forall a. Monoid a => a -> a -> a
`mappend`  String
xs) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate (forall a. [a] -> Int
length [a]
ys) forall a b. (a -> b) -> a -> b
$ String
"=")
        h :: Int -> String
h Int
n = forall a. [[a]] -> [a]
concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate Int
n forall a b. (a -> b) -> a -> b
$ String
", \">=\", \"<=\""
        h0 :: Int -> String
h0 Int
n = forall a. [[a]] -> [a]
concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate Int
n 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("  forall a. Monoid a => a -> a -> a
`mappend`  forall {a}. RealFloat a => [a] -> String
f ([Double]
xs  forall a. Monoid a => a -> a -> a
`mappend`  [Double]
ys  forall a. Monoid a => a -> a -> a
`mappend`  [Double]
zs)  forall a. Monoid a => a -> a -> a
`mappend`  String
")" forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
  where f :: [a] -> String
f [a]
ts = (forall a. [a] -> [[a]] -> [a]
intercalate String
", " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (\a
t -> forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing a
t 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  forall a. Monoid a => a -> a -> a
`mappend`  [Double]
maxDurations  forall a. Monoid a => a -> a -> a
`mappend`  Int -> [Double]
constraintsR1 Int
12)

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

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

maxDurations :: [Double]
maxDurations :: [Double]
maxDurations = 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] -> ShowS
answer = Double
-> Double
-> Double
-> Double
-> Array Int Double
-> [String]
-> [Double]
-> [Double]
-> ShowS
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]
-> ShowS
answer2 Double
min1 Double
max1 Double
min2 Double
max2 Array Int Double
lsts [String]
bss [Double]
xs [Double]
ys String
js = 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 (forall a. [a] -> Int
length [String]
bss),[String] -> ShowS
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 = ",forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing (-(forall a. Num a => a -> a
abs Double
min1)) String
", max = ", forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing (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 = ", forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing (- (forall a. Num a => a -> a
abs Double
min2)) String
", max = ",
     forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat forall a. Maybe a
Nothing (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 :: ShowS
charReplace = forall a b. (a -> [b]) -> [a] -> [b]
concatMap Char -> String
g
 where g :: Char -> String
g Char
x
        | Char
x forall a. Eq a => a -> a -> Bool
== Char
'0' = String
"Y"
        | Char
x forall a. Eq a => a -> a -> Bool
== Char
'w' = String
"cq"
        | Char
x forall a. Eq a => a -> a -> Bool
== Char
'D' = String
"sq"
        | Bool
otherwise = [Char
x]
{-# INLINE charReplace #-}

s8toChar :: Int8 -> Char
s8toChar :: Int8 -> Char
s8toChar = 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 #-}