module Sound.Sc3.Common.Math where
import qualified Data.Fixed
import Data.Maybe
import Data.Ratio
import qualified Numeric
import qualified Sound.Sc3.Common.Base as Common.Base
half_pi :: Floating a => a
half_pi :: forall a. Floating a => a
half_pi = forall a. Floating a => a
pi forall a. Fractional a => a -> a -> a
/ a
2
two_pi :: Floating n => n
two_pi :: forall a. Floating a => a
two_pi = n
2 forall a. Num a => a -> a -> a
* forall a. Floating a => a
pi
absdif :: Num a => a -> a -> a
absdif :: forall a. Num a => a -> a -> a
absdif a
i a
j = forall a. Num a => a -> a
abs (a
j forall a. Num a => a -> a -> a
- a
i)
type SC3_MulAdd t = t -> t -> t -> t
sc3_mul_add :: Num t => SC3_MulAdd t
sc3_mul_add :: forall t. Num t => SC3_MulAdd t
sc3_mul_add t
i t
m t
a = t
i forall a. Num a => a -> a -> a
* t
m forall a. Num a => a -> a -> a
+ t
a
mul_add :: Num t => t -> t -> t -> t
mul_add :: forall t. Num t => SC3_MulAdd t
mul_add t
m t
a = (forall a. Num a => a -> a -> a
+ t
a) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
* t
m)
mul_add_hs :: Num t => (t,t) -> t -> t
mul_add_hs :: forall t. Num t => (t, t) -> t -> t
mul_add_hs = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall t. Num t => SC3_MulAdd t
mul_add
sc3_truncate :: RealFrac a => a -> a
sc3_truncate :: forall a. RealFrac a => a -> a
sc3_truncate = forall a. Num a => Integer -> a
fromInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
truncate
sc3_round :: RealFrac a => a -> a
sc3_round :: forall a. RealFrac a => a -> a
sc3_round = forall a. Num a => Integer -> a
fromInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
round
sc3_ceiling :: RealFrac a => a -> a
sc3_ceiling :: forall a. RealFrac a => a -> a
sc3_ceiling = forall a. Num a => Integer -> a
fromInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
ceiling
sc3_floor :: RealFrac a => a -> a
sc3_floor :: forall a. RealFrac a => a -> a
sc3_floor = forall a. Num a => Integer -> a
fromInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
floor
sc3_round_to :: RealFrac n => n -> n -> n
sc3_round_to :: forall n. RealFrac n => n -> n -> n
sc3_round_to n
a n
b = if n
b forall a. Eq a => a -> a -> Bool
== n
0 then n
a else forall a. RealFrac a => a -> a
sc3_floor ((n
a forall a. Fractional a => a -> a -> a
/ n
b) forall a. Num a => a -> a -> a
+ n
0.5) forall a. Num a => a -> a -> a
* n
b
sc3_idiv :: RealFrac n => n -> n -> n
sc3_idiv :: forall n. RealFrac n => n -> n -> n
sc3_idiv n
a n
b = forall a. Num a => Integer -> a
fromInteger (forall a b. (RealFrac a, Integral b) => a -> b
floor n
a forall a. Integral a => a -> a -> a
`div` forall a b. (RealFrac a, Integral b) => a -> b
floor n
b)
sc3_lcm :: t -> t -> t
sc3_lcm :: forall t. t -> t -> t
sc3_lcm = forall a. HasCallStack => [Char] -> a
error [Char]
"sc3_lcm: undefined"
sc3_gcd :: t -> t -> t
sc3_gcd :: forall t. t -> t -> t
sc3_gcd = forall a. HasCallStack => [Char] -> a
error [Char]
"sc3_gcd: undefined"
sc3_mod :: RealFrac n => n -> n -> n
sc3_mod :: forall n. RealFrac n => n -> n -> n
sc3_mod = forall a. Real a => a -> a -> a
Data.Fixed.mod'
fmod_f32 :: Float -> Float -> Float
fmod_f32 :: Float -> Float -> Float
fmod_f32 = forall n. RealFrac n => n -> n -> n
sc3_mod
fmod_f64 :: Double -> Double -> Double
fmod_f64 :: Double -> Double -> Double
fmod_f64 = forall n. RealFrac n => n -> n -> n
sc3_mod
sc3_clip :: Ord a => a -> a -> a -> a
sc3_clip :: forall a. Ord a => a -> a -> a -> a
sc3_clip a
n a
i a
j = if a
n forall a. Ord a => a -> a -> Bool
< a
i then a
i else if a
n forall a. Ord a => a -> a -> Bool
> a
j then a
j else a
n
clip_hs :: (Ord a) => (a,a) -> a -> a
clip_hs :: forall a. Ord a => (a, a) -> a -> a
clip_hs (a
i,a
j) a
n = forall a. Ord a => a -> a -> a -> a
sc3_clip a
n a
i a
j
sc3_mod_alt :: RealFrac a => a -> a -> a
sc3_mod_alt :: forall n. RealFrac n => n -> n -> n
sc3_mod_alt a
n a
hi =
let lo :: a
lo = a
0.0
in if a
n forall a. Ord a => a -> a -> Bool
>= a
lo Bool -> Bool -> Bool
&& a
n forall a. Ord a => a -> a -> Bool
< a
hi
then a
n
else if a
hi forall a. Eq a => a -> a -> Bool
== a
lo
then a
lo
else a
n forall a. Num a => a -> a -> a
- a
hi forall a. Num a => a -> a -> a
* forall a. RealFrac a => a -> a
sc3_floor (a
n forall a. Fractional a => a -> a -> a
/ a
hi)
sc3_wrap_ni :: RealFrac a => a -> a -> a -> a
sc3_wrap_ni :: forall a. RealFrac a => a -> a -> a -> a
sc3_wrap_ni a
lo a
hi a
n = forall n. RealFrac n => n -> n -> n
sc3_mod (a
n forall a. Num a => a -> a -> a
- a
lo) (a
hi forall a. Num a => a -> a -> a
- a
lo) forall a. Num a => a -> a -> a
+ a
lo
wrap_hs_int :: Integral a => (a, a) -> a -> a
wrap_hs_int :: forall a. Integral a => (a, a) -> a -> a
wrap_hs_int (a
i,a
j) a
n = ((a
n forall a. Num a => a -> a -> a
- a
i) forall a. Integral a => a -> a -> a
`mod` (a
j forall a. Num a => a -> a -> a
- a
i forall a. Num a => a -> a -> a
+ a
1)) forall a. Num a => a -> a -> a
+ a
i
wrap_hs :: RealFrac n => (n,n) -> n -> n
wrap_hs :: forall n. RealFrac n => (n, n) -> n -> n
wrap_hs (n
i,n
j) n
n =
let r :: n
r = n
j forall a. Num a => a -> a -> a
- n
i
n' :: n
n' = if n
n forall a. Ord a => a -> a -> Bool
>= n
j then n
n forall a. Num a => a -> a -> a
- n
r else if n
n forall a. Ord a => a -> a -> Bool
< n
i then n
n forall a. Num a => a -> a -> a
+ n
r else n
n
in if n
n' forall a. Ord a => a -> a -> Bool
>= n
i Bool -> Bool -> Bool
&& n
n' forall a. Ord a => a -> a -> Bool
< n
j
then n
n'
else n
n' forall a. Num a => a -> a -> a
- n
r forall a. Num a => a -> a -> a
* forall a. RealFrac a => a -> a
sc3_floor ((n
n' forall a. Num a => a -> a -> a
- n
i) forall a. Fractional a => a -> a -> a
/ n
r)
sc3_wrap :: RealFrac n => n -> n -> n -> n
sc3_wrap :: forall a. RealFrac a => a -> a -> a -> a
sc3_wrap n
a n
b n
c = forall n. RealFrac n => (n, n) -> n -> n
wrap_hs (n
b,n
c) n
a
generic_wrap :: (Ord a, Num a) => (a,a) -> a -> a
generic_wrap :: forall a. (Ord a, Num a) => (a, a) -> a -> a
generic_wrap (a
l,a
r) a
n =
let d :: a
d = a
r forall a. Num a => a -> a -> a
- a
l forall a. Num a => a -> a -> a
+ a
1
f :: a -> a
f = forall a. (Ord a, Num a) => (a, a) -> a -> a
generic_wrap (a
l,a
r)
in if a
n forall a. Ord a => a -> a -> Bool
< a
l
then a -> a
f (a
n forall a. Num a => a -> a -> a
+ a
d)
else if a
n forall a. Ord a => a -> a -> Bool
> a
r then a -> a
f (a
n forall a. Num a => a -> a -> a
- a
d) else a
n
bin_to_freq :: (Fractional n, Integral i) => n -> i -> i -> n
bin_to_freq :: forall n i. (Fractional n, Integral i) => n -> i -> i -> n
bin_to_freq n
sr i
n i
i = forall a b. (Integral a, Num b) => a -> b
fromIntegral i
i forall a. Num a => a -> a -> a
* n
sr forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral i
n
midi_to_cps :: Floating a => a -> a
midi_to_cps :: forall a. Floating a => a -> a
midi_to_cps a
i = a
440.0 forall a. Num a => a -> a -> a
* (a
2.0 forall a. Floating a => a -> a -> a
** ((a
i forall a. Num a => a -> a -> a
- a
69.0) forall a. Num a => a -> a -> a
* (a
1.0 forall a. Fractional a => a -> a -> a
/ a
12.0)))
cps_to_midi :: Floating a => a -> a
cps_to_midi :: forall a. Floating a => a -> a
cps_to_midi a
a = (forall a. Floating a => a -> a -> a
logBase a
2 (a
a forall a. Num a => a -> a -> a
* (a
1.0 forall a. Fractional a => a -> a -> a
/ a
440.0)) forall a. Num a => a -> a -> a
* a
12.0) forall a. Num a => a -> a -> a
+ a
69.0
cps_to_oct :: Floating a => a -> a
cps_to_oct :: forall a. Floating a => a -> a
cps_to_oct a
a = forall a. Floating a => a -> a -> a
logBase a
2 (a
a forall a. Num a => a -> a -> a
* (a
1.0 forall a. Fractional a => a -> a -> a
/ a
440.0)) forall a. Num a => a -> a -> a
+ a
4.75
oct_to_cps :: Floating a => a -> a
oct_to_cps :: forall a. Floating a => a -> a
oct_to_cps a
a = a
440.0 forall a. Num a => a -> a -> a
* (a
2.0 forall a. Floating a => a -> a -> a
** (a
a forall a. Num a => a -> a -> a
- a
4.75))
degree_to_key :: RealFrac a => [a] -> a -> a -> a
degree_to_key :: forall a. RealFrac a => [a] -> a -> a -> a
degree_to_key [a]
s a
n a
d =
let l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s
d' :: Int
d' = forall a b. (RealFrac a, Integral b) => a -> b
round a
d
a :: a
a = (a
d forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
d') forall a. Num a => a -> a -> a
* a
10.0 forall a. Num a => a -> a -> a
* (a
n forall a. Fractional a => a -> a -> a
/ a
12.0)
in (a
n forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
d' forall a. Integral a => a -> a -> a
`div` Int
l)) forall a. Num a => a -> a -> a
+ forall t. [Char] -> [t] -> Int -> t
Common.Base.at_with_error_message [Char]
"degree_to_key" [a]
s (Int
d' forall a. Integral a => a -> a -> a
`mod` Int
l) forall a. Num a => a -> a -> a
+ a
a
pianokey_to_midi :: Num n => n -> n
pianokey_to_midi :: forall a. Num a => a -> a
pianokey_to_midi = forall a. Num a => a -> a -> a
(+) n
20
pianokey_to_cps :: Floating n => n -> n
pianokey_to_cps :: forall a. Floating a => a -> a
pianokey_to_cps = forall a. Floating a => a -> a
midi_to_cps forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => a -> a
pianokey_to_midi
amp_to_db :: Floating a => a -> a
amp_to_db :: forall a. Floating a => a -> a
amp_to_db = (forall a. Num a => a -> a -> a
* a
20) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Floating a => a -> a -> a
logBase a
10
db_to_amp :: Floating a => a -> a
db_to_amp :: forall a. Floating a => a -> a
db_to_amp = (a
10 forall a. Floating a => a -> a -> a
**) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
* a
0.05)
midi_to_ratio :: Floating a => a -> a
midi_to_ratio :: forall a. Floating a => a -> a
midi_to_ratio a
a = a
2.0 forall a. Floating a => a -> a -> a
** (a
a forall a. Num a => a -> a -> a
* (a
1.0 forall a. Fractional a => a -> a -> a
/ a
12.0))
ratio_to_midi :: Floating a => a -> a
ratio_to_midi :: forall a. Floating a => a -> a
ratio_to_midi a
a = a
12.0 forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a -> a
logBase a
2 a
a
cps_to_incr :: Fractional a => a -> a -> a -> a
cps_to_incr :: forall a. Fractional a => a -> a -> a -> a
cps_to_incr a
sr a
r a
cps = (a
r forall a. Fractional a => a -> a -> a
/ a
sr) forall a. Num a => a -> a -> a
* a
cps
incr_to_cps :: Fractional a => a -> a -> a -> a
incr_to_cps :: forall a. Fractional a => a -> a -> a -> a
incr_to_cps a
sr a
r a
ic = a
ic forall a. Fractional a => a -> a -> a
/ (a
r forall a. Fractional a => a -> a -> a
/ a
sr)
pan2_f :: Fractional t => (t -> t) -> t -> t -> (t, t)
pan2_f :: forall t. Fractional t => (t -> t) -> t -> t -> (t, t)
pan2_f t -> t
f t
p t
q =
let q' :: t
q' = (t
q forall a. Fractional a => a -> a -> a
/ t
2) forall a. Num a => a -> a -> a
+ t
0.5
in (t
p forall a. Num a => a -> a -> a
* t -> t
f (t
1 forall a. Num a => a -> a -> a
- t
q'),t
p forall a. Num a => a -> a -> a
* t -> t
f t
q')
lin_pan2 :: Fractional t => t -> t -> (t, t)
lin_pan2 :: forall t. Fractional t => t -> t -> (t, t)
lin_pan2 = forall t. Fractional t => (t -> t) -> t -> t -> (t, t)
pan2_f forall a. a -> a
id
eq_pan2 :: Floating t => t -> t -> (t, t)
eq_pan2 :: forall t. Floating t => t -> t -> (t, t)
eq_pan2 = forall t. Fractional t => (t -> t) -> t -> t -> (t, t)
pan2_f forall a. Floating a => a -> a
sqrt
sc3_properFraction :: RealFrac t => t -> (t,t)
sc3_properFraction :: forall t. RealFrac t => t -> (t, t)
sc3_properFraction t
a =
let (Integer
p,t
q) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction t
a
in (forall a. Num a => Integer -> a
fromInteger Integer
p,t
q)
sc3_dif_sqr :: Num a => a -> a -> a
sc3_dif_sqr :: forall a. Num a => a -> a -> a
sc3_dif_sqr a
a a
b = (a
a forall a. Num a => a -> a -> a
* a
a) forall a. Num a => a -> a -> a
- (a
b forall a. Num a => a -> a -> a
* a
b)
sc3_hypot :: Floating a => a -> a -> a
sc3_hypot :: forall a. Floating a => a -> a -> a
sc3_hypot a
x a
y = forall a. Floating a => a -> a
sqrt (a
x forall a. Num a => a -> a -> a
* a
x forall a. Num a => a -> a -> a
+ a
y forall a. Num a => a -> a -> a
* a
y)
sc3_hypotx :: (Ord a, Floating a) => a -> a -> a
sc3_hypotx :: forall a. (Ord a, Floating a) => a -> a -> a
sc3_hypotx a
x a
y = forall a. Num a => a -> a
abs a
x forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
abs a
y forall a. Num a => a -> a -> a
- ((forall a. Floating a => a -> a
sqrt a
2 forall a. Num a => a -> a -> a
- a
1) forall a. Num a => a -> a -> a
* forall a. Ord a => a -> a -> a
min (forall a. Num a => a -> a
abs a
x) (forall a. Num a => a -> a
abs a
y))
foldToRange :: (Ord a,Num a) => a -> a -> a -> a
foldToRange :: forall a. (Ord a, Num a) => a -> a -> a -> a
foldToRange a
i a
j =
let f :: a -> a
f a
n = if a
n forall a. Ord a => a -> a -> Bool
> a
j
then a -> a
f (a
j forall a. Num a => a -> a -> a
- (a
n forall a. Num a => a -> a -> a
- a
j))
else if a
n forall a. Ord a => a -> a -> Bool
< a
i
then a -> a
f (a
i forall a. Num a => a -> a -> a
- (a
n forall a. Num a => a -> a -> a
- a
i))
else a
n
in a -> a
f
sc3_fold :: (Ord a,Num a) => a -> a -> a -> a
sc3_fold :: forall a. (Ord a, Num a) => a -> a -> a -> a
sc3_fold a
n a
i a
j = forall a. (Ord a, Num a) => a -> a -> a -> a
foldToRange a
i a
j a
n
sc3_distort :: Fractional n => n -> n
sc3_distort :: forall n. Fractional n => n -> n
sc3_distort n
x = n
x forall a. Fractional a => a -> a -> a
/ (n
1 forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
abs n
x)
sc3_softclip :: (Ord n, Fractional n) => n -> n
sc3_softclip :: forall n. (Ord n, Fractional n) => n -> n
sc3_softclip n
x = let x' :: n
x' = forall a. Num a => a -> a
abs n
x in if n
x' forall a. Ord a => a -> a -> Bool
<= n
0.5 then n
x else (n
x' forall a. Num a => a -> a -> a
- n
0.25) forall a. Fractional a => a -> a -> a
/ n
x
sc3_true :: Num n => n
sc3_true :: forall n. Num n => n
sc3_true = n
1
sc3_false :: Num n => n
sc3_false :: forall n. Num n => n
sc3_false = n
0
sc3_not :: (Ord n,Num n) => n -> n
sc3_not :: forall n. (Ord n, Num n) => n -> n
sc3_not = forall n. Num n => Bool -> n
sc3_bool forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Ord a => a -> a -> Bool
<= n
0)
sc3_bool :: Num n => Bool -> n
sc3_bool :: forall n. Num n => Bool -> n
sc3_bool Bool
b = if Bool
b then forall n. Num n => n
sc3_true else forall n. Num n => n
sc3_false
sc3_comparison :: Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison :: forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison n -> n -> Bool
f n
p n
q = forall n. Num n => Bool -> n
sc3_bool (n -> n -> Bool
f n
p n
q)
sc3_eq :: (Num n, Eq n) => n -> n -> n
sc3_eq :: forall n. (Num n, Eq n) => n -> n -> n
sc3_eq = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Eq a => a -> a -> Bool
(==)
sc3_neq :: (Num n, Eq n) => n -> n -> n
sc3_neq :: forall n. (Num n, Eq n) => n -> n -> n
sc3_neq = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Eq a => a -> a -> Bool
(/=)
sc3_lt :: (Num n, Ord n) => n -> n -> n
sc3_lt :: forall n. (Num n, Ord n) => n -> n -> n
sc3_lt = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Ord a => a -> a -> Bool
(<)
sc3_lte :: (Num n, Ord n) => n -> n -> n
sc3_lte :: forall n. (Num n, Ord n) => n -> n -> n
sc3_lte = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Ord a => a -> a -> Bool
(<=)
sc3_gt :: (Num n, Ord n) => n -> n -> n
sc3_gt :: forall n. (Num n, Ord n) => n -> n -> n
sc3_gt = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Ord a => a -> a -> Bool
(>)
sc3_gte :: (Num n, Ord n) => n -> n -> n
sc3_gte :: forall n. (Num n, Ord n) => n -> n -> n
sc3_gte = forall n. Num n => (n -> n -> Bool) -> n -> n -> n
sc3_comparison forall a. Ord a => a -> a -> Bool
(>=)
data Clip_Rule = Clip_None | Clip_Left | Clip_Right | Clip_Both
deriving (Int -> Clip_Rule
Clip_Rule -> Int
Clip_Rule -> [Clip_Rule]
Clip_Rule -> Clip_Rule
Clip_Rule -> Clip_Rule -> [Clip_Rule]
Clip_Rule -> Clip_Rule -> Clip_Rule -> [Clip_Rule]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Clip_Rule -> Clip_Rule -> Clip_Rule -> [Clip_Rule]
$cenumFromThenTo :: Clip_Rule -> Clip_Rule -> Clip_Rule -> [Clip_Rule]
enumFromTo :: Clip_Rule -> Clip_Rule -> [Clip_Rule]
$cenumFromTo :: Clip_Rule -> Clip_Rule -> [Clip_Rule]
enumFromThen :: Clip_Rule -> Clip_Rule -> [Clip_Rule]
$cenumFromThen :: Clip_Rule -> Clip_Rule -> [Clip_Rule]
enumFrom :: Clip_Rule -> [Clip_Rule]
$cenumFrom :: Clip_Rule -> [Clip_Rule]
fromEnum :: Clip_Rule -> Int
$cfromEnum :: Clip_Rule -> Int
toEnum :: Int -> Clip_Rule
$ctoEnum :: Int -> Clip_Rule
pred :: Clip_Rule -> Clip_Rule
$cpred :: Clip_Rule -> Clip_Rule
succ :: Clip_Rule -> Clip_Rule
$csucc :: Clip_Rule -> Clip_Rule
Enum,Clip_Rule
forall a. a -> a -> Bounded a
maxBound :: Clip_Rule
$cmaxBound :: Clip_Rule
minBound :: Clip_Rule
$cminBound :: Clip_Rule
Bounded)
apply_clip_rule :: Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule :: forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
clip_rule n
sl n
sr n
dl n
dr n
x =
case Clip_Rule
clip_rule of
Clip_Rule
Clip_None -> forall a. Maybe a
Nothing
Clip_Rule
Clip_Left -> if n
x forall a. Ord a => a -> a -> Bool
<= n
sl then forall a. a -> Maybe a
Just n
dl else forall a. Maybe a
Nothing
Clip_Rule
Clip_Right -> if n
x forall a. Ord a => a -> a -> Bool
>= n
sr then forall a. a -> Maybe a
Just n
dr else forall a. Maybe a
Nothing
Clip_Rule
Clip_Both -> if n
x forall a. Ord a => a -> a -> Bool
<= n
sl then forall a. a -> Maybe a
Just n
dl else if n
x forall a. Ord a => a -> a -> Bool
>= n
sr then forall a. a -> Maybe a
Just n
dr else forall a. Maybe a
Nothing
urange_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a
urange_ma :: forall a. Fractional a => SC3_MulAdd a -> SC3_MulAdd a
urange_ma SC3_MulAdd a
mul_add_f a
l a
r a
i = SC3_MulAdd a
mul_add_f a
i (a
r forall a. Num a => a -> a -> a
- a
l) a
l
urange :: Fractional a => a -> a -> a -> a
urange :: forall a. Fractional a => a -> a -> a -> a
urange = forall a. Fractional a => SC3_MulAdd a -> SC3_MulAdd a
urange_ma forall t. Num t => SC3_MulAdd t
sc3_mul_add
range_muladd :: Fractional t => t -> t -> (t,t)
range_muladd :: forall t. Fractional t => t -> t -> (t, t)
range_muladd = forall t. Fractional t => t -> t -> t -> t -> (t, t)
linlin_muladd (-t
1) t
1
range_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a
range_ma :: forall a. Fractional a => SC3_MulAdd a -> SC3_MulAdd a
range_ma SC3_MulAdd a
mul_add_f a
l a
r a
i =
let (a
m,a
a) = forall t. Fractional t => t -> t -> (t, t)
range_muladd a
l a
r
in SC3_MulAdd a
mul_add_f a
i a
m a
a
range :: Fractional a => a -> a -> a -> a
range :: forall a. Fractional a => a -> a -> a -> a
range = forall a. Fractional a => SC3_MulAdd a -> SC3_MulAdd a
range_ma forall t. Num t => SC3_MulAdd t
sc3_mul_add
range_hs :: Fractional a => (a,a) -> a -> a
range_hs :: forall a. Fractional a => (a, a) -> a -> a
range_hs = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Fractional a => a -> a -> a -> a
range
in_range :: Fractional a => a -> (a,a) -> a
in_range :: forall a. Fractional a => a -> (a, a) -> a
in_range = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. Fractional a => (a, a) -> a -> a
range_hs
linlin_muladd :: Fractional t => t -> t -> t -> t -> (t,t)
linlin_muladd :: forall t. Fractional t => t -> t -> t -> t -> (t, t)
linlin_muladd t
sl t
sr t
dl t
dr =
let m :: t
m = (t
dr forall a. Num a => a -> a -> a
- t
dl) forall a. Fractional a => a -> a -> a
/ (t
sr forall a. Num a => a -> a -> a
- t
sl)
a :: t
a = t
dl forall a. Num a => a -> a -> a
- (t
m forall a. Num a => a -> a -> a
* t
sl)
in (t
m,t
a)
linlin_ma :: Fractional a => SC3_MulAdd a -> a -> a -> a -> a -> a -> a
linlin_ma :: forall a. Fractional a => SC3_MulAdd a -> a -> a -> SC3_MulAdd a
linlin_ma SC3_MulAdd a
mul_add_f a
i a
sl a
sr a
dl a
dr =
let (a
m,a
a) = forall t. Fractional t => t -> t -> t -> t -> (t, t)
linlin_muladd a
sl a
sr a
dl a
dr
in SC3_MulAdd a
mul_add_f a
i a
m a
a
linlin_hs :: Fractional a => (a, a) -> (a, a) -> a -> a
linlin_hs :: forall a. Fractional a => (a, a) -> (a, a) -> a -> a
linlin_hs (a
sl,a
sr) (a
dl,a
dr) = let (a
m,a
a) = forall t. Fractional t => t -> t -> t -> t -> (t, t)
linlin_muladd a
sl a
sr a
dl a
dr in (forall a. Num a => a -> a -> a
+ a
a) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
* a
m)
sc3_linlin :: Fractional a => a -> a -> a -> a -> a -> a
sc3_linlin :: forall a. Fractional a => a -> a -> a -> a -> a -> a
sc3_linlin a
i a
sl a
sr a
dl a
dr = forall a. Fractional a => (a, a) -> (a, a) -> a -> a
linlin_hs (a
sl,a
sr) (a
dl,a
dr) a
i
linlin_enum_plain :: (Enum t,Enum u) => t -> u -> t -> u
linlin_enum_plain :: forall t u. (Enum t, Enum u) => t -> u -> t -> u
linlin_enum_plain t
src u
dst t
n = forall a. Enum a => Int -> a
toEnum (forall a. Enum a => a -> Int
fromEnum u
dst forall a. Num a => a -> a -> a
+ (forall a. Enum a => a -> Int
fromEnum t
n forall a. Num a => a -> a -> a
- forall a. Enum a => a -> Int
fromEnum t
src))
linlin_enum :: (Enum t,Enum u) => (t,t) -> (u,u) -> t -> Maybe u
linlin_enum :: forall t u. (Enum t, Enum u) => (t, t) -> (u, u) -> t -> Maybe u
linlin_enum (t
l,t
r) (u
l',u
r') t
n =
if forall a. Enum a => a -> Int
fromEnum t
n forall a. Ord a => a -> a -> Bool
>= forall a. Enum a => a -> Int
fromEnum t
l Bool -> Bool -> Bool
&& forall a. Enum a => a -> Int
fromEnum t
r forall a. Num a => a -> a -> a
- forall a. Enum a => a -> Int
fromEnum t
l forall a. Eq a => a -> a -> Bool
== forall a. Enum a => a -> Int
fromEnum u
r' forall a. Num a => a -> a -> a
- forall a. Enum a => a -> Int
fromEnum u
l'
then forall a. a -> Maybe a
Just (forall t u. (Enum t, Enum u) => t -> u -> t -> u
linlin_enum_plain t
l u
l' t
n)
else forall a. Maybe a
Nothing
linlin_enum_err :: (Enum t,Enum u) => (t,t) -> (u,u) -> t -> u
linlin_enum_err :: forall t u. (Enum t, Enum u) => (t, t) -> (u, u) -> t -> u
linlin_enum_err (t, t)
src (u, u)
dst = forall a. a -> Maybe a -> a
fromMaybe (forall a. HasCallStack => [Char] -> a
error [Char]
"linlin_enum") forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t u. (Enum t, Enum u) => (t, t) -> (u, u) -> t -> Maybe u
linlin_enum (t, t)
src (u, u)
dst
linlin_eq :: (Eq a, Num a) => (a,a) -> (a,a) -> a -> Maybe a
linlin_eq :: forall a. (Eq a, Num a) => (a, a) -> (a, a) -> a -> Maybe a
linlin_eq (a
l,a
r) (a
l',a
r') a
n =
let d :: a
d = a
r forall a. Num a => a -> a -> a
- a
l
d' :: a
d' = a
r' forall a. Num a => a -> a -> a
- a
l'
in if a
d forall a. Eq a => a -> a -> Bool
== a
d' then forall a. a -> Maybe a
Just (a
l' forall a. Num a => a -> a -> a
+ (a
n forall a. Num a => a -> a -> a
- a
l)) else forall a. Maybe a
Nothing
linlin_eq_err :: (Eq a,Num a) => (a,a) -> (a,a) -> a -> a
linlin_eq_err :: forall a. (Eq a, Num a) => (a, a) -> (a, a) -> a -> a
linlin_eq_err (a, a)
src (a, a)
dst = forall a. a -> Maybe a -> a
fromMaybe (forall a. HasCallStack => [Char] -> a
error [Char]
"linlin_eq") forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Eq a, Num a) => (a, a) -> (a, a) -> a -> Maybe a
linlin_eq (a, a)
src (a, a)
dst
linexp_hs :: Floating a => (a,a) -> (a,a) -> a -> a
linexp_hs :: forall a. Floating a => (a, a) -> (a, a) -> a -> a
linexp_hs (a
in_l,a
in_r) (a
out_l,a
out_r) a
x =
let rt :: a
rt = a
out_r forall a. Fractional a => a -> a -> a
/ a
out_l
rn :: a
rn = a
1.0 forall a. Fractional a => a -> a -> a
/ (a
in_r forall a. Num a => a -> a -> a
- a
in_l)
rr :: a
rr = a
rn forall a. Num a => a -> a -> a
* forall a. Num a => a -> a
negate a
in_l
in a
out_l forall a. Num a => a -> a -> a
* (a
rt forall a. Floating a => a -> a -> a
** (a
x forall a. Num a => a -> a -> a
* a
rn forall a. Num a => a -> a -> a
+ a
rr))
lin_exp :: Floating a => a -> a -> a -> a -> a -> a
lin_exp :: forall a. Floating a => a -> a -> a -> a -> a -> a
lin_exp a
x a
in_l a
in_r a
out_l a
out_r = forall a. Floating a => (a, a) -> (a, a) -> a -> a
linexp_hs (a
in_l,a
in_r) (a
out_l,a
out_r) a
x
sc3_linexp :: (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_linexp :: forall a. (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_linexp a
src_l a
src_r a
dst_l a
dst_r a
x =
case forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
Clip_Both a
src_l a
src_r a
dst_l a
dst_r a
x of
Just a
r -> a
r
Maybe a
Nothing -> ((a
dst_r forall a. Fractional a => a -> a -> a
/ a
dst_l) forall a. Floating a => a -> a -> a
** ((a
x forall a. Num a => a -> a -> a
- a
src_l) forall a. Fractional a => a -> a -> a
/ (a
src_r forall a. Num a => a -> a -> a
- a
src_l))) forall a. Num a => a -> a -> a
* a
dst_l
sc3_explin :: (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_explin :: forall a. (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_explin a
src_l a
src_r a
dst_l a
dst_r a
x =
forall a. a -> Maybe a -> a
fromMaybe
(forall a. Floating a => a -> a -> a
logBase (a
src_r forall a. Fractional a => a -> a -> a
/ a
src_l) (a
x forall a. Fractional a => a -> a -> a
/ a
src_l) forall a. Num a => a -> a -> a
* (a
dst_r forall a. Num a => a -> a -> a
- a
dst_l) forall a. Num a => a -> a -> a
+ a
dst_l)
(forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
Clip_Both a
src_l a
src_r a
dst_l a
dst_r a
x)
sc3_expexp :: (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_expexp :: forall a. (Ord a, Floating a) => a -> a -> a -> a -> a -> a
sc3_expexp a
src_l a
src_r a
dst_l a
dst_r a
x =
forall a. a -> Maybe a -> a
fromMaybe
((a
dst_r forall a. Fractional a => a -> a -> a
/ a
dst_l) forall a. Floating a => a -> a -> a
** forall a. Floating a => a -> a -> a
logBase (a
src_r forall a. Fractional a => a -> a -> a
/ a
src_l) (a
x forall a. Fractional a => a -> a -> a
/ a
src_l) forall a. Num a => a -> a -> a
* a
dst_l)
(forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
Clip_Both a
src_l a
src_r a
dst_l a
dst_r a
x)
sc3_lincurve :: (Ord a, Floating a) => a -> a -> a -> a -> a -> a -> a
sc3_lincurve :: forall a. (Ord a, Floating a) => a -> a -> a -> a -> a -> a -> a
sc3_lincurve a
curve a
src_l a
src_r a
dst_l a
dst_r a
x =
case forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
Clip_Both a
src_l a
src_r a
dst_l a
dst_r a
x of
Just a
r -> a
r
Maybe a
Nothing ->
if forall a. Num a => a -> a
abs a
curve forall a. Ord a => a -> a -> Bool
< a
0.001
then forall a. Fractional a => (a, a) -> (a, a) -> a -> a
linlin_hs (a
src_l,a
src_r) (a
dst_l,a
dst_r) a
x
else let grow :: a
grow = forall a. Floating a => a -> a
exp a
curve
a :: a
a = (a
dst_r forall a. Num a => a -> a -> a
- a
dst_l) forall a. Fractional a => a -> a -> a
/ (a
1.0 forall a. Num a => a -> a -> a
- a
grow)
b :: a
b = a
dst_l forall a. Num a => a -> a -> a
+ a
a
scaled :: a
scaled = (a
x forall a. Num a => a -> a -> a
- a
src_l) forall a. Fractional a => a -> a -> a
/ (a
src_r forall a. Num a => a -> a -> a
- a
src_l)
in a
b forall a. Num a => a -> a -> a
- (a
a forall a. Num a => a -> a -> a
* (a
grow forall a. Floating a => a -> a -> a
** a
scaled))
sc3_curvelin :: (Ord a, Floating a) => a -> a -> a -> a -> a -> a -> a
sc3_curvelin :: forall a. (Ord a, Floating a) => a -> a -> a -> a -> a -> a -> a
sc3_curvelin a
curve a
src_l a
src_r a
dst_l a
dst_r a
x =
case forall n. Ord n => Clip_Rule -> n -> n -> n -> n -> n -> Maybe n
apply_clip_rule Clip_Rule
Clip_Both a
src_l a
src_r a
dst_l a
dst_r a
x of
Just a
r -> a
r
Maybe a
Nothing ->
if forall a. Num a => a -> a
abs a
curve forall a. Ord a => a -> a -> Bool
< a
0.001
then forall a. Fractional a => (a, a) -> (a, a) -> a -> a
linlin_hs (a
src_l,a
src_r) (a
dst_l,a
dst_r) a
x
else let grow :: a
grow = forall a. Floating a => a -> a
exp a
curve
a :: a
a = (a
src_r forall a. Num a => a -> a -> a
- a
src_l) forall a. Fractional a => a -> a -> a
/ (a
1.0 forall a. Num a => a -> a -> a
- a
grow)
b :: a
b = a
src_l forall a. Num a => a -> a -> a
+ a
a
in forall a. Floating a => a -> a
log ((a
b forall a. Num a => a -> a -> a
- a
x) forall a. Fractional a => a -> a -> a
/ a
a) forall a. Num a => a -> a -> a
* (a
dst_r forall a. Num a => a -> a -> a
- a
dst_l) forall a. Fractional a => a -> a -> a
/ a
curve forall a. Num a => a -> a -> a
+ a
dst_l
double_pp_rm0 :: String -> String
double_pp_rm0 :: [Char] -> [Char]
double_pp_rm0 =
let rev_f :: ([a] -> [a]) -> [a] -> [a]
rev_f [a] -> [a]
f = forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse
remv :: [Char] -> [Char]
remv [Char]
l = case [Char]
l of
Char
'0':Char
'.':[Char]
_ -> [Char]
l
Char
'0':[Char]
l' -> [Char] -> [Char]
remv [Char]
l'
[Char]
_ -> [Char]
l
in forall {a} {a}. ([a] -> [a]) -> [a] -> [a]
rev_f [Char] -> [Char]
remv
double_pp :: Int -> Double -> String
double_pp :: Int -> Double -> [Char]
double_pp Int
k Double
n = [Char] -> [Char]
double_pp_rm0 (forall a. RealFloat a => Maybe Int -> a -> [Char] -> [Char]
Numeric.showFFloat (forall a. a -> Maybe a
Just Int
k) Double
n [Char]
"")
real_pp :: Int -> Double -> String
real_pp :: Int -> Double -> [Char]
real_pp Int
k Double
n =
let r :: Rational
r = forall a. Real a => a -> Rational
toRational Double
n
in if forall a. Ratio a -> a
denominator Rational
r forall a. Eq a => a -> a -> Bool
== Integer
1 then forall a. Show a => a -> [Char]
show (forall a. Ratio a -> a
numerator Rational
r) else Int -> Double -> [Char]
double_pp Int
k Double
n
parse_double :: String -> Maybe Double
parse_double :: [Char] -> Maybe Double
parse_double = forall a. Read a => [Char] -> Maybe a
Common.Base.reads_exact
sum_opt_f :: Num t => (t -> t -> t -> t) -> (t -> t -> t -> t -> t) -> [t] -> t
sum_opt_f :: forall t.
Num t =>
(t -> t -> t -> t) -> (t -> t -> t -> t -> t) -> [t] -> t
sum_opt_f t -> t -> t -> t
f3 t -> t -> t -> t -> t
f4 =
let recur :: [t] -> t
recur [t]
l =
case [t]
l of
t
p:t
q:t
r:t
s:[t]
l' -> [t] -> t
recur (t -> t -> t -> t -> t
f4 t
p t
q t
r t
s forall a. a -> [a] -> [a]
: [t]
l')
t
p:t
q:t
r:[t]
l' -> [t] -> t
recur (t -> t -> t -> t
f3 t
p t
q t
r forall a. a -> [a] -> [a]
: [t]
l')
[t]
_ -> forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [t]
l
in [t] -> t
recur
sin_taylor_approximation :: Floating a => a -> a
sin_taylor_approximation :: forall a. Floating a => a -> a
sin_taylor_approximation a
x = a
x forall a. Num a => a -> a -> a
- (a
x forall a. Floating a => a -> a -> a
** a
3) forall a. Fractional a => a -> a -> a
/ (a
3 forall a. Num a => a -> a -> a
* a
2) forall a. Num a => a -> a -> a
+ (a
x forall a. Floating a => a -> a -> a
** a
5) forall a. Fractional a => a -> a -> a
/ (a
5 forall a. Num a => a -> a -> a
* a
4 forall a. Num a => a -> a -> a
* a
3 forall a. Num a => a -> a -> a
* a
2) forall a. Num a => a -> a -> a
- (a
x forall a. Floating a => a -> a -> a
** a
7) forall a. Fractional a => a -> a -> a
/ (a
7 forall a. Num a => a -> a -> a
* a
6 forall a. Num a => a -> a -> a
* a
5 forall a. Num a => a -> a -> a
* a
4 forall a. Num a => a -> a -> a
* a
3 forall a. Num a => a -> a -> a
* a
2) forall a. Num a => a -> a -> a
+ (a
x forall a. Floating a => a -> a -> a
** a
9) forall a. Fractional a => a -> a -> a
/ (a
9 forall a. Num a => a -> a -> a
* a
8 forall a. Num a => a -> a -> a
* a
7 forall a. Num a => a -> a -> a
* a
6 forall a. Num a => a -> a -> a
* a
5 forall a. Num a => a -> a -> a
* a
4 forall a. Num a => a -> a -> a
* a
3 forall a. Num a => a -> a -> a
* a
2)
sin_bhaskara_approximation :: Floating a => a -> a
sin_bhaskara_approximation :: forall a. Floating a => a -> a
sin_bhaskara_approximation a
x = (a
16 forall a. Num a => a -> a -> a
* a
x forall a. Num a => a -> a -> a
* (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
- a
x)) forall a. Fractional a => a -> a -> a
/ ((a
5 forall a. Num a => a -> a -> a
* forall a. Floating a => a
pi forall a. Num a => a -> a -> a
* forall a. Floating a => a
pi) forall a. Num a => a -> a -> a
- (a
4 forall a. Num a => a -> a -> a
* a
x forall a. Num a => a -> a -> a
* (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
- a
x)))
sin_green_approximation :: Floating a => a -> a
sin_green_approximation :: forall a. Floating a => a -> a
sin_green_approximation a
x = a
x forall a. Num a => a -> a -> a
- (a
0.166666546 forall a. Num a => a -> a -> a
* (a
x forall a. Floating a => a -> a -> a
** a
3)) forall a. Num a => a -> a -> a
+ (a
0.00833216076 forall a. Num a => a -> a -> a
* (a
x forall a. Floating a => a -> a -> a
** a
5)) forall a. Num a => a -> a -> a
- (a
0.000195152832 forall a. Num a => a -> a -> a
* (a
x forall a. Floating a => a -> a -> a
** a
7))
sin_adenot_approximation :: Floating a => a -> a
sin_adenot_approximation :: forall a. Floating a => a -> a
sin_adenot_approximation a
x = a
0.391969947653056 forall a. Num a => a -> a -> a
* a
x forall a. Num a => a -> a -> a
* (forall a. Floating a => a
pi forall a. Num a => a -> a -> a
- forall a. Num a => a -> a
abs a
x)
sin_robin_approximation :: Floating a => a -> a
sin_robin_approximation :: forall a. Floating a => a -> a
sin_robin_approximation a
x = let c :: a
c = a
x forall a. Num a => a -> a -> a
* a
0.01 in a
c forall a. Num a => a -> a -> a
* (a
2 forall a. Num a => a -> a -> a
- a
c)