{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NoRebindableSyntax #-}
module NumHask.Free.Carriers
(
Warshall (..),
MinPlus (..),
FieldStar (..),
Viterbi (..),
)
where
import NumHask.Algebra.Additive qualified as NHA
import NumHask.Algebra.Group (Idempotent, Magma (..))
import NumHask.Algebra.Lattice qualified as NHAL
import NumHask.Algebra.Multiplicative qualified as NHM
import NumHask.Algebra.Ring qualified as NHR
import Prelude (Bool, Double, Eq, Fractional, Num, Ord, Show)
import Prelude qualified as P
newtype Warshall = Warshall Bool
deriving (Warshall -> Warshall -> Bool
(Warshall -> Warshall -> Bool)
-> (Warshall -> Warshall -> Bool) -> Eq Warshall
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Warshall -> Warshall -> Bool
== :: Warshall -> Warshall -> Bool
$c/= :: Warshall -> Warshall -> Bool
/= :: Warshall -> Warshall -> Bool
Eq, Eq Warshall
Eq Warshall =>
(Warshall -> Warshall -> Ordering)
-> (Warshall -> Warshall -> Bool)
-> (Warshall -> Warshall -> Bool)
-> (Warshall -> Warshall -> Bool)
-> (Warshall -> Warshall -> Bool)
-> (Warshall -> Warshall -> Warshall)
-> (Warshall -> Warshall -> Warshall)
-> Ord Warshall
Warshall -> Warshall -> Bool
Warshall -> Warshall -> Ordering
Warshall -> Warshall -> Warshall
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Warshall -> Warshall -> Ordering
compare :: Warshall -> Warshall -> Ordering
$c< :: Warshall -> Warshall -> Bool
< :: Warshall -> Warshall -> Bool
$c<= :: Warshall -> Warshall -> Bool
<= :: Warshall -> Warshall -> Bool
$c> :: Warshall -> Warshall -> Bool
> :: Warshall -> Warshall -> Bool
$c>= :: Warshall -> Warshall -> Bool
>= :: Warshall -> Warshall -> Bool
$cmax :: Warshall -> Warshall -> Warshall
max :: Warshall -> Warshall -> Warshall
$cmin :: Warshall -> Warshall -> Warshall
min :: Warshall -> Warshall -> Warshall
Ord, Int -> Warshall -> ShowS
[Warshall] -> ShowS
Warshall -> String
(Int -> Warshall -> ShowS)
-> (Warshall -> String) -> ([Warshall] -> ShowS) -> Show Warshall
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Warshall -> ShowS
showsPrec :: Int -> Warshall -> ShowS
$cshow :: Warshall -> String
show :: Warshall -> String
$cshowList :: [Warshall] -> ShowS
showList :: [Warshall] -> ShowS
Show)
instance NHM.Multiplicative Warshall where
one :: Warshall
one = Bool -> Warshall
Warshall Bool
P.True
Warshall Bool
a * :: Warshall -> Warshall -> Warshall
* Warshall Bool
b = Bool -> Warshall
Warshall (Bool
a Bool -> Bool -> Bool
P.&& Bool
b)
instance NHA.Additive Warshall where
zero :: Warshall
zero = Bool -> Warshall
Warshall Bool
P.False
Warshall Bool
a + :: Warshall -> Warshall -> Warshall
+ Warshall Bool
b = Bool -> Warshall
Warshall (Bool
a Bool -> Bool -> Bool
P.|| Bool
b)
instance Magma Warshall where
Warshall
a ⊕ :: Warshall -> Warshall -> Warshall
⊕ Warshall
b = Warshall
a Warshall -> Warshall -> Warshall
forall a. Additive a => a -> a -> a
NHA.+ Warshall
b
instance Idempotent Warshall
instance NHR.StarSemiring Warshall where
star :: Warshall -> Warshall
star Warshall
_ = Bool -> Warshall
Warshall Bool
P.True
instance NHR.KleeneAlgebra Warshall
instance NHAL.JoinSemiLattice Warshall where
Warshall Bool
a \/ :: Warshall -> Warshall -> Warshall
\/ Warshall Bool
b = Bool -> Warshall
Warshall (Bool
a Bool -> Bool -> Bool
P.|| Bool
b)
instance NHAL.LowerBounded Warshall where
bottom :: Warshall
bottom = Bool -> Warshall
Warshall Bool
P.False
instance NHAL.CompleteJoinSemiLattice Warshall
newtype MinPlus a = MinPlus
{ forall a. MinPlus a -> a
getMinPlus :: a
}
deriving (MinPlus a -> MinPlus a -> Bool
(MinPlus a -> MinPlus a -> Bool)
-> (MinPlus a -> MinPlus a -> Bool) -> Eq (MinPlus a)
forall a. Eq a => MinPlus a -> MinPlus a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => MinPlus a -> MinPlus a -> Bool
== :: MinPlus a -> MinPlus a -> Bool
$c/= :: forall a. Eq a => MinPlus a -> MinPlus a -> Bool
/= :: MinPlus a -> MinPlus a -> Bool
Eq, Eq (MinPlus a)
Eq (MinPlus a) =>
(MinPlus a -> MinPlus a -> Ordering)
-> (MinPlus a -> MinPlus a -> Bool)
-> (MinPlus a -> MinPlus a -> Bool)
-> (MinPlus a -> MinPlus a -> Bool)
-> (MinPlus a -> MinPlus a -> Bool)
-> (MinPlus a -> MinPlus a -> MinPlus a)
-> (MinPlus a -> MinPlus a -> MinPlus a)
-> Ord (MinPlus a)
MinPlus a -> MinPlus a -> Bool
MinPlus a -> MinPlus a -> Ordering
MinPlus a -> MinPlus a -> MinPlus a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (MinPlus a)
forall a. Ord a => MinPlus a -> MinPlus a -> Bool
forall a. Ord a => MinPlus a -> MinPlus a -> Ordering
forall a. Ord a => MinPlus a -> MinPlus a -> MinPlus a
$ccompare :: forall a. Ord a => MinPlus a -> MinPlus a -> Ordering
compare :: MinPlus a -> MinPlus a -> Ordering
$c< :: forall a. Ord a => MinPlus a -> MinPlus a -> Bool
< :: MinPlus a -> MinPlus a -> Bool
$c<= :: forall a. Ord a => MinPlus a -> MinPlus a -> Bool
<= :: MinPlus a -> MinPlus a -> Bool
$c> :: forall a. Ord a => MinPlus a -> MinPlus a -> Bool
> :: MinPlus a -> MinPlus a -> Bool
$c>= :: forall a. Ord a => MinPlus a -> MinPlus a -> Bool
>= :: MinPlus a -> MinPlus a -> Bool
$cmax :: forall a. Ord a => MinPlus a -> MinPlus a -> MinPlus a
max :: MinPlus a -> MinPlus a -> MinPlus a
$cmin :: forall a. Ord a => MinPlus a -> MinPlus a -> MinPlus a
min :: MinPlus a -> MinPlus a -> MinPlus a
Ord, Int -> MinPlus a -> ShowS
[MinPlus a] -> ShowS
MinPlus a -> String
(Int -> MinPlus a -> ShowS)
-> (MinPlus a -> String)
-> ([MinPlus a] -> ShowS)
-> Show (MinPlus a)
forall a. Show a => Int -> MinPlus a -> ShowS
forall a. Show a => [MinPlus a] -> ShowS
forall a. Show a => MinPlus a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> MinPlus a -> ShowS
showsPrec :: Int -> MinPlus a -> ShowS
$cshow :: forall a. Show a => MinPlus a -> String
show :: MinPlus a -> String
$cshowList :: forall a. Show a => [MinPlus a] -> ShowS
showList :: [MinPlus a] -> ShowS
Show)
instance NHM.Multiplicative (MinPlus Double) where
MinPlus Double
a * :: MinPlus Double -> MinPlus Double -> MinPlus Double
* MinPlus Double
b = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.+ Double
b)
one :: MinPlus Double
one = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus Double
0
instance NHA.Additive (MinPlus Double) where
zero :: MinPlus Double
zero = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
P./ Double
0)
MinPlus Double
a + :: MinPlus Double -> MinPlus Double -> MinPlus Double
+ MinPlus Double
b = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double -> Double -> Double
forall a. Ord a => a -> a -> a
P.min Double
a Double
b)
instance Magma (MinPlus Double) where
MinPlus Double
a ⊕ :: MinPlus Double -> MinPlus Double -> MinPlus Double
⊕ MinPlus Double
b = MinPlus Double
a MinPlus Double -> MinPlus Double -> MinPlus Double
forall a. Additive a => a -> a -> a
NHA.+ MinPlus Double
b
instance Idempotent (MinPlus Double)
instance NHR.StarSemiring (MinPlus Double) where
star :: MinPlus Double -> MinPlus Double
star MinPlus Double
_ = MinPlus Double
forall a. Multiplicative a => a
NHM.one
instance NHR.KleeneAlgebra (MinPlus Double)
instance (P.Ord a) => NHAL.JoinSemiLattice (MinPlus a) where
MinPlus a
a \/ :: MinPlus a -> MinPlus a -> MinPlus a
\/ MinPlus a
b = a -> MinPlus a
forall a. a -> MinPlus a
MinPlus (a -> a -> a
forall a. Ord a => a -> a -> a
P.min a
a a
b)
instance NHAL.LowerBounded (MinPlus Double) where
bottom :: MinPlus Double
bottom = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
P./ Double
0)
instance NHAL.CompleteJoinSemiLattice (MinPlus Double)
newtype FieldStar = FieldStar {FieldStar -> Double
unFieldStar :: Double}
deriving (FieldStar -> FieldStar -> Bool
(FieldStar -> FieldStar -> Bool)
-> (FieldStar -> FieldStar -> Bool) -> Eq FieldStar
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FieldStar -> FieldStar -> Bool
== :: FieldStar -> FieldStar -> Bool
$c/= :: FieldStar -> FieldStar -> Bool
/= :: FieldStar -> FieldStar -> Bool
Eq, Eq FieldStar
Eq FieldStar =>
(FieldStar -> FieldStar -> Ordering)
-> (FieldStar -> FieldStar -> Bool)
-> (FieldStar -> FieldStar -> Bool)
-> (FieldStar -> FieldStar -> Bool)
-> (FieldStar -> FieldStar -> Bool)
-> (FieldStar -> FieldStar -> FieldStar)
-> (FieldStar -> FieldStar -> FieldStar)
-> Ord FieldStar
FieldStar -> FieldStar -> Bool
FieldStar -> FieldStar -> Ordering
FieldStar -> FieldStar -> FieldStar
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FieldStar -> FieldStar -> Ordering
compare :: FieldStar -> FieldStar -> Ordering
$c< :: FieldStar -> FieldStar -> Bool
< :: FieldStar -> FieldStar -> Bool
$c<= :: FieldStar -> FieldStar -> Bool
<= :: FieldStar -> FieldStar -> Bool
$c> :: FieldStar -> FieldStar -> Bool
> :: FieldStar -> FieldStar -> Bool
$c>= :: FieldStar -> FieldStar -> Bool
>= :: FieldStar -> FieldStar -> Bool
$cmax :: FieldStar -> FieldStar -> FieldStar
max :: FieldStar -> FieldStar -> FieldStar
$cmin :: FieldStar -> FieldStar -> FieldStar
min :: FieldStar -> FieldStar -> FieldStar
Ord, Int -> FieldStar -> ShowS
[FieldStar] -> ShowS
FieldStar -> String
(Int -> FieldStar -> ShowS)
-> (FieldStar -> String)
-> ([FieldStar] -> ShowS)
-> Show FieldStar
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FieldStar -> ShowS
showsPrec :: Int -> FieldStar -> ShowS
$cshow :: FieldStar -> String
show :: FieldStar -> String
$cshowList :: [FieldStar] -> ShowS
showList :: [FieldStar] -> ShowS
Show, Integer -> FieldStar
FieldStar -> FieldStar
FieldStar -> FieldStar -> FieldStar
(FieldStar -> FieldStar -> FieldStar)
-> (FieldStar -> FieldStar -> FieldStar)
-> (FieldStar -> FieldStar -> FieldStar)
-> (FieldStar -> FieldStar)
-> (FieldStar -> FieldStar)
-> (FieldStar -> FieldStar)
-> (Integer -> FieldStar)
-> Num FieldStar
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: FieldStar -> FieldStar -> FieldStar
+ :: FieldStar -> FieldStar -> FieldStar
$c- :: FieldStar -> FieldStar -> FieldStar
- :: FieldStar -> FieldStar -> FieldStar
$c* :: FieldStar -> FieldStar -> FieldStar
* :: FieldStar -> FieldStar -> FieldStar
$cnegate :: FieldStar -> FieldStar
negate :: FieldStar -> FieldStar
$cabs :: FieldStar -> FieldStar
abs :: FieldStar -> FieldStar
$csignum :: FieldStar -> FieldStar
signum :: FieldStar -> FieldStar
$cfromInteger :: Integer -> FieldStar
fromInteger :: Integer -> FieldStar
Num, Num FieldStar
Num FieldStar =>
(FieldStar -> FieldStar -> FieldStar)
-> (FieldStar -> FieldStar)
-> (Rational -> FieldStar)
-> Fractional FieldStar
Rational -> FieldStar
FieldStar -> FieldStar
FieldStar -> FieldStar -> FieldStar
forall a.
Num a =>
(a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
$c/ :: FieldStar -> FieldStar -> FieldStar
/ :: FieldStar -> FieldStar -> FieldStar
$crecip :: FieldStar -> FieldStar
recip :: FieldStar -> FieldStar
$cfromRational :: Rational -> FieldStar
fromRational :: Rational -> FieldStar
Fractional)
instance NHM.Multiplicative FieldStar where
one :: FieldStar
one = Double -> FieldStar
FieldStar Double
1
FieldStar Double
a * :: FieldStar -> FieldStar -> FieldStar
* FieldStar Double
b = Double -> FieldStar
FieldStar (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.* Double
b)
instance NHA.Additive FieldStar where
zero :: FieldStar
zero = Double -> FieldStar
FieldStar Double
0
FieldStar Double
a + :: FieldStar -> FieldStar -> FieldStar
+ FieldStar Double
b = Double -> FieldStar
FieldStar (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.+ Double
b)
instance NHA.Subtractive FieldStar where
negate :: FieldStar -> FieldStar
negate (FieldStar Double
a) = Double -> FieldStar
FieldStar (Double -> Double
forall a. Num a => a -> a
P.negate Double
a)
FieldStar Double
a - :: FieldStar -> FieldStar -> FieldStar
- FieldStar Double
b = Double -> FieldStar
FieldStar (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.- Double
b)
instance NHR.StarSemiring FieldStar where
star :: FieldStar -> FieldStar
star (FieldStar Double
a) = Double -> FieldStar
FieldStar (Double -> Double
forall a. Fractional a => a -> a
P.recip (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
P.- Double
a))
newtype Viterbi a = Viterbi {forall a. Viterbi a -> a
getViterbi :: a}
deriving (Viterbi a -> Viterbi a -> Bool
(Viterbi a -> Viterbi a -> Bool)
-> (Viterbi a -> Viterbi a -> Bool) -> Eq (Viterbi a)
forall a. Eq a => Viterbi a -> Viterbi a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Viterbi a -> Viterbi a -> Bool
== :: Viterbi a -> Viterbi a -> Bool
$c/= :: forall a. Eq a => Viterbi a -> Viterbi a -> Bool
/= :: Viterbi a -> Viterbi a -> Bool
Eq, Eq (Viterbi a)
Eq (Viterbi a) =>
(Viterbi a -> Viterbi a -> Ordering)
-> (Viterbi a -> Viterbi a -> Bool)
-> (Viterbi a -> Viterbi a -> Bool)
-> (Viterbi a -> Viterbi a -> Bool)
-> (Viterbi a -> Viterbi a -> Bool)
-> (Viterbi a -> Viterbi a -> Viterbi a)
-> (Viterbi a -> Viterbi a -> Viterbi a)
-> Ord (Viterbi a)
Viterbi a -> Viterbi a -> Bool
Viterbi a -> Viterbi a -> Ordering
Viterbi a -> Viterbi a -> Viterbi a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Viterbi a)
forall a. Ord a => Viterbi a -> Viterbi a -> Bool
forall a. Ord a => Viterbi a -> Viterbi a -> Ordering
forall a. Ord a => Viterbi a -> Viterbi a -> Viterbi a
$ccompare :: forall a. Ord a => Viterbi a -> Viterbi a -> Ordering
compare :: Viterbi a -> Viterbi a -> Ordering
$c< :: forall a. Ord a => Viterbi a -> Viterbi a -> Bool
< :: Viterbi a -> Viterbi a -> Bool
$c<= :: forall a. Ord a => Viterbi a -> Viterbi a -> Bool
<= :: Viterbi a -> Viterbi a -> Bool
$c> :: forall a. Ord a => Viterbi a -> Viterbi a -> Bool
> :: Viterbi a -> Viterbi a -> Bool
$c>= :: forall a. Ord a => Viterbi a -> Viterbi a -> Bool
>= :: Viterbi a -> Viterbi a -> Bool
$cmax :: forall a. Ord a => Viterbi a -> Viterbi a -> Viterbi a
max :: Viterbi a -> Viterbi a -> Viterbi a
$cmin :: forall a. Ord a => Viterbi a -> Viterbi a -> Viterbi a
min :: Viterbi a -> Viterbi a -> Viterbi a
Ord, Int -> Viterbi a -> ShowS
[Viterbi a] -> ShowS
Viterbi a -> String
(Int -> Viterbi a -> ShowS)
-> (Viterbi a -> String)
-> ([Viterbi a] -> ShowS)
-> Show (Viterbi a)
forall a. Show a => Int -> Viterbi a -> ShowS
forall a. Show a => [Viterbi a] -> ShowS
forall a. Show a => Viterbi a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Viterbi a -> ShowS
showsPrec :: Int -> Viterbi a -> ShowS
$cshow :: forall a. Show a => Viterbi a -> String
show :: Viterbi a -> String
$cshowList :: forall a. Show a => [Viterbi a] -> ShowS
showList :: [Viterbi a] -> ShowS
Show)
instance NHM.Multiplicative (Viterbi Double) where
one :: Viterbi Double
one = Double -> Viterbi Double
forall a. a -> Viterbi a
Viterbi Double
1
Viterbi Double
a * :: Viterbi Double -> Viterbi Double -> Viterbi Double
* Viterbi Double
b = Double -> Viterbi Double
forall a. a -> Viterbi a
Viterbi (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.* Double
b)
instance NHA.Additive (Viterbi Double) where
zero :: Viterbi Double
zero = Double -> Viterbi Double
forall a. a -> Viterbi a
Viterbi Double
0
Viterbi Double
a + :: Viterbi Double -> Viterbi Double -> Viterbi Double
+ Viterbi Double
b = Double -> Viterbi Double
forall a. a -> Viterbi a
Viterbi (Double -> Double -> Double
forall a. Ord a => a -> a -> a
P.max Double
a Double
b)
instance Magma (Viterbi Double) where
Viterbi Double
a ⊕ :: Viterbi Double -> Viterbi Double -> Viterbi Double
⊕ Viterbi Double
b = Viterbi Double
a Viterbi Double -> Viterbi Double -> Viterbi Double
forall a. Additive a => a -> a -> a
NHA.+ Viterbi Double
b
instance Idempotent (Viterbi Double)
instance NHR.StarSemiring (Viterbi Double) where
star :: Viterbi Double -> Viterbi Double
star Viterbi Double
_ = Viterbi Double
forall a. Multiplicative a => a
NHM.one
instance NHR.KleeneAlgebra (Viterbi Double)