{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE
TypeFamilies
, FlexibleInstances
, GADTs
, MultiParamTypeClasses
, StandaloneDeriving
#-}
module OAlg.Entity.Matrix.Vector
(
Vector(..), vecpsq, cf, cfsssy, ssycfs, vecrc, vecAppl
, HomSymbol(..), mtxHomSymbol
, repMatrix, Representable(..), mtxRepresentable
, prpRepMatrix, prpRepMatrixZ
, xVecN
) where
import Control.Monad
import Data.Typeable
import Data.List (map,(++))
import Data.Foldable
import OAlg.Prelude
import OAlg.Data.Singleton
import OAlg.Structure.Fibred
import OAlg.Structure.Additive
import OAlg.Structure.Oriented
import OAlg.Structure.Multiplicative
import OAlg.Structure.Ring
import OAlg.Structure.Exponential
import OAlg.Structure.Vectorial
import OAlg.Entity.Sequence hiding (sy)
import OAlg.Entity.Sum
import OAlg.Entity.Matrix.Dim
import OAlg.Entity.Matrix.Entries
import OAlg.Entity.Matrix.Definition
import OAlg.Hom.Definition
import OAlg.Hom.Fibred
import OAlg.Hom.Additive
import OAlg.Hom.Vectorial
newtype Vector r = Vector (PSequence N r) deriving (Int -> Vector r -> ShowS
forall r. Show r => Int -> Vector r -> ShowS
forall r. Show r => [Vector r] -> ShowS
forall r. Show r => Vector r -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Vector r] -> ShowS
$cshowList :: forall r. Show r => [Vector r] -> ShowS
show :: Vector r -> String
$cshow :: forall r. Show r => Vector r -> String
showsPrec :: Int -> Vector r -> ShowS
$cshowsPrec :: forall r. Show r => Int -> Vector r -> ShowS
Show,Vector r -> Vector r -> Bool
forall r. Eq r => Vector r -> Vector r -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Vector r -> Vector r -> Bool
$c/= :: forall r. Eq r => Vector r -> Vector r -> Bool
== :: Vector r -> Vector r -> Bool
$c== :: forall r. Eq r => Vector r -> Vector r -> Bool
Eq,Vector r -> Vector r -> Bool
Vector r -> Vector r -> Ordering
Vector r -> Vector r -> Vector r
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 {r}. Ord r => Eq (Vector r)
forall r. Ord r => Vector r -> Vector r -> Bool
forall r. Ord r => Vector r -> Vector r -> Ordering
forall r. Ord r => Vector r -> Vector r -> Vector r
min :: Vector r -> Vector r -> Vector r
$cmin :: forall r. Ord r => Vector r -> Vector r -> Vector r
max :: Vector r -> Vector r -> Vector r
$cmax :: forall r. Ord r => Vector r -> Vector r -> Vector r
>= :: Vector r -> Vector r -> Bool
$c>= :: forall r. Ord r => Vector r -> Vector r -> Bool
> :: Vector r -> Vector r -> Bool
$c> :: forall r. Ord r => Vector r -> Vector r -> Bool
<= :: Vector r -> Vector r -> Bool
$c<= :: forall r. Ord r => Vector r -> Vector r -> Bool
< :: Vector r -> Vector r -> Bool
$c< :: forall r. Ord r => Vector r -> Vector r -> Bool
compare :: Vector r -> Vector r -> Ordering
$ccompare :: forall r. Ord r => Vector r -> Vector r -> Ordering
Ord)
vecpsq :: Vector r -> PSequence N r
vecpsq :: forall r. Vector r -> PSequence N r
vecpsq (Vector PSequence N r
ris) = PSequence N r
ris
vector :: Semiring r => [(r,N)] -> Vector r
vector :: forall r. Semiring r => [(r, N)] -> Vector r
vector = forall r. PSequence N r -> Vector r
Vector forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall x i. (x -> Bool) -> PSequence i x -> PSequence i x
psqFilter (forall b. Boolean b => b -> b
not forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall a. Additive a => a -> Bool
isZero) forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall i x. Ord i => (x -> x -> x) -> [(x, i)] -> PSequence i x
psequence forall a. Additive a => a -> a -> a
(+)
cf :: Semiring r => Vector r -> N -> r
cf :: forall r. Semiring r => Vector r -> N -> r
cf (Vector PSequence N r
v) N
i = forall a. a -> Maybe a -> a
fromMaybe forall r. Semiring r => r
rZero (PSequence N r
v forall (s :: * -> *) i x. Sequence s i x => s x -> i -> Maybe x
?? N
i)
instance Semiring r => Validable (Vector r) where
valid :: Vector r -> Statement
valid v :: Vector r
v@(Vector PSequence N r
ris) = (String -> Label
Label forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a. Show a => a -> String
show forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a. Typeable a => a -> TypeRep
typeOf Vector r
v) Label -> Statement -> Statement
:<=>: forall {b} {a}.
(Ord b, Additive a, Entity b) =>
PSequence b a -> Statement
vldVec PSequence N r
ris where
vldVec :: PSequence b a -> Statement
vldVec PSequence b a
ris
= [Statement] -> Statement
And [ String -> Label
Label String
"1" Label -> Statement -> Statement
:<=>: forall a. Validable a => a -> Statement
valid PSequence b a
ris
, String -> Label
Label String
"2" Label -> Statement -> Statement
:<=>: forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall {a} {b}.
(Additive a, Show b) =>
Statement -> (a, b) -> Statement
vldxs Statement
SValid (forall i x. PSequence i x -> [(x, i)]
psqxs PSequence b a
ris)
]
vldxs :: Statement -> (a, b) -> Statement
vldxs Statement
s (a, b)
ri
= [Statement] -> Statement
And [ Statement
s
, (forall b. Boolean b => b -> b
not forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a. Additive a => a -> Bool
isZero forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a b. (a, b) -> a
fst (a, b)
ri) Bool -> Message -> Statement
:?> [Parameter] -> Message
Params [String
"(r,i)"String -> String -> Parameter
:=forall a. Show a => a -> String
show (a, b)
ri]
]
instance Semiring r => Entity (Vector r)
instance Semiring r => Fibred (Vector r) where
type Root (Vector r) = ()
root :: Vector r -> Root (Vector r)
root Vector r
_ = ()
instance Semiring r => Additive (Vector r) where
zero :: Root (Vector r) -> Vector r
zero Root (Vector r)
_ = forall r. PSequence N r -> Vector r
Vector forall i x. PSequence i x
psqEmpty
Vector PSequence N r
v + :: Vector r -> Vector r -> Vector r
+ Vector PSequence N r
w = forall r. PSequence N r -> Vector r
Vector (forall x i. (x -> Bool) -> PSequence i x -> PSequence i x
psqFilter (forall b. Boolean b => b -> b
not forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall a. Additive a => a -> Bool
isZero) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x y z.
Ord i =>
(x -> y -> z)
-> (x -> z)
-> (y -> z)
-> PSequence i x
-> PSequence i y
-> PSequence i z
psqInterlace forall a. Additive a => a -> a -> a
(+) forall x. x -> x
id forall x. x -> x
id PSequence N r
v PSequence N r
w)
ntimes :: N -> Vector r -> Vector r
ntimes N
x (Vector PSequence N r
v) = forall r. PSequence N r -> Vector r
Vector (forall x i. (x -> Bool) -> PSequence i x -> PSequence i x
psqFilter (forall b. Boolean b => b -> b
not forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall a. Additive a => a -> Bool
isZero) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x y i. (x -> y) -> PSequence i x -> PSequence i y
psqMap (forall a. Additive a => N -> a -> a
ntimes N
x) PSequence N r
v)
instance Ring r => Abelian (Vector r) where
negate :: Vector r -> Vector r
negate (Vector PSequence N r
v) = forall r. PSequence N r -> Vector r
Vector (forall x y i. (x -> y) -> PSequence i x -> PSequence i y
psqMap forall a. Abelian a => a -> a
negate PSequence N r
v)
ztimes :: Z -> Vector r -> Vector r
ztimes Z
x (Vector PSequence N r
v) = forall r. PSequence N r -> Vector r
Vector (forall x i. (x -> Bool) -> PSequence i x -> PSequence i x
psqFilter (forall b. Boolean b => b -> b
not forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall a. Additive a => a -> Bool
isZero) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x y i. (x -> y) -> PSequence i x -> PSequence i y
psqMap (forall a. Abelian a => Z -> a -> a
ztimes Z
x) PSequence N r
v)
instance (Semiring r, Commutative r) => Vectorial (Vector r) where
type Scalar (Vector r) = r
Scalar (Vector r)
r ! :: Scalar (Vector r) -> Vector r -> Vector r
! (Vector PSequence N r
v) = forall r. PSequence N r -> Vector r
Vector (forall x i. (x -> Bool) -> PSequence i x -> PSequence i x
psqFilter (forall b. Boolean b => b -> b
not forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall a. Additive a => a -> Bool
isZero) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x y i. (x -> y) -> PSequence i x -> PSequence i y
psqMap (Scalar (Vector r)
rforall c. Multiplicative c => c -> c -> c
*) PSequence N r
v)
instance (Semiring r, Commutative r) => Euclidean (Vector r) where
Vector PSequence N r
v <!> :: Vector r -> Vector r -> Scalar (Vector r)
<!> Vector PSequence N r
w
= forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall a. Additive a => a -> a -> a
(+) forall r. Semiring r => r
rZero
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x. PSequence i x -> [(x, i)]
psqxs
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x y z.
Ord i =>
(x -> y -> z)
-> (x -> z)
-> (y -> z)
-> PSequence i x
-> PSequence i y
-> PSequence i z
psqInterlace forall c. Multiplicative c => c -> c -> c
(*) (forall b a. b -> a -> b
const forall r. Semiring r => r
rZero) (forall b a. b -> a -> b
const forall r. Semiring r => r
rZero) PSequence N r
v PSequence N r
w
ssycfs :: (Semiring r, Ord a) => Set a -> SumSymbol r a -> Vector r
ssycfs :: forall r a.
(Semiring r, Ord a) =>
Set a -> SumSymbol r a -> Vector r
ssycfs Set a
s SumSymbol r a
x = forall r. PSequence N r -> Vector r
Vector (forall i j x.
(Ord i, Ord j) =>
PSequence i x -> PSequence j i -> PSequence j x
psqCompose (forall i x. [(x, i)] -> PSequence i x
PSequence forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a. LinearCombination r a -> [(r, a)]
lcs forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a. Semiring r => SumSymbol r a -> LinearCombination r a
ssylc SumSymbol r a
x) (forall i x. [(x, i)] -> PSequence i x
PSequence forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall (s :: * -> *) x. Sequence s N x => s x -> [(x, N)]
listN Set a
s))
cfsssy :: (Semiring r, Commutative r, Entity a, Ord a) => Set a -> Vector r -> SumSymbol r a
cfsssy :: forall r a.
(Semiring r, Commutative r, Entity a, Ord a) =>
Set a -> Vector r -> SumSymbol r a
cfsssy Set a
s Vector r
v = forall r a.
(Semiring r, Commutative r, Entity a, Ord a) =>
[(r, a)] -> SumSymbol r a
sumSymbol forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x. PSequence i x -> [(x, i)]
psqxs forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i j x.
(Ord i, Ord j) =>
PSequence i x -> PSequence j i -> PSequence j x
psqCompose (forall r. Vector r -> PSequence N r
vecpsq Vector r
v) (forall i x. [(x, i)] -> PSequence i x
PSequence forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\(a
a,N
i) -> (N
i,a
a)) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall (s :: * -> *) x. Sequence s N x => s x -> [(x, N)]
listN Set a
s)
vecrc :: Vector r -> Row N (Col N r)
vecrc :: forall r. Vector r -> Row N (Col N r)
vecrc (Vector (PSequence [])) = forall j x. Row j x
rowEmpty
vecrc (Vector PSequence N r
v) = forall j x. PSequence j x -> Row j x
Row forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x. [(x, i)] -> PSequence i x
PSequence [(forall i x. PSequence i x -> Col i x
Col PSequence N r
v,N
0)]
vecAppl :: Semiring r => Matrix r -> Vector r -> Vector r
vecAppl :: forall r. Semiring r => Matrix r -> Vector r -> Vector r
vecAppl Matrix r
m Vector r
v = forall r. Col N (Row N r) -> Vector r
crvec (forall x. Matrix x -> Col N (Row N x)
mtxColRow Matrix r
m forall x k i j.
(Distributive x, Ord k) =>
Col i (Row k x) -> Row j (Col k x) -> Col i (Row j x)
`etsMlt` forall r. Vector r -> Row N (Col N r)
vecrc Vector r
v) where
crvec :: Col N (Row N r) -> Vector r
crvec :: forall r. Col N (Row N r) -> Vector r
crvec Col N (Row N r)
cl = case forall j i a. Eq j => j -> Col i (Row j a) -> Col i a
crHeadColAt N
0 Col N (Row N r)
cl of Col PSequence N r
v -> forall r. PSequence N r -> Vector r
Vector PSequence N r
v
data HomSymbol r x y where
HomSymbol :: (Entity x, Ord x, Entity y, Ord y)
=> PSequence x (LinearCombination r y) -> HomSymbol r (SumSymbol r x) (SumSymbol r y)
Cfs :: (Entity x, Ord x) => Set x -> HomSymbol r (SumSymbol r x) (Vector r)
Ssy :: (Entity x, Ord x) => Set x -> HomSymbol r (Vector r) (SumSymbol r x)
HomMatrix :: Matrix r -> HomSymbol r (Vector r) (Vector r)
deriving instance Semiring r => Show (HomSymbol r x y)
instance Semiring r => Show2 (HomSymbol r)
deriving instance Semiring r => Eq (HomSymbol r x y)
instance Semiring r => Eq2 (HomSymbol r)
instance Semiring r => Validable (HomSymbol r x y) where
valid :: HomSymbol r x y -> Statement
valid HomSymbol r x y
h = case HomSymbol r x y
h of
HomSymbol PSequence x (LinearCombination r y)
lcs -> String -> Label
Label String
"HomSymbol" Label -> Statement -> Statement
:<=>: forall a. Validable a => a -> Statement
valid PSequence x (LinearCombination r y)
lcs
Cfs Set x
xs -> String -> Label
Label String
"Cfs" Label -> Statement -> Statement
:<=>: forall a. Validable a => a -> Statement
valid Set x
xs
Ssy Set x
xs -> String -> Label
Label String
"Ssy" Label -> Statement -> Statement
:<=>: forall a. Validable a => a -> Statement
valid Set x
xs
HomMatrix Matrix r
m -> String -> Label
Label String
"HomMatrix" Label -> Statement -> Statement
:<=>: forall a. Validable a => a -> Statement
valid Matrix r
m
instance Semiring r => Validable2 (HomSymbol r)
instance (Semiring r, Typeable x, Typeable y) => Entity (HomSymbol r x y)
instance Semiring r => Entity2 (HomSymbol r)
instance (Semiring r, Commutative r) => Applicative (HomSymbol r) where
amap :: forall a b. HomSymbol r a b -> a -> b
amap (HomSymbol PSequence x (LinearCombination r y)
lcs) a
s = forall r y x.
(Semiring r, Commutative r, Entity y, Ord y) =>
(x -> LinearCombination r y) -> SumSymbol r x -> SumSymbol r y
ssySum x -> LinearCombination r y
f a
s where
f :: x -> LinearCombination r y
f x
x = case PSequence x (LinearCombination r y)
lcs forall (s :: * -> *) i x. Sequence s i x => s x -> i -> Maybe x
?? x
x of
Just LinearCombination r y
lc -> LinearCombination r y
lc
Maybe (LinearCombination r y)
Nothing -> forall r a. [(r, a)] -> LinearCombination r a
LinearCombination []
amap (Cfs Set x
xs) a
s = forall r a.
(Semiring r, Ord a) =>
Set a -> SumSymbol r a -> Vector r
ssycfs Set x
xs a
s
amap (Ssy Set x
xs) a
v = forall r a.
(Semiring r, Commutative r, Entity a, Ord a) =>
Set a -> Vector r -> SumSymbol r a
cfsssy Set x
xs a
v
amap (HomMatrix Matrix r
m) a
v = forall r. Semiring r => Matrix r -> Vector r -> Vector r
vecAppl Matrix r
m a
v
instance (Semiring r, Commutative r) => Morphism (HomSymbol r) where
type ObjectClass (HomSymbol r) = Vec r
homomorphous :: forall x y.
HomSymbol r x y -> Homomorphous (ObjectClass (HomSymbol r)) x y
homomorphous HomSymbol r x y
m = case HomSymbol r x y
m of
HomSymbol PSequence x (LinearCombination r y)
_ -> forall s x. Structure s x => Struct s x
Struct forall s x y. Struct s x -> Struct s y -> Homomorphous s x y
:>: forall s x. Structure s x => Struct s x
Struct
Cfs Set x
_ -> forall s x. Structure s x => Struct s x
Struct forall s x y. Struct s x -> Struct s y -> Homomorphous s x y
:>: forall s x. Structure s x => Struct s x
Struct
Ssy Set x
_ -> forall s x. Structure s x => Struct s x
Struct forall s x y. Struct s x -> Struct s y -> Homomorphous s x y
:>: forall s x. Structure s x => Struct s x
Struct
HomMatrix Matrix r
_ -> forall s x. Structure s x => Struct s x
Struct forall s x y. Struct s x -> Struct s y -> Homomorphous s x y
:>: forall s x. Structure s x => Struct s x
Struct
instance (Semiring r, Commutative r) => EmbeddableMorphism (HomSymbol r) Fbr
instance (Semiring r, Commutative r) => EmbeddableMorphism (HomSymbol r) Typ
instance (Semiring r, Commutative r) => EmbeddableMorphismTyp (HomSymbol r)
instance (Semiring r, Commutative r) => HomFibred (HomSymbol r) where
rmap :: forall a b. HomSymbol r a b -> Root a -> Root b
rmap (HomSymbol PSequence x (LinearCombination r y)
_) = forall b a. b -> a -> b
const ()
rmap (Cfs Set x
_) = forall b a. b -> a -> b
const ()
rmap (Ssy Set x
_) = forall b a. b -> a -> b
const ()
rmap (HomMatrix Matrix r
_) = forall b a. b -> a -> b
const ()
instance (Semiring r, Commutative r) => EmbeddableMorphism (HomSymbol r) Add
instance (Semiring r, Commutative r) => HomAdditive (HomSymbol r)
instance (Semiring r, Commutative r) => EmbeddableMorphism (HomSymbol r) (Vec r)
instance (Semiring r, Commutative r) => HomVectorial r (HomSymbol r)
data Representable r h x y where
Representable :: (Hom (Vec r) h, Entity x, Ord x, Entity y, Ord y)
=> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y
-> Representable r h (SumSymbol r x) (SumSymbol r y)
instance Show (Representable r h x y) where
show :: Representable r h x y -> String
show (Representable h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys)
= String
"Representable " forall a. [a] -> [a] -> [a]
++ forall (h :: * -> * -> *) a b. Show2 h => h a b -> String
show2 h (SumSymbol r x) (SumSymbol r y)
h forall a. [a] -> [a] -> [a]
++ String
" (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Set x
xs forall a. [a] -> [a] -> [a]
++ String
") (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Set y
ys forall a. [a] -> [a] -> [a]
++ String
")"
instance Validable (Representable r h x y) where
valid :: Representable r h x y -> Statement
valid (Representable h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys) = String -> Label
Label String
"Representable"
Label -> Statement -> Statement
:<=>: forall r (h :: * -> * -> *) x y.
(Hom (Vec r) h, Entity x, Ord x, Ord y) =>
Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Statement
vldsVec (forall s t x y.
Transformable s t =>
Homomorphous s x y -> Homomorphous t x y
tauHom (forall (m :: * -> * -> *) x y.
Morphism m =>
m x y -> Homomorphous (ObjectClass m) x y
homomorphous h (SumSymbol r x) (SumSymbol r y)
h)) h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys where
vldsVec :: (Hom (Vec r) h, Entity x, Ord x, Ord y)
=> Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Statement
vldsVec :: forall r (h :: * -> * -> *) x y.
(Hom (Vec r) h, Entity x, Ord x, Ord y) =>
Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Statement
vldsVec (Struct (Vec r) (SumSymbol r x)
Struct :>: Struct (Vec r) (SumSymbol r y)
_) h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys = forall r (h :: * -> * -> *) x y.
(Semiring r, Commutative r, Hom (Vec r) h, Entity x, Ord x,
Ord y) =>
h (SumSymbol r x) (SumSymbol r y) -> [(x, N)] -> Set y -> Statement
vlds h (SumSymbol r x) (SumSymbol r y)
h (forall (s :: * -> *) x. Sequence s N x => s x -> [(x, N)]
listN Set x
xs) Set y
ys
vlds :: (Semiring r, Commutative r, Hom (Vec r) h, Entity x, Ord x, Ord y)
=> h (SumSymbol r x) (SumSymbol r y) -> [(x,N)] -> Set y -> Statement
vlds :: forall r (h :: * -> * -> *) x y.
(Semiring r, Commutative r, Hom (Vec r) h, Entity x, Ord x,
Ord y) =>
h (SumSymbol r x) (SumSymbol r y) -> [(x, N)] -> Set y -> Statement
vlds h (SumSymbol r x) (SumSymbol r y)
_ [] Set y
_ = Statement
SValid
vlds h (SumSymbol r x) (SumSymbol r y)
h ((x
x,N
j):[(x, N)]
xjs) Set y
ys = forall y r.
Ord y =>
N -> LinearCombination r y -> Set y -> Statement
vld N
j (forall r a. Semiring r => SumSymbol r a -> LinearCombination r a
ssylc forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ h (SumSymbol r x) (SumSymbol r y)
h forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a.
(Semiring r, Commutative r, Entity a, Ord a) =>
a -> SumSymbol r a
sy x
x) Set y
ys forall b. Boolean b => b -> b -> b
&& forall r (h :: * -> * -> *) x y.
(Semiring r, Commutative r, Hom (Vec r) h, Entity x, Ord x,
Ord y) =>
h (SumSymbol r x) (SumSymbol r y) -> [(x, N)] -> Set y -> Statement
vlds h (SumSymbol r x) (SumSymbol r y)
h [(x, N)]
xjs Set y
ys
vld :: Ord y => N -> LinearCombination r y -> Set y -> Statement
vld :: forall y r.
Ord y =>
N -> LinearCombination r y -> Set y -> Statement
vld N
j LinearCombination r y
l Set y
ys = ((forall x. [x] -> Set x
Set forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 forall a b. (a, b) -> b
snd forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a. LinearCombination r a -> [(r, a)]
lcs LinearCombination r y
l) forall x. Ord x => Set x -> Set x -> Bool
`isSubSet` Set y
ys)
Bool -> Message -> Statement
:?> [Parameter] -> Message
Params [String
"j"String -> String -> Parameter
:=forall a. Show a => a -> String
show N
j]
repMatricVec :: (Hom (Vec r) h, Entity x, Ord x, Ord y)
=> Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Matrix r
repMatricVec :: forall r (h :: * -> * -> *) x y.
(Hom (Vec r) h, Entity x, Ord x, Ord y) =>
Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Matrix r
repMatricVec (Struct (Vec r) (SumSymbol r x)
Struct :>: Struct (Vec r) (SumSymbol r y)
Struct) h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys = forall x. Dim' x -> Dim' x -> Entries N N x -> Matrix x
Matrix Dim r (Point r)
r Dim r (Point r)
c Entries N N r
ets where
r :: Dim r (Point r)
r = forall p x. (Entity p, p ~ Point x) => p -> Dim x p
dim forall s. Singleton s => s
unit forall f. Exponential f => f -> Exponent f -> f
^ forall x. LengthN x => x -> N
lengthN Set y
ys
c :: Dim r (Point r)
c = forall p x. (Entity p, p ~ Point x) => p -> Dim x p
dim forall s. Singleton s => s
unit forall f. Exponential f => f -> Exponent f -> f
^ forall x. LengthN x => x -> N
lengthN Set x
xs
ets :: Entries N N r
ets = forall i j x. (Ord i, Ord j) => Row j (Col i x) -> Entries i j x
rcets forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x j. (x -> Bool) -> Row j x -> Row j x
rowFilter (forall b. Boolean b => b -> b
notforall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
.forall i x. Col i x -> Bool
colIsEmpty) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r x y.
(Semiring r, Commutative r, Entity x, Ord x) =>
(SumSymbol r x -> SumSymbol r y)
-> (y -> Maybe N) -> [(x, N)] -> Row N (Col N r)
rc (forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
amap h (SumSymbol r x) (SumSymbol r y)
h) (forall x. Ord x => Set x -> x -> Maybe N
setIndex Set y
ys) (forall (s :: * -> *) x. Sequence s N x => s x -> [(x, N)]
listN Set x
xs)
rc :: (Semiring r, Commutative r, Entity x, Ord x)
=> (SumSymbol r x -> SumSymbol r y) -> (y -> Maybe N) -> [(x,N)] -> Row N (Col N r)
rc :: forall r x y.
(Semiring r, Commutative r, Entity x, Ord x) =>
(SumSymbol r x -> SumSymbol r y)
-> (y -> Maybe N) -> [(x, N)] -> Row N (Col N r)
rc SumSymbol r x -> SumSymbol r y
h y -> Maybe N
iy = forall j x. PSequence j x -> Row j x
Row forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall i x. [(x, i)] -> PSequence i x
PSequence forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall r x y j.
(Semiring r, Commutative r, Entity x, Ord x) =>
(SumSymbol r x -> SumSymbol r y)
-> (y -> Maybe N) -> [(x, j)] -> [(Col N r, j)]
cls SumSymbol r x -> SumSymbol r y
h y -> Maybe N
iy
cls :: (Semiring r, Commutative r, Entity x, Ord x)
=> (SumSymbol r x -> SumSymbol r y) -> (y -> Maybe N) -> [(x,j)] -> [(Col N r,j)]
cls :: forall r x y j.
(Semiring r, Commutative r, Entity x, Ord x) =>
(SumSymbol r x -> SumSymbol r y)
-> (y -> Maybe N) -> [(x, j)] -> [(Col N r, j)]
cls SumSymbol r x -> SumSymbol r y
_ y -> Maybe N
_ [] = []
cls SumSymbol r x -> SumSymbol r y
h y -> Maybe N
iy ((x
x,j
j):[(x, j)]
xjs) = (forall r y.
Semiring r =>
(y -> Maybe N) -> SumSymbol r y -> Col N r
cl y -> Maybe N
iy (SumSymbol r x -> SumSymbol r y
h forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a.
(Semiring r, Commutative r, Entity a, Ord a) =>
a -> SumSymbol r a
sy x
x),j
j)forall a. a -> [a] -> [a]
:forall r x y j.
(Semiring r, Commutative r, Entity x, Ord x) =>
(SumSymbol r x -> SumSymbol r y)
-> (y -> Maybe N) -> [(x, j)] -> [(Col N r, j)]
cls SumSymbol r x -> SumSymbol r y
h y -> Maybe N
iy [(x, j)]
xjs
cl :: Semiring r => (y -> Maybe N) -> SumSymbol r y -> Col N r
cl :: forall r y.
Semiring r =>
(y -> Maybe N) -> SumSymbol r y -> Col N r
cl y -> Maybe N
iy SumSymbol r y
sy
= forall i x. PSequence i x -> Col i x
Col
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x. [(x, i)] -> PSequence i x
PSequence
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall b a. Ord b => [(a, b)] -> [(a, b)]
sortSnd
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 (\(r
r,y
y) -> (r
r,forall a. HasCallStack => Maybe a -> a
fromJust forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ y -> Maybe N
iy y
y))
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a. LinearCombination r a -> [(r, a)]
lcs
forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r a. Semiring r => SumSymbol r a -> LinearCombination r a
ssylc SumSymbol r y
sy
repMatrix :: Representable r h x y -> Matrix r
repMatrix :: forall r (h :: * -> * -> *) x y. Representable r h x y -> Matrix r
repMatrix (Representable h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys) = forall r (h :: * -> * -> *) x y.
(Hom (Vec r) h, Entity x, Ord x, Ord y) =>
Homomorphous (Vec r) (SumSymbol r x) (SumSymbol r y)
-> h (SumSymbol r x) (SumSymbol r y) -> Set x -> Set y -> Matrix r
repMatricVec (forall s t x y.
Transformable s t =>
Homomorphous s x y -> Homomorphous t x y
tauHom (forall (m :: * -> * -> *) x y.
Morphism m =>
m x y -> Homomorphous (ObjectClass m) x y
homomorphous h (SumSymbol r x) (SumSymbol r y)
h)) h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys
mtxHomSymbol :: Matrix r -> HomSymbol r (SumSymbol r N) (SumSymbol r N)
mtxHomSymbol :: forall r. Matrix r -> HomSymbol r (SumSymbol r N) (SumSymbol r N)
mtxHomSymbol Matrix r
m = forall x y r.
(Entity x, Ord x, Entity y, Ord y) =>
PSequence x (LinearCombination r y)
-> HomSymbol r (SumSymbol r x) (SumSymbol r y)
HomSymbol forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r. Matrix r -> PSequence N (LinearCombination r N)
d Matrix r
m where
d :: Matrix r -> PSequence N (LinearCombination r N)
d :: forall r. Matrix r -> PSequence N (LinearCombination r N)
d = forall i x. [(x, i)] -> PSequence i x
PSequence forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall j x. Row j x -> [(x, j)]
rowxs forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 forall r. Col N r -> LinearCombination r N
collc forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall i j x. (Ord i, Ord j) => Entries i j x -> Row j (Col i x)
etsrc forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall x. Matrix x -> Entries N N x
mtxxs
collc :: Col N r -> LinearCombination r N
collc :: forall r. Col N r -> LinearCombination r N
collc = forall r a. [(r, a)] -> LinearCombination r a
LinearCombination forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall i x. Col i x -> [(x, i)]
colxs
mtxRepresentable :: (Semiring r, Commutative r)
=> Matrix r -> Representable r (HomSymbol r) (SumSymbol r N) (SumSymbol r N)
mtxRepresentable :: forall r.
(Semiring r, Commutative r) =>
Matrix r
-> Representable r (HomSymbol r) (SumSymbol r N) (SumSymbol r N)
mtxRepresentable Matrix r
m = forall r (h :: * -> * -> *) x y.
(Hom (Vec r) h, Entity x, Ord x, Entity y, Ord y) =>
h (SumSymbol r x) (SumSymbol r y)
-> Set x
-> Set y
-> Representable r h (SumSymbol r x) (SumSymbol r y)
Representable (forall r. Matrix r -> HomSymbol r (SumSymbol r N) (SumSymbol r N)
mtxHomSymbol Matrix r
m) (forall x. [x] -> Set x
Set [N
0..N
c]) (forall x. [x] -> Set x
Set [N
0..N
r]) where
c :: N
c = forall x. LengthN x => x -> N
lengthN forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x p. Dim x p -> ProductSymbol p
fromDim forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x. Matrix x -> Dim' x
cols Matrix r
m
r :: N
r = forall x. LengthN x => x -> N
lengthN forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x p. Dim x p -> ProductSymbol p
fromDim forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x. Matrix x -> Dim' x
rows Matrix r
m
xVecN :: Semiring r => N -> X r -> X (Vector r)
xVecN :: forall r. Semiring r => N -> X r -> X (Vector r)
xVecN N
0 X r
_ = forall (m :: * -> *) a. Monad m => a -> m a
return forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r. Semiring r => [(r, N)] -> Vector r
vector []
xVecN N
n X r
xr = forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 forall r. Semiring r => [(r, N)] -> Vector r
vector forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ N -> X [(r, N)]
xri N
5 where
xri :: N -> X [(r, N)]
xri N
m = forall x. N -> N -> X x -> X [x]
xTakeB N
0 (N
mforall c. Multiplicative c => c -> c -> c
*N
n) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall a b. X a -> X b -> X (a, b)
xTupple2 X r
xr (N -> N -> X N
xNB N
0 (forall a. Enum a => a -> a
pred N
n))
dstVecMax :: Semiring r => Int -> N -> X r -> IO ()
dstVecMax :: forall r. Semiring r => Int -> N -> X r -> IO ()
dstVecMax Int
d N
n X r
xr = IO Omega
getOmega forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall x. (Show x, Ord x) => Int -> X x -> Omega -> IO ()
putDistribution Int
d (forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 (forall x. LengthN x => x -> N
lengthN forall (c :: * -> * -> *) y z x.
Category c =>
c y z -> c x y -> c x z
. forall r. Vector r -> PSequence N r
vecpsq) forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r. Semiring r => N -> X r -> X (Vector r)
xVecN N
n X r
xr)
prpRepMatrix :: (Semiring r, Commutative r) => Representable r h x y -> Vector r -> Statement
prpRepMatrix :: forall r (h :: * -> * -> *) x y.
(Semiring r, Commutative r) =>
Representable r h x y -> Vector r -> Statement
prpRepMatrix p :: Representable r h x y
p@(Representable h (SumSymbol r x) (SumSymbol r y)
h Set x
xs Set y
ys) Vector r
v = String -> Label
Prp String
"RepMatrix" Label -> Statement -> Statement
:<=>:
[Statement] -> Statement
And [ String -> Label
Label String
"1" Label -> Statement -> Statement
:<=>: (Closer N
mi forall a. Ord a => a -> a -> Bool
< (forall x. x -> Closer x
It forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x. LengthN x => x -> N
lengthN Set y
ys))
Bool -> Message -> Statement
:?> [Parameter] -> Message
Params [String
"h' $ v"String -> String -> Parameter
:=forall a. Show a => a -> String
show Vector r
w,String
"max index"String -> String -> Parameter
:=forall a. Show a => a -> String
show Closer N
mi]
, String -> Label
Label String
"2" Label -> Statement -> Statement
:<=>: ((forall x r.
(Entity x, Ord x) =>
Set x -> HomSymbol r (Vector r) (SumSymbol r x)
Ssy Set y
ys forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ Vector r
w) forall a. Eq a => a -> a -> Bool
== (h (SumSymbol r x) (SumSymbol r y)
h forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall x r.
(Entity x, Ord x) =>
Set x -> HomSymbol r (Vector r) (SumSymbol r x)
Ssy Set x
xs forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ Vector r
v))
Bool -> Message -> Statement
:?> [Parameter] -> Message
Params [String
"p"String -> String -> Parameter
:=forall a. Show a => a -> String
show Representable r h x y
p,String
"h'"String -> String -> Parameter
:=forall a. Show a => a -> String
show HomSymbol r (Vector r) (Vector r)
h',String
"v"String -> String -> Parameter
:=forall a. Show a => a -> String
show Vector r
v]
]
where h' :: HomSymbol r (Vector r) (Vector r)
h' = forall r. Matrix r -> HomSymbol r (Vector r) (Vector r)
HomMatrix forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r (h :: * -> * -> *) x y. Representable r h x y -> Matrix r
repMatrix Representable r h x y
p
w :: Vector r
w = HomSymbol r (Vector r) (Vector r)
h' forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ Vector r
v
mi :: Closer N
mi = forall x. Ord x => [x] -> Closer x
cmax forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 forall a b. (a, b) -> b
snd forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall i x. PSequence i x -> [(x, i)]
psqxs forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall r. Vector r -> PSequence N r
vecpsq Vector r
w
prpRepMatrixZ :: N -> N -> Statement
prpRepMatrixZ :: N -> N -> Statement
prpRepMatrixZ N
n N
m = forall x. X x -> (x -> Statement) -> Statement
Forall X (Representable Z (HomSymbol Z) (SumSymbol Z N) (SumSymbol Z N),
Vector Z)
xrv (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall r (h :: * -> * -> *) x y.
(Semiring r, Commutative r) =>
Representable r h x y -> Vector r -> Statement
prpRepMatrix) where
xrv :: X (Representable Z (HomSymbol Z) (SumSymbol Z N) (SumSymbol Z N),
Vector Z)
xrv = forall a b. X a -> X b -> X (a, b)
xTupple2 X (Representable Z (HomSymbol Z) (SumSymbol Z N) (SumSymbol Z N))
xr X (Vector Z)
xv
xr :: X (Representable Z (HomSymbol Z) (SumSymbol Z N) (SumSymbol Z N))
xr = forall (h :: * -> * -> *) (f :: * -> *) a b.
Applicative1 h f =>
h a b -> f a -> f b
amap1 forall r.
(Semiring r, Commutative r) =>
Matrix r
-> Representable r (HomSymbol r) (SumSymbol r N) (SumSymbol r N)
mtxRepresentable forall (h :: * -> * -> *) a b. Applicative h => h a b -> a -> b
$ forall q. XOrtOrientation q -> Orientation (Point q) -> X q
xoArrow XOrtOrientation (Matrix Z)
xodZ (Dim Z ()
c forall p. p -> p -> Orientation p
:> Dim Z ()
r)
c :: Dim Z ()
c = forall p x. (Entity p, p ~ Point x) => p -> Dim x p
dim () forall f. Exponential f => f -> Exponent f -> f
^ N
m
r :: Dim Z ()
r = forall p x. (Entity p, p ~ Point x) => p -> Dim x p
dim () forall f. Exponential f => f -> Exponent f -> f
^ N
n
xv :: X (Vector Z)
xv = forall r. Semiring r => N -> X r -> X (Vector r)
xVecN N
m (Z -> Z -> X Z
xZB (-Z
100) Z
100)