packages feed

phonetic-languages-rhythmicity-0.2.0.0: Languages/Rhythmicity.hs

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

-- |
-- Module      :  Languages.Rhythmicity
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Allows to evaluate (approximately, so better to say, to estimate) the
-- rhythmicity properties for the text (usually, the poetic one).

module Languages.Rhythmicity where

import GHC.Int

maxPosition2 :: (RealFrac a) => [a] -> a
maxPosition2 xs
 | null xs = 0.0
 | mx2 == 0.0 = 2.0 * abs (maxP21 xs 0)
 | abs mx2 == 1 = 1.6 * abs (maxP21 xs 0)
 | otherwise = abs (maxP21 xs 0 / mx2)
     where maxP21 (x:y:ys) !acc1 = maxP21 ys (if x < y then (acc1 + 1)::Int16 else (acc1 - 1)::Int16)
           maxP21 _ !acc1 = fromIntegral acc1
           maxP22 (x:y:ys) !acc1 = maxP22 (y:ys) (if x < y then (acc1 + 1)::Int16 else (acc1 - 1)::Int16)
           maxP22 _ !acc1 = fromIntegral acc1
           !mx2 = maxP22 xs (0::Int16)

posMaxIn3
  :: (Ord a) => a
  -> a
  -> a
  -> Int16
posMaxIn3 x y z 
 | x < y = if y < z then 3 else 2
 | x < z = 3
 | otherwise = 1

maxPosition3 :: RealFrac a => [a] -> a
maxPosition3 xs
  | null xs = 0.0
  | length xs `rem` 3 == 0 = 3.0 * fromIntegral (go (h xs) ((0, 0, 0)::(Int16,Int16,Int16)))
  | otherwise = fromIntegral (go (h xs) ((0, 0, 0)::(Int16,Int16,Int16)))
      where h (x:y:z:ys) = posMaxIn3 x y z:h ys
            h _ = []
            go (x:zs) (!acc21,!acc22,!acc23) = go zs (h1 x (acc21,acc22,acc23))
            go _ (!acc21,!acc22,!acc23)
              | acc21 > acc22 = if acc21 > acc23 then acc21 else acc23
              | acc22 > acc23 = acc22
              | otherwise = acc23
            h1 !x (!t,!u,!w)
              | x == 1 = (t + (1::Int16), u, w)
              | x == 2 = (t, u + (1::Int16), w)
              | otherwise = (t,u,w + (1::Int16))

evalRhythmicity23 :: (RealFrac a, Floating a) => [a] -> a
evalRhythmicity23 xs = maxPosition2 xs * maxPosition2 xs + maxPosition3 xs * maxPosition3 xs

evalRhythmicity23K
  :: (RealFrac a, Floating a) => a
  -> a
  -> [a]
  -> a
evalRhythmicity23K k2 k3 xs = k2 * maxPosition2 xs * maxPosition2 xs + k3 * maxPosition3 xs * maxPosition3 xs