-- |
-- Module      :  Numeric.Wrapper.R.GLPK.Phonetics.Ukrainian.Durations
-- Copyright   :  (c) OleksandrZhabenko 2020
-- 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 \"ABCEFXYabcdefghijklmnopqrstuvwxyz\".
-- To get such js some of the Ukrainian words in the abovementioned file must contain an apostrophe and there should be
-- somewhat like \"їх_друг\".

{-# LANGUAGE CPP #-}

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 (getBFst')
import qualified Data.Vector as VB
import Numeric
import Data.List (intercalate)
#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) ((Char -> Bool) -> Vector Char -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
VB.findIndex (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x) (Vector Char -> Maybe Int)
-> (String -> Vector Char) -> String -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Vector Char
forall a. [a] -> Vector a
VB.fromList (String -> Maybe Int) -> String -> Maybe 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

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
5,-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
")\n"

objLine :: VB.Vector Double -> String
objLine :: Vector Double -> String
objLine Vector Double
v
 | Vector Double -> Int
forall a. Vector a -> Int
VB.length Vector 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
$ Vector Double -> [Double]
objCoeffs Vector Double
v)  String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend`  String
")\n"
 | 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. "

objCoeffs :: VB.Vector Double -> [Double]
objCoeffs :: Vector Double -> [Double]
objCoeffs Vector Double
v =
  let tuple :: (Double, Vector (Integer, Double))
tuple = (Double
1.0,[(Integer, Double)] -> Vector (Integer, Double)
forall a. [a] -> Vector a
VB.fromList [(Integer
0, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
14), (Integer
1, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
16), (Integer
2, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
9), (Integer
3, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
17),
        (Integer
4, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
18), (Integer
5, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
1), (Integer
6, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
2), (Integer
7, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
3), (Integer
8, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
19),
          (Integer
9, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
20), (Integer
10, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
21), (Integer
11, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
4), (Integer
12, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
22), (Integer
13, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
23),
            (Integer
14, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
24), (Integer
15, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
5), (Integer
16, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
25), (Integer
17, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
26), (Integer
18, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
10),
              (Integer
19, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
11), (Integer
20, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
12), (Integer
21, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
6), (Integer
22, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
27), (Integer
23, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
0),
                (Integer
24, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
13), (Integer
25, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
28), (Integer
26, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
29), (Integer
27, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
7), (Integer
28, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
14),
                  (Integer
29, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
30), (Integer
30, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
8), (Integer
31, Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
VB.unsafeIndex Vector Double
v Int
31)]) in
                     Vector Double -> [Double]
forall a. Vector a -> [a]
VB.toList (Vector Double -> [Double])
-> (Integer -> Vector Double) -> Integer -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Vector Double -> Vector Double
forall a. Int -> Vector a -> Vector a
VB.take Int
32 (Vector Double -> Vector Double)
-> (Integer -> Vector Double) -> Integer -> Vector Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Double) -> Vector Integer -> Vector Double
forall a b. (a -> b) -> Vector a -> Vector b
VB.map ((Double, Vector (Integer, Double)) -> Integer -> Double
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (Double, Vector (Integer, Double))
tuple) (Vector Integer -> Vector Double)
-> (Integer -> Vector Integer) -> Integer -> Vector Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
VB.enumFromTo Integer
0 (Integer -> [Double]) -> Integer -> [Double]
forall a b. (a -> b) -> a -> b
$ 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
")\n"
  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
")\n"
  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 = Vector Double -> [Double]
forall a. Vector a -> [a]
VB.toList Vector Double
v
  where v :: Vector Double
v = Int -> (Int -> Double) -> Vector Double
forall a. Int -> (Int -> a) -> Vector a
VB.generate Int
32 (\Int
i -> Int -> Double
forall a p. (Fractional p, Ord a, Num a) => a -> p
h Int
i)
        h :: a -> p
h a
i
          | a
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
23 = p
0.02
          | Bool
otherwise = (p, Vector (a, p)) -> a -> p
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (p
0.06,[(a, p)] -> Vector (a, p)
forall a. [a] -> Vector a
VB.fromList ([(a, p)] -> Vector (a, p))
-> ([p] -> [(a, p)]) -> [p] -> Vector (a, p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [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] -> Vector (a, p)) -> [p] -> Vector (a, p)
forall a b. (a -> b) -> a -> b
$ Int -> p -> [p]
forall a. Int -> a -> [a]
replicate Int
6 p
0.2) a
i

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

answer :: VB.Vector Double -> [String] -> [Double] -> [Double] -> String -> String
answer :: Vector Double
-> [String] -> [Double] -> [Double] -> String -> String
answer Vector Double
lsts [String]
bss [Double]
xs [Double]
ys String
js = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"library(\"Rglpk\")\n",Vector Double -> String
objLine Vector 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
"\nk <- Rglpk_solve_LP(obj = obj1, mat = mat1, dir = dir1, rhs = rhs1, max = max1)\ny <- runif(32, min = -0.012, max = 0.012)\nif (k$status == 0){k$solution / mean(k$solution)} else {c()}",
    String
"\nif (k$status == 0){z<- k$solution * 0.02 / k$solution[24] + y; z[24] <- 0.02 + runif(1, min = -0.003, max = 0.003); z} else {c()}\n"]

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
'-' = String
"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]