-- |
-- Module      :  Phladiprelio.RulesIntervals
-- Copyright   :  (c) Oleksandr Zhabenko 2020-2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- Additional statistic rules to choose the number of the intervals.

{-# LANGUAGE BangPatterns, NoImplicitPrelude #-}

module Phladiprelio.RulesIntervals where

import GHC.Base
import GHC.Num ((+))
import GHC.Float (logBase)
import Data.Lists.FLines (newLineEnding)
import GHC.Real (ceiling, even)
import GHC.Float (int2Float)
import Data.Maybe (fromMaybe)
import Data.List (filter, words)
import Text.Read (readMaybe)
import Text.Show (show)

sturgesH :: Int -> Int
sturgesH :: Int -> Int
sturgesH Int
n
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
0 forall a. Eq a => a -> a -> Bool
== Ordering
GT = forall a b. (RealFrac a, Integral b) => a -> b
ceiling (forall a. Floating a => a -> a -> a
logBase Float
2 (Int -> Float
int2Float Int
n))
  | Bool
otherwise = forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"Phladiprelio.RulesIntervals.sturgesH: undefined for the argument " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Int
n forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding
{-# INLINE sturgesH #-}

-- | According to @В. П. Левинський@ (V. P. Levynskyi) from @Опря А. Т. Статистика (модульний варіант з програмованою формою контролю знань).
-- Навч. посіб. --- К.: Центр учбової літератури, 2012. --- 448 с. ISBN 978-611-01-0266-7@) page 60. Always return odd values.
levynskyiMod :: Int -> Int
levynskyiMod :: Int -> Int
levynskyiMod Int
n
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
100 forall a. Eq a => a -> a -> Bool
== Ordering
LT = forall {a} {a}. (Ord a, Num a, Num a) => a -> a
g Int
n
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
200 forall a. Eq a => a -> a -> Bool
== Ordering
LT = Int
11
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
300 forall a. Eq a => a -> a -> Bool
== Ordering
LT = Int
13
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
400 forall a. Eq a => a -> a -> Bool
== Ordering
LT = Int
15
  | forall a. Ord a => a -> a -> Ordering
compare Int
n Int
500 forall a. Eq a => a -> a -> Bool
== Ordering
LT = Int
17
  | Bool
otherwise = let !k :: Int
k = Int -> Int
sturgesH Int
n in if forall a. Integral a => a -> Bool
even Int
k then Int
k forall a. Num a => a -> a -> a
+ Int
7 else Int
k forall a. Num a => a -> a -> a
+ Int
8
       where g :: a -> a
g a
n
              | forall a. Ord a => a -> a -> Ordering
compare a
n a
60 forall a. Eq a => a -> a -> Bool
== Ordering
GT = a
9
              | forall a. Ord a => a -> a -> Ordering
compare a
n a
40 forall a. Eq a => a -> a -> Bool
== Ordering
GT = a
7
              | forall a. Ord a => a -> a -> Ordering
compare a
n a
20 forall a. Eq a => a -> a -> Bool
== Ordering
GT = a
5
              | Bool
otherwise = a
3
{-# INLINABLE levynskyiMod #-}