module Fuzzy.Sets.MembershipFunctions(
constant,
linear,
sigmoid,
triangular,
rectangular,
trapezoidal,
gaussian,
exponential,
) where
import Lattices.ResiduatedLattice
constant :: ResiduatedLattice l => Double -> (Double -> l)
constant :: forall l. ResiduatedLattice l => Double -> Double -> l
constant Double
a Double
_ = forall l. BoundedLattice l => Double -> l
mkLattice Double
a
linear :: ResiduatedLattice l => Double -> Double -> (Double -> l)
linear :: forall l. ResiduatedLattice l => Double -> Double -> Double -> l
linear Double
a Double
b Double
x =
let y :: Double
y = Double
a forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
+ Double
b
in forall l. BoundedLattice l => Double -> l
mkLattice Double
y
sigmoid :: ResiduatedLattice l => Double -> Double -> (Double -> l)
sigmoid :: forall l. ResiduatedLattice l => Double -> Double -> Double -> l
sigmoid Double
k Double
x0 Double
x =
let pow :: Double
pow = -Double
k forall a. Num a => a -> a -> a
* (Double
x forall a. Num a => a -> a -> a
- Double
x0)
in forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ Double
1 forall a. Fractional a => a -> a -> a
/ (Double
1 forall a. Num a => a -> a -> a
+ (forall a. Floating a => a -> a
exp Double
1 forall a. Floating a => a -> a -> a
** Double
pow))
triangular :: ResiduatedLattice l => Double -> Double -> Double -> (Double -> l)
triangular :: forall l.
ResiduatedLattice l =>
Double -> Double -> Double -> Double -> l
triangular Double
a Double
b Double
c Double
x
| Double
a forall a. Ord a => a -> a -> Bool
<= Double
x Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
< Double
b = forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ (Double
x forall a. Num a => a -> a -> a
- Double
a) forall a. Fractional a => a -> a -> a
/ (Double
b forall a. Num a => a -> a -> a
- Double
a)
| Double
b forall a. Ord a => a -> a -> Bool
<= Double
x Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
< Double
c = forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ (Double
c forall a. Num a => a -> a -> a
- Double
x) forall a. Fractional a => a -> a -> a
/ (Double
c forall a. Num a => a -> a -> a
- Double
b)
| Bool
otherwise = forall l. BoundedLattice l => l
bot
rectangular :: ResiduatedLattice l => Double -> Double -> Double -> (Double -> l)
rectangular :: forall l.
ResiduatedLattice l =>
Double -> Double -> Double -> Double -> l
rectangular Double
a Double
b Double
h Double
x
| Double
x forall a. Ord a => a -> a -> Bool
>= Double
a Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
<= Double
b = forall l. BoundedLattice l => Double -> l
mkLattice Double
h
| Bool
otherwise = forall l. BoundedLattice l => l
bot
trapezoidal :: ResiduatedLattice l => Double -> Double -> Double -> Double -> (Double -> l)
trapezoidal :: forall l.
ResiduatedLattice l =>
Double -> Double -> Double -> Double -> Double -> l
trapezoidal Double
a Double
b1 Double
b2 Double
c Double
x
| Double
a forall a. Ord a => a -> a -> Bool
<= Double
x Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
< Double
b1 = forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ (Double
x forall a. Num a => a -> a -> a
- Double
a) forall a. Fractional a => a -> a -> a
/ (Double
b1 forall a. Num a => a -> a -> a
- Double
a)
| Double
b1 forall a. Ord a => a -> a -> Bool
<= Double
x Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
<= Double
b2 = forall l. BoundedLattice l => l
top
| Double
b2 forall a. Ord a => a -> a -> Bool
<= Double
x Bool -> Bool -> Bool
&& Double
x forall a. Ord a => a -> a -> Bool
< Double
c = forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ (Double
c forall a. Num a => a -> a -> a
- Double
x) forall a. Fractional a => a -> a -> a
/ (Double
c forall a. Num a => a -> a -> a
- Double
b2)
| Bool
otherwise = forall l. BoundedLattice l => l
bot
gaussian :: ResiduatedLattice l => Double -> Double -> Double -> (Double -> l)
gaussian :: forall l.
ResiduatedLattice l =>
Double -> Double -> Double -> Double -> l
gaussian Double
a Double
b Double
c Double
x =
let e :: Double
e = forall a. Floating a => a -> a
exp Double
1
numer :: Double
numer = (Double
x forall a. Num a => a -> a -> a
+ Double
b) forall a. Floating a => a -> a -> a
** Double
2
denom :: Double
denom = Double
2 forall a. Num a => a -> a -> a
* (Double
c forall a. Floating a => a -> a -> a
** Double
2)
pow :: Double
pow = -(Double
numer forall a. Fractional a => a -> a -> a
/ Double
denom)
in forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ Double
a forall a. Num a => a -> a -> a
* Double
eforall a. Floating a => a -> a -> a
**Double
pow
exponential :: ResiduatedLattice l => Double -> l
exponential :: forall l. ResiduatedLattice l => Double -> l
exponential Double
x =
let e :: Double
e = forall a. Floating a => a -> a
exp Double
1
in forall l. BoundedLattice l => Double -> l
mkLattice forall a b. (a -> b) -> a -> b
$ Double
eforall a. Floating a => a -> a -> a
**Double
x