{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Numeric.LinearAlgebra.Static(
โ, R,
vec2, vec3, vec4, (&), (#), split, headTail,
vector,
linspace, range, dim,
L, Sq, build,
row, col, (|||),(===), splitRows, splitCols,
unrow, uncol,
tr,
eye,
diag,
blockAt,
matrix,
โ, C, M, Her, her, ๐,
toComplex,
fromComplex,
complex,
real,
imag,
sqMagnitude,
magnitude,
(<>),(#>),(<.>),
linSolve, (<\>),
svd, withCompactSVD, svdTall, svdFlat, Eigen(..),
withNullspace, withOrth, qr, chol,
Normed(..),
Seed, RandDist(..),
randomVector, rand, randn, gaussianSample, uniformSample,
mean, meanCov,
Disp(..), Domain(..),
withVector, withMatrix, exactLength, exactDims,
toRows, toColumns, withRows, withColumns,
Sized(..), Diag(..), Sym, sym, mTm, unSym, (<ยท>)
) where
import GHC.TypeLits
import Numeric.LinearAlgebra hiding (
(<>),(#>),(<.>),Konst(..),diag, disp,(===),(|||),
row,col,vector,matrix,linspace,toRows,toColumns,
(<\>),fromList,takeDiag,svd,eig,eigSH,
eigenvalues,eigenvaluesSH,build,
qr,size,dot,chol,range,R,C,sym,mTm,unSym,
randomVector,rand,randn,gaussianSample,uniformSample,meanCov,
toComplex, fromComplex, complex, real, magnitude
)
import qualified Numeric.LinearAlgebra as LA
import qualified Numeric.LinearAlgebra.Devel as LA
import Data.Proxy(Proxy(..))
import Internal.Static
import Control.Arrow((***))
import Text.Printf
import Data.Type.Equality ((:~:)(Refl))
import qualified Data.Bifunctor as BF (first)
#if MIN_VERSION_base(4,11,0)
import Prelude hiding ((<>))
#endif
ud1 :: R n -> Vector โ
ud1 :: R n -> Vector โ
ud1 (R (Dim Vector โ
v)) = Vector โ
v
infixl 4 &
(&) :: forall n . KnownNat n
=> R n -> โ -> R (n+1)
R n
u & :: R n -> โ -> R (n + 1)
& โ
x = R n
u R n -> R 1 -> R (n + 1)
forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
R n -> R m -> R (n + m)
# (โ -> R 1
forall t s (d :: * -> *). Sized t s d => t -> s
konst โ
x :: R 1)
infixl 4 #
(#) :: forall n m . (KnownNat n, KnownNat m)
=> R n -> R m -> R (n+m)
(R Dim n (Vector โ)
u) # :: R n -> R m -> R (n + m)
# (R Dim m (Vector โ)
v) = Dim (n + m) (Vector โ) -> R (n + m)
forall (n :: Nat). Dim n (Vector โ) -> R n
R (Dim n (Vector โ) -> Dim m (Vector โ) -> Dim (n + m) (Vector โ)
forall (n :: Nat) (m :: Nat) t.
(KnownNat n, KnownNat m, Numeric t) =>
V n t -> V m t -> V (n + m) t
vconcat Dim n (Vector โ)
u Dim m (Vector โ)
v)
vec2 :: โ -> โ -> R 2
vec2 :: โ -> โ -> R 2
vec2 โ
a โ
b = Dim 2 (Vector โ) -> R 2
forall (n :: Nat). Dim n (Vector โ) -> R n
R (โ -> โ -> Dim 2 (Vector โ)
forall t. Storable t => t -> t -> V 2 t
gvec2 โ
a โ
b)
vec3 :: โ -> โ -> โ -> R 3
vec3 :: โ -> โ -> โ -> R 3
vec3 โ
a โ
b โ
c = Dim 3 (Vector โ) -> R 3
forall (n :: Nat). Dim n (Vector โ) -> R n
R (โ -> โ -> โ -> Dim 3 (Vector โ)
forall t. Storable t => t -> t -> t -> V 3 t
gvec3 โ
a โ
b โ
c)
vec4 :: โ -> โ -> โ -> โ -> R 4
vec4 :: โ -> โ -> โ -> โ -> R 4
vec4 โ
a โ
b โ
c โ
d = Dim 4 (Vector โ) -> R 4
forall (n :: Nat). Dim n (Vector โ) -> R n
R (โ -> โ -> โ -> โ -> Dim 4 (Vector โ)
forall t. Storable t => t -> t -> t -> t -> V 4 t
gvec4 โ
a โ
b โ
c โ
d)
vector :: KnownNat n => [โ] -> R n
vector :: [โ] -> R n
vector = [โ] -> R n
forall t s (d :: * -> *). Sized t s d => [t] -> s
fromList
matrix :: (KnownNat m, KnownNat n) => [โ] -> L m n
matrix :: [โ] -> L m n
matrix = [โ] -> L m n
forall t s (d :: * -> *). Sized t s d => [t] -> s
fromList
linspace :: forall n . KnownNat n => (โ,โ) -> R n
linspace :: (โ, โ) -> R n
linspace (โ
a,โ
b) = R n
v
where
v :: R n
v = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Int -> (โ, โ) -> Vector โ
forall e.
(Fractional e, Container Vector e) =>
Int -> (e, e) -> Vector e
LA.linspace (R n -> IndexOf Vector
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
v) (โ
a,โ
b))
range :: forall n . KnownNat n => R n
range :: R n
range = R n
v
where
v :: R n
v = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Int -> (โ, โ) -> Vector โ
forall e.
(Fractional e, Container Vector e) =>
Int -> (e, e) -> Vector e
LA.linspace Int
d (โ
1,Int -> โ
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
d))
d :: Int
d = R n -> IndexOf Vector
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
v
dim :: forall n . KnownNat n => R n
dim :: R n
dim = R n
v
where
v :: R n
v = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (โ -> Vector โ
forall (c :: * -> *) e. Container c e => e -> c e
scalar (Int -> โ
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> โ) -> Int -> โ
forall a b. (a -> b) -> a -> b
$ R n -> IndexOf Vector
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
v))
ud2 :: L m n -> Matrix โ
ud2 :: L m n -> Matrix โ
ud2 (L (Dim (Dim Matrix โ
x))) = Matrix โ
x
diag :: KnownNat n => R n -> Sq n
diag :: R n -> Sq n
diag = โ -> R n -> Sq n
forall field (vec :: Nat -> *) (mat :: Nat -> Nat -> *) (m :: Nat)
(n :: Nat) (k :: Nat).
(Domain field vec mat, KnownNat m, KnownNat n, KnownNat k) =>
field -> vec k -> mat m n
diagR โ
0
eye :: KnownNat n => Sq n
eye :: Sq n
eye = R n -> Sq n
forall (n :: Nat). KnownNat n => R n -> Sq n
diag R n
1
blockAt :: forall m n . (KnownNat m, KnownNat n) => โ -> Int -> Int -> Matrix Double -> L m n
blockAt :: โ -> Int -> Int -> Matrix โ -> L m n
blockAt โ
x Int
r Int
c Matrix โ
a = L m n
res
where
z :: Matrix โ
z = โ -> Matrix โ
forall (c :: * -> *) e. Container c e => e -> c e
scalar โ
x
z1 :: Matrix โ
z1 = โ -> (Int, Int) -> Matrix โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
x (Int
r,Int
c)
z2 :: Matrix โ
z2 = โ -> (Int, Int) -> Matrix โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
x (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
m'Int -> Int -> Int
forall a. Num a => a -> a -> a
-(Int
raInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
r)), Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
n'Int -> Int -> Int
forall a. Num a => a -> a -> a
-(Int
caInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
c)))
ra :: Int
ra = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Matrix โ -> Int
forall t. Matrix t -> Int
rows Matrix โ
a) (Int -> Int) -> (Int -> Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
m'Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
r
ca :: Int
ca = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a) (Int -> Int) -> (Int -> Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
n'Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
c
sa :: Matrix โ
sa = (Int, Int) -> (Int, Int) -> Matrix โ -> Matrix โ
forall a.
Element a =>
(Int, Int) -> (Int, Int) -> Matrix a -> Matrix a
subMatrix (Int
0,Int
0) (Int
ra, Int
ca) Matrix โ
a
(Int
m',Int
n') = L m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
res
res :: L m n
res = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> Matrix โ -> L m n
forall a b. (a -> b) -> a -> b
$ [[Matrix โ]] -> Matrix โ
forall t. Element t => [[Matrix t]] -> Matrix t
fromBlocks [[Matrix โ
z1,Matrix โ
z,Matrix โ
z],[Matrix โ
z,Matrix โ
sa,Matrix โ
z],[Matrix โ
z,Matrix โ
z,Matrix โ
z2]]
row :: R n -> L 1 n
row :: R n -> L 1 n
row = Matrix โ -> L 1 n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L 1 n) -> (R n -> Matrix โ) -> R n -> L 1 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector โ -> Matrix โ
forall a. Storable a => Vector a -> Matrix a
asRow (Vector โ -> Matrix โ) -> (R n -> Vector โ) -> R n -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1
col :: R n -> L n 1
col R n
v = L 1 n -> L n 1
forall m mt. Transposable m mt => m -> mt
tr (L 1 n -> L n 1) -> (R n -> L 1 n) -> R n -> L n 1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> L 1 n
forall (n :: Nat). R n -> L 1 n
row (R n -> L n 1) -> R n -> L n 1
forall a b. (a -> b) -> a -> b
$ R n
v
unrow :: L 1 n -> R n
unrow :: L 1 n -> R n
unrow = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Vector โ -> R n) -> (L 1 n -> Vector โ) -> L 1 n -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Vector โ] -> Vector โ
forall a. [a] -> a
head ([Vector โ] -> Vector โ)
-> (L 1 n -> [Vector โ]) -> L 1 n -> Vector โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> [Vector โ]
forall t. Element t => Matrix t -> [Vector t]
LA.toRows (Matrix โ -> [Vector โ])
-> (L 1 n -> Matrix โ) -> L 1 n -> [Vector โ]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L 1 n -> Matrix โ
forall (m :: Nat) (n :: Nat). L m n -> Matrix โ
ud2
uncol :: L n 1 -> R n
uncol L n 1
v = L 1 n -> R n
forall (n :: Nat). L 1 n -> R n
unrow (L 1 n -> R n) -> (L n 1 -> L 1 n) -> L n 1 -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L n 1 -> L 1 n
forall m mt. Transposable m mt => m -> mt
tr (L n 1 -> R n) -> L n 1 -> R n
forall a b. (a -> b) -> a -> b
$ L n 1
v
infixl 2 ===
(===) :: (KnownNat r1, KnownNat r2, KnownNat c) => L r1 c -> L r2 c -> L (r1+r2) c
L r1 c
a === :: L r1 c -> L r2 c -> L (r1 + r2) c
=== L r2 c
b = Matrix โ -> L (r1 + r2) c
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (L r1 c -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L r1 c
a Matrix โ -> Matrix โ -> Matrix โ
forall t. Element t => Matrix t -> Matrix t -> Matrix t
LA.=== L r2 c -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L r2 c
b)
infixl 3 |||
L c r1
a ||| :: L c r1 -> L c r2 -> L c (r1 + r2)
||| L c r2
b = L (r1 + r2) c -> L c (r1 + r2)
forall m mt. Transposable m mt => m -> mt
tr (L c r1 -> L r1 c
forall m mt. Transposable m mt => m -> mt
tr L c r1
a L r1 c -> L r2 c -> L (r1 + r2) c
forall (r1 :: Nat) (r2 :: Nat) (c :: Nat).
(KnownNat r1, KnownNat r2, KnownNat c) =>
L r1 c -> L r2 c -> L (r1 + r2) c
=== L c r2 -> L r2 c
forall m mt. Transposable m mt => m -> mt
tr L c r2
b)
type Sq n = L n n
type GL = forall n m . (KnownNat n, KnownNat m) => L m n
type GSq = forall n . KnownNat n => Sq n
isKonst :: forall m n . (KnownNat m, KnownNat n) => L m n -> Maybe (โ,(Int,Int))
isKonst :: L m n -> Maybe (โ, (Int, Int))
isKonst s :: L m n
s@(L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Matrix โ
x)
| Matrix โ -> Bool
forall t. Matrix t -> Bool
singleM Matrix โ
x = (โ, (Int, Int)) -> Maybe (โ, (Int, Int))
forall a. a -> Maybe a
Just (Matrix โ
x Matrix โ -> IndexOf Matrix -> โ
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0), (L m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
s))
| Bool
otherwise = Maybe (โ, (Int, Int))
forall a. Maybe a
Nothing
isKonstC :: forall m n . (KnownNat m, KnownNat n) => M m n -> Maybe (โ,(Int,Int))
isKonstC :: M m n -> Maybe (โ, (Int, Int))
isKonstC s :: M m n
s@(M m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Matrix โ
x)
| Matrix โ -> Bool
forall t. Matrix t -> Bool
singleM Matrix โ
x = (โ, (Int, Int)) -> Maybe (โ, (Int, Int))
forall a. a -> Maybe a
Just (Matrix โ
x Matrix โ -> IndexOf Matrix -> โ
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0), (M m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size M m n
s))
| Bool
otherwise = Maybe (โ, (Int, Int))
forall a. Maybe a
Nothing
infixr 8 <>
(<>) :: forall m k n. (KnownNat m, KnownNat k, KnownNat n) => L m k -> L k n -> L m n
<> :: L m k -> L k n -> L m n
(<>) = L m k -> L k n -> L m n
forall (m :: Nat) (k :: Nat) (n :: Nat).
(KnownNat m, KnownNat k, KnownNat n) =>
L m k -> L k n -> L m n
mulR
infixr 8 #>
(#>) :: (KnownNat m, KnownNat n) => L m n -> R n -> R m
#> :: L m n -> R n -> R m
(#>) = L m n -> R n -> R m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> R n -> R m
appR
infixr 8 <ยท>
(<ยท>) :: KnownNat n => R n -> R n -> โ
<ยท> :: R n -> R n -> โ
(<ยท>) = R n -> R n -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
dotR
infixr 8 <.>
(<.>) :: KnownNat n => R n -> R n -> โ
<.> :: R n -> R n -> โ
(<.>) = R n -> R n -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
dotR
class Diag m d | m -> d
where
takeDiag :: m -> d
instance KnownNat n => Diag (L n n) (R n)
where
takeDiag :: L n n -> R n
takeDiag L n n
x = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Matrix โ -> Vector โ
forall t. Element t => Matrix t -> Vector t
LA.takeDiag (L n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L n n
x))
instance KnownNat n => Diag (M n n) (C n)
where
takeDiag :: M n n -> C n
takeDiag M n n
x = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC (Matrix โ -> Vector โ
forall t. Element t => Matrix t -> Vector t
LA.takeDiag (M n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract M n n
x))
toComplex :: KnownNat n => (R n, R n) -> C n
toComplex :: (R n, R n) -> C n
toComplex (R n
r,R n
i) = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC (Vector โ -> C n) -> Vector โ -> C n
forall a b. (a -> b) -> a -> b
$ (Vector โ, Vector โ) -> Vector โ
forall t (c :: * -> *).
(Convert t, Complexable c, RealElement t) =>
(c t, c t) -> c (Complex t)
LA.toComplex (R n -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R n
r, R n -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R n
i)
fromComplex :: KnownNat n => C n -> (R n, R n)
fromComplex :: C n -> (R n, R n)
fromComplex (C (Dim Vector โ
v)) = let (Vector โ
r,Vector โ
i) = Vector โ -> (Vector โ, Vector โ)
forall t (c :: * -> *).
(Convert t, Complexable c, RealElement t) =>
c (Complex t) -> (c t, c t)
LA.fromComplex Vector โ
v in (Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
r, Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
i)
complex :: KnownNat n => R n -> C n
complex :: R n -> C n
complex R n
r = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC (Vector โ -> C n) -> Vector โ -> C n
forall a b. (a -> b) -> a -> b
$ (Vector โ, Vector โ) -> Vector โ
forall t (c :: * -> *).
(Convert t, Complexable c, RealElement t) =>
(c t, c t) -> c (Complex t)
LA.toComplex (R n -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R n
r, โ -> Int -> Vector โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
0 (R n -> IndexOf Vector
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
r))
real :: KnownNat n => C n -> R n
real :: C n -> R n
real = (R n, R n) -> R n
forall a b. (a, b) -> a
fst ((R n, R n) -> R n) -> (C n -> (R n, R n)) -> C n -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. C n -> (R n, R n)
forall (n :: Nat). KnownNat n => C n -> (R n, R n)
fromComplex
imag :: KnownNat n => C n -> R n
imag :: C n -> R n
imag = (R n, R n) -> R n
forall a b. (a, b) -> b
snd ((R n, R n) -> R n) -> (C n -> (R n, R n)) -> C n -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. C n -> (R n, R n)
forall (n :: Nat). KnownNat n => C n -> (R n, R n)
fromComplex
sqMagnitude :: KnownNat n => C n -> R n
sqMagnitude :: C n -> R n
sqMagnitude C n
c = let (R n
r,R n
i) = C n -> (R n, R n)
forall (n :: Nat). KnownNat n => C n -> (R n, R n)
fromComplex C n
c in R n
rR n -> R n -> R n
forall a. Floating a => a -> a -> a
**R n
2 R n -> R n -> R n
forall a. Num a => a -> a -> a
+ R n
iR n -> R n -> R n
forall a. Floating a => a -> a -> a
**R n
2
magnitude :: KnownNat n => C n -> R n
magnitude :: C n -> R n
magnitude = R n -> R n
forall a. Floating a => a -> a
sqrt (R n -> R n) -> (C n -> R n) -> C n -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. C n -> R n
forall (n :: Nat). KnownNat n => C n -> R n
sqMagnitude
linSolve :: (KnownNat m, KnownNat n) => L m m -> L m n -> Maybe (L m n)
linSolve :: L m m -> L m n -> Maybe (L m n)
linSolve (L m m -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
a) (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
b) = (Matrix โ -> L m n) -> Maybe (Matrix โ) -> Maybe (L m n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> Matrix โ -> Maybe (Matrix โ)
forall t. Field t => Matrix t -> Matrix t -> Maybe (Matrix t)
LA.linearSolve Matrix โ
a Matrix โ
b)
(<\>) :: (KnownNat m, KnownNat n, KnownNat r) => L m n -> L m r -> L n r
(L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
a) <\> :: L m n -> L m r -> L n r
<\> (L m r -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
b) = Matrix โ -> L n r
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ
a Matrix โ -> Matrix โ -> Matrix โ
forall (c :: * -> *) t.
(LSDiv c, Field t) =>
Matrix t -> c t -> c t
LA.<\> Matrix โ
b)
svd :: (KnownNat m, KnownNat n) => L m n -> (L m m, R n, L n n)
svd :: L m n -> (L m m, R n, L n n)
svd (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) = (Matrix โ -> L m m
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
u, Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
s', Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
v)
where
(Matrix โ
u,Vector โ
s,Matrix โ
v) = Matrix โ -> (Matrix โ, Vector โ, Matrix โ)
forall t. Field t => Matrix t -> (Matrix t, Vector โ, Matrix t)
LA.svd Matrix โ
m
s' :: Vector โ
s' = [Vector โ] -> Vector โ
forall t. Storable t => [Vector t] -> Vector t
vjoin [Vector โ
s, Vector โ
z]
z :: Vector โ
z = โ -> Int -> Vector โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
0 (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
m Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
s))
svdTall :: (KnownNat m, KnownNat n, n <= m) => L m n -> (L m n, R n, L n n)
svdTall :: L m n -> (L m n, R n, L n n)
svdTall (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) = (Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
u, Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
s, Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
v)
where
(Matrix โ
u,Vector โ
s,Matrix โ
v) = Matrix โ -> (Matrix โ, Vector โ, Matrix โ)
forall t. Field t => Matrix t -> (Matrix t, Vector โ, Matrix t)
LA.thinSVD Matrix โ
m
svdFlat :: (KnownNat m, KnownNat n, m <= n) => L m n -> (L m m, R m, L n m)
svdFlat :: L m n -> (L m m, R m, L n m)
svdFlat (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) = (Matrix โ -> L m m
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
u, Vector โ -> R m
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
s, Matrix โ -> L n m
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
v)
where
(Matrix โ
u,Vector โ
s,Matrix โ
v) = Matrix โ -> (Matrix โ, Vector โ, Matrix โ)
forall t. Field t => Matrix t -> (Matrix t, Vector โ, Matrix t)
LA.thinSVD Matrix โ
m
class Eigen m l v | m -> l, m -> v
where
eigensystem :: m -> (l,v)
eigenvalues :: m -> l
newtype Sym n = Sym (Sq n) deriving Int -> Sym n -> ShowS
[Sym n] -> ShowS
Sym n -> String
(Int -> Sym n -> ShowS)
-> (Sym n -> String) -> ([Sym n] -> ShowS) -> Show (Sym n)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (n :: Nat). KnownNat n => Int -> Sym n -> ShowS
forall (n :: Nat). KnownNat n => [Sym n] -> ShowS
forall (n :: Nat). KnownNat n => Sym n -> String
showList :: [Sym n] -> ShowS
$cshowList :: forall (n :: Nat). KnownNat n => [Sym n] -> ShowS
show :: Sym n -> String
$cshow :: forall (n :: Nat). KnownNat n => Sym n -> String
showsPrec :: Int -> Sym n -> ShowS
$cshowsPrec :: forall (n :: Nat). KnownNat n => Int -> Sym n -> ShowS
Show
sym :: KnownNat n => Sq n -> Sym n
sym :: Sq n -> Sym n
sym Sq n
m = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sym n) -> Sq n -> Sym n
forall a b. (a -> b) -> a -> b
$ (Sq n
m Sq n -> Sq n -> Sq n
forall a. Num a => a -> a -> a
+ Sq n -> Sq n
forall m mt. Transposable m mt => m -> mt
tr Sq n
m)Sq n -> Sq n -> Sq n
forall a. Fractional a => a -> a -> a
/Sq n
2
mTm :: (KnownNat m, KnownNat n) => L m n -> Sym n
mTm :: L m n -> Sym n
mTm L m n
x = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (L m n -> L n m
forall m mt. Transposable m mt => m -> mt
tr L m n
x L n m -> L m n -> Sq n
forall (m :: Nat) (k :: Nat) (n :: Nat).
(KnownNat m, KnownNat k, KnownNat n) =>
L m k -> L k n -> L m n
<> L m n
x)
unSym :: Sym n -> Sq n
unSym :: Sym n -> Sq n
unSym (Sym Sq n
x) = Sq n
x
๐ :: Sized โ s c => s
๐ :: s
๐ = โ -> s
forall t s (d :: * -> *). Sized t s d => t -> s
konst โ
iC
newtype Her n = Her (M n n)
her :: KnownNat n => M n n -> Her n
her :: M n n -> Her n
her M n n
m = M n n -> Her n
forall (n :: Nat). M n n -> Her n
Her (M n n -> Her n) -> M n n -> Her n
forall a b. (a -> b) -> a -> b
$ (M n n
m M n n -> M n n -> M n n
forall a. Num a => a -> a -> a
+ M n n -> M n n
forall m mt. Transposable m mt => m -> mt
LA.tr M n n
m)M n n -> M n n -> M n n
forall a. Fractional a => a -> a -> a
/M n n
2
instance (KnownNat n) => Disp (Sym n)
where
disp :: Int -> Sym n -> IO ()
disp Int
n (Sym Sq n
x) = do
let a :: Matrix โ
a = Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract Sq n
x
let su :: String
su = Int -> Matrix โ -> String
LA.dispf Int
n Matrix โ
a
String -> Int -> IO ()
forall r. PrintfType r => String -> r
printf String
"Sym %d" (Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr ((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=Char
'\n') ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
su)
instance (KnownNat n) => Disp (Her n)
where
disp :: Int -> Her n -> IO ()
disp Int
n (Her M n n
x) = do
let a :: Matrix โ
a = M n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract M n n
x
let su :: String
su = Int -> Matrix โ -> String
LA.dispcf Int
n Matrix โ
a
String -> Int -> IO ()
forall r. PrintfType r => String -> r
printf String
"Her %d" (Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr ((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=Char
'\n') ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
su)
instance KnownNat n => Eigen (Sym n) (R n) (L n n)
where
eigenvalues :: Sym n -> R n
eigenvalues (Sym (L n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m)) = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Vector โ -> R n) -> (Matrix โ -> Vector โ) -> Matrix โ -> R n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Herm โ -> Vector โ
forall t. Field t => Herm t -> Vector โ
LA.eigenvaluesSH (Herm โ -> Vector โ)
-> (Matrix โ -> Herm โ) -> Matrix โ -> Vector โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> Herm โ
forall t. Matrix t -> Herm t
LA.trustSym (Matrix โ -> R n) -> Matrix โ -> R n
forall a b. (a -> b) -> a -> b
$ Matrix โ
m
eigensystem :: Sym n -> (R n, L n n)
eigensystem (Sym (L n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m)) = (Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
l, Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
v)
where
(Vector โ
l,Matrix โ
v) = Herm โ -> (Vector โ, Matrix โ)
forall t. Field t => Herm t -> (Vector โ, Matrix t)
LA.eigSH (Herm โ -> (Vector โ, Matrix โ))
-> (Matrix โ -> Herm โ) -> Matrix โ -> (Vector โ, Matrix โ)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> Herm โ
forall t. Matrix t -> Herm t
LA.trustSym (Matrix โ -> (Vector โ, Matrix โ))
-> Matrix โ -> (Vector โ, Matrix โ)
forall a b. (a -> b) -> a -> b
$ Matrix โ
m
instance KnownNat n => Eigen (Sq n) (C n) (M n n)
where
eigenvalues :: Sq n -> C n
eigenvalues (Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC (Vector โ -> C n) -> (Matrix โ -> Vector โ) -> Matrix โ -> C n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> Vector โ
forall t. Field t => Matrix t -> Vector โ
LA.eigenvalues (Matrix โ -> C n) -> Matrix โ -> C n
forall a b. (a -> b) -> a -> b
$ Matrix โ
m
eigensystem :: Sq n -> (C n, M n n)
eigensystem (Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) = (Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC Vector โ
l, Matrix โ -> M n n
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM Matrix โ
v)
where
(Vector โ
l,Matrix โ
v) = Matrix โ -> (Vector โ, Matrix โ)
forall t. Field t => Matrix t -> (Vector โ, Matrix โ)
LA.eig Matrix โ
m
chol :: KnownNat n => Sym n -> Sq n
chol :: Sym n -> Sq n
chol (Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract (Sq n -> Matrix โ) -> (Sym n -> Sq n) -> Sym n -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sym n -> Sq n
forall (n :: Nat). Sym n -> Sq n
unSym -> Matrix โ
m) = Matrix โ -> Sq n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> Sq n) -> Matrix โ -> Sq n
forall a b. (a -> b) -> a -> b
$ Herm โ -> Matrix โ
forall t. Field t => Herm t -> Matrix t
LA.chol (Herm โ -> Matrix โ) -> Herm โ -> Matrix โ
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Herm โ
forall t. Matrix t -> Herm t
LA.trustSym Matrix โ
m
withNullspace
:: forall m n z . (KnownNat m, KnownNat n)
=> L m n
-> (forall k . (KnownNat k) => L n k -> z)
-> z
withNullspace :: L m n -> (forall (k :: Nat). KnownNat k => L n k -> z) -> z
withNullspace (Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.nullspace (Matrix โ -> Matrix โ) -> (L m n -> Matrix โ) -> L m n -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
a) forall (k :: Nat). KnownNat k => L n k -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy k)) -> L n n -> z
forall (k :: Nat). KnownNat k => L n k -> z
f (Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
a :: L n k)
withOrth
:: forall m n z . (KnownNat m, KnownNat n)
=> L m n
-> (forall k. (KnownNat k) => L n k -> z)
-> z
withOrth :: L m n -> (forall (k :: Nat). KnownNat k => L n k -> z) -> z
withOrth (Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.orth (Matrix โ -> Matrix โ) -> (L m n -> Matrix โ) -> L m n -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
a) forall (k :: Nat). KnownNat k => L n k -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy k)) -> L n n -> z
forall (k :: Nat). KnownNat k => L n k -> z
f (Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
a :: L n k)
withCompactSVD
:: forall m n z . (KnownNat m, KnownNat n)
=> L m n
-> (forall k . (KnownNat k) => (L m k, R k, L n k) -> z)
-> z
withCompactSVD :: L m n
-> (forall (k :: Nat). KnownNat k => (L m k, R k, L n k) -> z) -> z
withCompactSVD (Matrix โ -> (Matrix โ, Vector โ, Matrix โ)
forall t. Field t => Matrix t -> (Matrix t, Vector โ, Matrix t)
LA.compactSVD (Matrix โ -> (Matrix โ, Vector โ, Matrix โ))
-> (L m n -> Matrix โ) -> L m n -> (Matrix โ, Vector โ, Matrix โ)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> (Matrix โ
u,Vector โ
s,Matrix โ
v)) forall (k :: Nat). KnownNat k => (L m k, R k, L n k) -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
s of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy k)) -> (L m n, R n, L n n) -> z
forall (k :: Nat). KnownNat k => (L m k, R k, L n k) -> z
f (Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
u :: L m k, Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
s :: R k, Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
v :: L n k)
qr :: (KnownNat m, KnownNat n) => L m n -> (L m m, L m n)
qr :: L m n -> (L m m, L m n)
qr (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
x) = (Matrix โ -> L m m
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
q, Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
r)
where
(Matrix โ
q,Matrix โ
r) = Matrix โ -> (Matrix โ, Matrix โ)
forall t. Field t => Matrix t -> (Matrix t, Matrix t)
LA.qr Matrix โ
x
split :: forall p n . (KnownNat p, KnownNat n, p<=n) => R n -> (R p, R (n-p))
split :: R n -> (R p, R (n - p))
split (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
v) = ( Vector โ -> R p
forall (n :: Nat). Vector โ -> R n
mkR (Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 Int
p' Vector โ
v) ,
Vector โ -> R (n - p)
forall (n :: Nat). Vector โ -> R n
mkR (Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
p' (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
p') Vector โ
v) )
where
p' :: Int
p' = Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Int) -> (Proxy p -> Integer) -> Proxy p -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy p -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy p -> Int) -> Proxy p -> Int
forall a b. (a -> b) -> a -> b
$ (Proxy p
forall a. HasCallStack => a
undefined :: Proxy p) :: Int
headTail :: (KnownNat n, 1<=n) => R n -> (โ, R (n-1))
headTail :: R n -> (โ, R (n - 1))
headTail = ((Vector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
! Int
0) (Vector โ -> โ) -> (R 1 -> Vector โ) -> R 1 -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R 1 -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract (R 1 -> โ)
-> (R (n - 1) -> R (n - 1)) -> (R 1, R (n - 1)) -> (โ, R (n - 1))
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** R (n - 1) -> R (n - 1)
forall a. a -> a
id) ((R 1, R (n - 1)) -> (โ, R (n - 1)))
-> (R n -> (R 1, R (n - 1))) -> R n -> (โ, R (n - 1))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> (R 1, R (n - 1))
forall (p :: Nat) (n :: Nat).
(KnownNat p, KnownNat n, p <= n) =>
R n -> (R p, R (n - p))
split
splitRows :: forall p m n . (KnownNat p, KnownNat m, KnownNat n, p<=m) => L m n -> (L p n, L (m-p) n)
splitRows :: L m n -> (L p n, L (m - p) n)
splitRows (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
x) = ( Matrix โ -> L p n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Int -> Matrix โ -> Matrix โ
forall t. Element t => Int -> Matrix t -> Matrix t
takeRows Int
p' Matrix โ
x) ,
Matrix โ -> L (m - p) n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Int -> Matrix โ -> Matrix โ
forall t. Element t => Int -> Matrix t -> Matrix t
dropRows Int
p' Matrix โ
x) )
where
p' :: Int
p' = Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Int) -> (Proxy p -> Integer) -> Proxy p -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy p -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy p -> Int) -> Proxy p -> Int
forall a b. (a -> b) -> a -> b
$ (Proxy p
forall a. HasCallStack => a
undefined :: Proxy p) :: Int
splitCols :: forall p m n. (KnownNat p, KnownNat m, KnownNat n, KnownNat (n-p), p<=n) => L m n -> (L m p, L m (n-p))
splitCols :: L m n -> (L m p, L m (n - p))
splitCols = (L p m -> L m p
forall m mt. Transposable m mt => m -> mt
tr (L p m -> L m p)
-> (L (n - p) m -> L m (n - p))
-> (L p m, L (n - p) m)
-> (L m p, L m (n - p))
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** L (n - p) m -> L m (n - p)
forall m mt. Transposable m mt => m -> mt
tr) ((L p m, L (n - p) m) -> (L m p, L m (n - p)))
-> (L m n -> (L p m, L (n - p) m)) -> L m n -> (L m p, L m (n - p))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L n m -> (L p m, L (n - p) m)
forall (p :: Nat) (m :: Nat) (n :: Nat).
(KnownNat p, KnownNat m, KnownNat n, p <= m) =>
L m n -> (L p n, L (m - p) n)
splitRows (L n m -> (L p m, L (n - p) m))
-> (L m n -> L n m) -> L m n -> (L p m, L (n - p) m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> L n m
forall m mt. Transposable m mt => m -> mt
tr
toRows :: forall m n . (KnownNat m, KnownNat n) => L m n -> [R n]
toRows :: L m n -> [R n]
toRows (Matrix โ -> [Vector โ]
forall t. Element t => Matrix t -> [Vector t]
LA.toRows (Matrix โ -> [Vector โ])
-> (L m n -> Matrix โ) -> L m n -> [Vector โ]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> [Vector โ]
vs) = (Vector โ -> R n) -> [Vector โ] -> [R n]
forall a b. (a -> b) -> [a] -> [b]
map Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR [Vector โ]
vs
withRows
:: forall n z . KnownNat n
=> [R n]
-> (forall m . KnownNat m => L m n -> z)
-> z
withRows :: [R n] -> (forall (m :: Nat). KnownNat m => L m n -> z) -> z
withRows ([Vector โ] -> Matrix โ
forall t. Element t => [Vector t] -> Matrix t
LA.fromRows ([Vector โ] -> Matrix โ)
-> ([R n] -> [Vector โ]) -> [R n] -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (R n -> Vector โ) -> [R n] -> [Vector โ]
forall a b. (a -> b) -> [a] -> [b]
map R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) forall (m :: Nat). KnownNat m => L m n -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
LA.rows Matrix โ
m of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy m)) -> L n n -> z
forall (m :: Nat). KnownNat m => L m n -> z
f (Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
m :: L m n)
toColumns :: forall m n . (KnownNat m, KnownNat n) => L m n -> [R m]
toColumns :: L m n -> [R m]
toColumns (Matrix โ -> [Vector โ]
forall t. Element t => Matrix t -> [Vector t]
LA.toColumns (Matrix โ -> [Vector โ])
-> (L m n -> Matrix โ) -> L m n -> [Vector โ]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> [Vector โ]
vs) = (Vector โ -> R m) -> [Vector โ] -> [R m]
forall a b. (a -> b) -> [a] -> [b]
map Vector โ -> R m
forall (n :: Nat). Vector โ -> R n
mkR [Vector โ]
vs
withColumns
:: forall m z . KnownNat m
=> [R m]
-> (forall n . KnownNat n => L m n -> z)
-> z
withColumns :: [R m] -> (forall (n :: Nat). KnownNat n => L m n -> z) -> z
withColumns ([Vector โ] -> Matrix โ
forall t. Element t => [Vector t] -> Matrix t
LA.fromColumns ([Vector โ] -> Matrix โ)
-> ([R m] -> [Vector โ]) -> [R m] -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (R m -> Vector โ) -> [R m] -> [Vector โ]
forall a b. (a -> b) -> [a] -> [b]
map R m -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
m) forall (n :: Nat). KnownNat n => L m n -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
LA.cols Matrix โ
m of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy n)) -> L m n -> z
forall (n :: Nat). KnownNat n => L m n -> z
f (Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
m :: L m n)
build
:: forall m n . (KnownNat n, KnownNat m)
=> (โ -> โ -> โ)
-> L m n
build :: (โ -> โ -> โ) -> L m n
build โ -> โ -> โ
f = L m n
r
where
r :: L m n
r = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> Matrix โ -> L m n
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> (โ -> โ -> โ) -> Matrix โ
forall d f (c :: * -> *) e. Build d f c e => d -> f -> c e
LA.build (L m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
r) โ -> โ -> โ
f
withVector
:: forall z
. Vector โ
-> (forall n . (KnownNat n) => R n -> z)
-> z
withVector :: Vector โ -> (forall (n :: Nat). KnownNat n => R n -> z) -> z
withVector Vector โ
v forall (n :: Nat). KnownNat n => R n -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
v of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy m)) -> R n -> z
forall (n :: Nat). KnownNat n => R n -> z
f (Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
v :: R m)
exactLength
:: forall n m . (KnownNat n, KnownNat m)
=> R m
-> Maybe (R n)
exactLength :: R m -> Maybe (R n)
exactLength R m
v = do
n :~: m
Refl <- Proxy n -> Proxy m -> Maybe (n :~: m)
forall (a :: Nat) (b :: Nat).
(KnownNat a, KnownNat b) =>
Proxy a -> Proxy b -> Maybe (a :~: b)
sameNat (Proxy n
forall k (t :: k). Proxy t
Proxy :: Proxy n) (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m)
R n -> Maybe (R n)
forall (m :: * -> *) a. Monad m => a -> m a
return (R n -> Maybe (R n)) -> R n -> Maybe (R n)
forall a b. (a -> b) -> a -> b
$ Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (R m -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap R m
v)
withMatrix
:: forall z
. Matrix โ
-> (forall m n . (KnownNat m, KnownNat n) => L m n -> z)
-> z
withMatrix :: Matrix โ
-> (forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> z)
-> z
withMatrix Matrix โ
a forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> z
f =
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
rows Matrix โ
a of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy m)) ->
case Integer -> Maybe SomeNat
someNatVal (Integer -> Maybe SomeNat) -> Integer -> Maybe SomeNat
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Matrix โ -> Int
forall t. Matrix t -> Int
cols Matrix โ
a of
Maybe SomeNat
Nothing -> String -> z
forall a. HasCallStack => String -> a
error String
"static/dynamic mismatch"
Just (SomeNat (Proxy n
_ :: Proxy n)) ->
L n n -> z
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> z
f (Matrix โ -> L n n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL Matrix โ
a :: L m n)
exactDims
:: forall n m j k . (KnownNat n, KnownNat m, KnownNat j, KnownNat k)
=> L m n
-> Maybe (L j k)
exactDims :: L m n -> Maybe (L j k)
exactDims L m n
m = do
m :~: j
Refl <- Proxy m -> Proxy j -> Maybe (m :~: j)
forall (a :: Nat) (b :: Nat).
(KnownNat a, KnownNat b) =>
Proxy a -> Proxy b -> Maybe (a :~: b)
sameNat (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m) (Proxy j
forall k (t :: k). Proxy t
Proxy :: Proxy j)
n :~: k
Refl <- Proxy n -> Proxy k -> Maybe (n :~: k)
forall (a :: Nat) (b :: Nat).
(KnownNat a, KnownNat b) =>
Proxy a -> Proxy b -> Maybe (a :~: b)
sameNat (Proxy n
forall k (t :: k). Proxy t
Proxy :: Proxy n) (Proxy k
forall k (t :: k). Proxy t
Proxy :: Proxy k)
L j k -> Maybe (L j k)
forall (m :: * -> *) a. Monad m => a -> m a
return (L j k -> Maybe (L j k)) -> L j k -> Maybe (L j k)
forall a b. (a -> b) -> a -> b
$ Matrix โ -> L j k
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap L m n
m)
randomVector
:: forall n . KnownNat n
=> Seed
-> RandDist
-> R n
randomVector :: Int -> RandDist -> R n
randomVector Int
s RandDist
d = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Int -> RandDist -> Int -> Vector โ
LA.randomVector Int
s RandDist
d
(Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy n
forall k (t :: k). Proxy t
Proxy :: Proxy n)))
)
rand
:: forall m n . (KnownNat m, KnownNat n)
=> IO (L m n)
rand :: IO (L m n)
rand = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> IO (Matrix โ) -> IO (L m n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Int -> IO (Matrix โ)
LA.rand (Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy m -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m)))
(Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy n
forall k (t :: k). Proxy t
Proxy :: Proxy n)))
randn
:: forall m n . (KnownNat m, KnownNat n)
=> IO (L m n)
randn :: IO (L m n)
randn = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> IO (Matrix โ) -> IO (L m n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Int -> IO (Matrix โ)
LA.randn (Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy m -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m)))
(Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy n
forall k (t :: k). Proxy t
Proxy :: Proxy n)))
gaussianSample
:: forall m n . (KnownNat m, KnownNat n)
=> Seed
-> R n
-> Sym n
-> L m n
gaussianSample :: Int -> R n -> Sym n -> L m n
gaussianSample Int
s (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
mu) (Sym (Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
sigma)) =
Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> Matrix โ -> L m n
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Vector โ -> Herm โ -> Matrix โ
LA.gaussianSample Int
s (Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy m -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m)))
Vector โ
mu (Matrix โ -> Herm โ
forall t. Matrix t -> Herm t
LA.trustSym Matrix โ
sigma)
uniformSample
:: forall m n . (KnownNat m, KnownNat n)
=> Seed
-> R n
-> R n
-> L m n
uniformSample :: Int -> R n -> R n -> L m n
uniformSample Int
s (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
mins) (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
maxs) =
Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> Matrix โ -> L m n
forall a b. (a -> b) -> a -> b
$ Int -> Int -> [(โ, โ)] -> Matrix โ
LA.uniformSample Int
s (Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy m -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy m
forall k (t :: k). Proxy t
Proxy :: Proxy m)))
([โ] -> [โ] -> [(โ, โ)]
forall a b. [a] -> [b] -> [(a, b)]
zip (Vector โ -> [โ]
forall a. Storable a => Vector a -> [a]
LA.toList Vector โ
mins) (Vector โ -> [โ]
forall a. Storable a => Vector a -> [a]
LA.toList Vector โ
maxs))
meanCov
:: forall m n . (KnownNat m, KnownNat n, 1 <= m)
=> L m n
-> (R n, Sym n)
meanCov :: L m n -> (R n, Sym n)
meanCov (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix โ
vs) = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR (Vector โ -> R n)
-> (Herm โ -> Sym n) -> (Vector โ, Herm โ) -> (R n, Sym n)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** (Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sym n) -> (Herm โ -> Sq n) -> Herm โ -> Sym n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> Sq n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> Sq n) -> (Herm โ -> Matrix โ) -> Herm โ -> Sq n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Herm โ -> Matrix โ
forall t. Herm t -> Matrix t
LA.unSym) ((Vector โ, Herm โ) -> (R n, Sym n))
-> (Vector โ, Herm โ) -> (R n, Sym n)
forall a b. (a -> b) -> a -> b
$ Matrix โ -> (Vector โ, Herm โ)
LA.meanCov Matrix โ
vs
class Domain field vec mat | mat -> vec field, vec -> mat field, field -> mat vec
where
mul :: forall m k n. (KnownNat m, KnownNat k, KnownNat n) => mat m k -> mat k n -> mat m n
app :: forall m n . (KnownNat m, KnownNat n) => mat m n -> vec n -> vec m
dot :: forall n . (KnownNat n) => vec n -> vec n -> field
cross :: vec 3 -> vec 3 -> vec 3
diagR :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => field -> vec k -> mat m n
dvmap :: forall n. KnownNat n => (field -> field) -> vec n -> vec n
dmmap :: forall n m. (KnownNat m, KnownNat n) => (field -> field) -> mat n m -> mat n m
outer :: forall n m. (KnownNat m, KnownNat n) => vec n -> vec m -> mat n m
zipWithVector :: forall n. KnownNat n => (field -> field -> field) -> vec n -> vec n -> vec n
det :: forall n. KnownNat n => mat n n -> field
invlndet :: forall n. KnownNat n => mat n n -> (mat n n, (field, field))
expm :: forall n. KnownNat n => mat n n -> mat n n
sqrtm :: forall n. KnownNat n => mat n n -> mat n n
inv :: forall n. KnownNat n => mat n n -> mat n n
instance Domain โ R L
where
mul :: L m k -> L k n -> L m n
mul = L m k -> L k n -> L m n
forall (m :: Nat) (k :: Nat) (n :: Nat).
(KnownNat m, KnownNat k, KnownNat n) =>
L m k -> L k n -> L m n
mulR
app :: L m n -> R n -> R m
app = L m n -> R n -> R m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> R n -> R m
appR
dot :: R n -> R n -> โ
dot = R n -> R n -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
dotR
cross :: R 3 -> R 3 -> R 3
cross = R 3 -> R 3 -> R 3
crossR
diagR :: โ -> R k -> L m n
diagR = โ -> R k -> L m n
forall (m :: Nat) (n :: Nat) (k :: Nat).
(KnownNat m, KnownNat n, KnownNat k) =>
โ -> R k -> L m n
diagRectR
dvmap :: (โ -> โ) -> R n -> R n
dvmap = (โ -> โ) -> R n -> R n
forall (n :: Nat). KnownNat n => (โ -> โ) -> R n -> R n
mapR
dmmap :: (โ -> โ) -> L n m -> L n m
dmmap = (โ -> โ) -> L n m -> L n m
forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
(โ -> โ) -> L n m -> L n m
mapL
outer :: R n -> R m -> L n m
outer = R n -> R m -> L n m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
R n -> R m -> L n m
outerR
zipWithVector :: (โ -> โ -> โ) -> R n -> R n -> R n
zipWithVector = (โ -> โ -> โ) -> R n -> R n -> R n
forall (n :: Nat). KnownNat n => (โ -> โ -> โ) -> R n -> R n -> R n
zipWithR
det :: L n n -> โ
det = L n n -> โ
forall (n :: Nat). KnownNat n => L n n -> โ
detL
invlndet :: L n n -> (L n n, (โ, โ))
invlndet = L n n -> (L n n, (โ, โ))
forall (n :: Nat). KnownNat n => L n n -> (L n n, (โ, โ))
invlndetL
expm :: L n n -> L n n
expm = L n n -> L n n
forall (n :: Nat). KnownNat n => L n n -> L n n
expmL
sqrtm :: L n n -> L n n
sqrtm = L n n -> L n n
forall (n :: Nat). KnownNat n => L n n -> L n n
sqrtmL
inv :: L n n -> L n n
inv = L n n -> L n n
forall (n :: Nat). KnownNat n => L n n -> L n n
invL
instance Domain โ C M
where
mul :: M m k -> M k n -> M m n
mul = M m k -> M k n -> M m n
forall (m :: Nat) (k :: Nat) (n :: Nat).
(KnownNat m, KnownNat k, KnownNat n) =>
M m k -> M k n -> M m n
mulC
app :: M m n -> C n -> C m
app = M m n -> C n -> C m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> C n -> C m
appC
dot :: C n -> C n -> โ
dot = C n -> C n -> โ
forall (n :: Nat). KnownNat n => C n -> C n -> โ
dotC
cross :: C 3 -> C 3 -> C 3
cross = C 3 -> C 3 -> C 3
crossC
diagR :: โ -> C k -> M m n
diagR = โ -> C k -> M m n
forall (m :: Nat) (n :: Nat) (k :: Nat).
(KnownNat m, KnownNat n, KnownNat k) =>
โ -> C k -> M m n
diagRectC
dvmap :: (โ -> โ) -> C n -> C n
dvmap = (โ -> โ) -> C n -> C n
forall (n :: Nat). KnownNat n => (โ -> โ) -> C n -> C n
mapC
dmmap :: (โ -> โ) -> M n m -> M n m
dmmap = (โ -> โ) -> M n m -> M n m
forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
(โ -> โ) -> M n m -> M n m
mapM'
outer :: C n -> C m -> M n m
outer = C n -> C m -> M n m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
C n -> C m -> M n m
outerC
zipWithVector :: (โ -> โ -> โ) -> C n -> C n -> C n
zipWithVector = (โ -> โ -> โ) -> C n -> C n -> C n
forall (n :: Nat). KnownNat n => (โ -> โ -> โ) -> C n -> C n -> C n
zipWithC
det :: M n n -> โ
det = M n n -> โ
forall (n :: Nat). KnownNat n => M n n -> โ
detM
invlndet :: M n n -> (M n n, (โ, โ))
invlndet = M n n -> (M n n, (โ, โ))
forall (n :: Nat). KnownNat n => M n n -> (M n n, (โ, โ))
invlndetM
expm :: M n n -> M n n
expm = M n n -> M n n
forall (n :: Nat). KnownNat n => M n n -> M n n
expmM
sqrtm :: M n n -> M n n
sqrtm = M n n -> M n n
forall (n :: Nat). KnownNat n => M n n -> M n n
sqrtmM
inv :: M n n -> M n n
inv = M n n -> M n n
forall (n :: Nat). KnownNat n => M n n -> M n n
invM
mulR :: forall m k n. (KnownNat m, KnownNat k, KnownNat n) => L m k -> L k n -> L m n
mulR :: L m k -> L k n -> L m n
mulR (L m k -> Maybe (โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (โ, (Int, Int))
isKonst -> Just (โ
a,(Int
_,Int
k))) (L k n -> Maybe (โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (โ, (Int, Int))
isKonst -> Just (โ
b,(Int, Int)
_)) = โ -> L m n
forall t s (d :: * -> *). Sized t s d => t -> s
konst (โ
a โ -> โ -> โ
forall a. Num a => a -> a -> a
* โ
b โ -> โ -> โ
forall a. Num a => a -> a -> a
* Int -> โ
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k)
mulR (L m k -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (โ, Vector โ, (Int, Int))
isDiag -> Just (โ
0,Vector โ
a,(Int, Int)
_)) (L k n -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (โ, Vector โ, (Int, Int))
isDiag -> Just (โ
0,Vector โ
b,(Int, Int)
_)) = โ -> R k -> L m n
forall field (vec :: Nat -> *) (mat :: Nat -> Nat -> *) (m :: Nat)
(n :: Nat) (k :: Nat).
(Domain field vec mat, KnownNat m, KnownNat n, KnownNat k) =>
field -> vec k -> mat m n
diagR โ
0 (Vector โ -> R k
forall (n :: Nat). Vector โ -> R n
mkR Vector โ
v :: R k)
where
v :: Vector โ
v = Vector โ
a' Vector โ -> Vector โ -> Vector โ
forall a. Num a => a -> a -> a
* Vector โ
b'
n :: Int
n = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
a) (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
b)
a' :: Vector โ
a' = Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 Int
n Vector โ
a
b' :: Vector โ
b' = Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 Int
n Vector โ
b
mulR L m k
a L k n
b = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (L m k -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m k
a Matrix โ -> Matrix โ -> Matrix โ
forall t. Numeric t => Matrix t -> Matrix t -> Matrix t
LA.<> L k n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L k n
b)
appR :: (KnownNat m, KnownNat n) => L m n -> R n -> R m
appR :: L m n -> R n -> R m
appR (L m n -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (โ, Vector โ, (Int, Int))
isDiag -> Just (โ
0, Vector โ
w, (Int, Int)
_)) R n
v = Vector โ -> R m
forall (n :: Nat). Vector โ -> R n
mkR (Vector โ
w Vector โ -> Vector โ -> Vector โ
forall a. Num a => a -> a -> a
* Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
w) (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v))
appR L m n
m R n
v = Vector โ -> R m
forall (n :: Nat). Vector โ -> R n
mkR (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
m Matrix โ -> Vector โ -> Vector โ
forall t. Numeric t => Matrix t -> Vector t -> Vector t
LA.#> R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
dotR :: KnownNat n => R n -> R n -> โ
dotR :: R n -> R n -> โ
dotR (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
u) (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
v) = Vector โ -> Vector โ -> โ
forall t. Numeric t => Vector t -> Vector t -> t
LA.dot Vector โ
u Vector โ
v
crossR :: R 3 -> R 3 -> R 3
crossR :: R 3 -> R 3 -> R 3
crossR (R 3 -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (R 3 -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = โ -> โ -> โ -> R 3
vec3 โ
z1 โ
z2 โ
z3
where
z1 :: โ
z1 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1
z2 :: โ
z2 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2
z3 :: โ
z3 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0
outerR :: (KnownNat m, KnownNat n) => R n -> R m -> L n m
outerR :: R n -> R m -> L n m
outerR (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (R m -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = Matrix โ -> L n m
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Vector โ -> Vector โ -> Matrix โ
forall t. Product t => Vector t -> Vector t -> Matrix t
LA.outer Vector โ
x Vector โ
y)
mapR :: KnownNat n => (โ -> โ) -> R n -> R n
mapR :: (โ -> โ) -> R n -> R n
mapR โ -> โ
f (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Vector โ
v) = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR ((โ -> โ) -> Vector โ -> Vector โ
forall b (c :: * -> *) e.
(Element b, Container c e) =>
(e -> b) -> c e -> c b
LA.cmap โ -> โ
f Vector โ
v)
zipWithR :: KnownNat n => (โ -> โ -> โ) -> R n -> R n -> R n
zipWithR :: (โ -> โ -> โ) -> R n -> R n -> R n
zipWithR โ -> โ -> โ
f (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = Vector โ -> R n
forall (n :: Nat). Vector โ -> R n
mkR ((โ -> โ -> โ) -> Vector โ -> Vector โ -> Vector โ
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
LA.zipVectorWith โ -> โ -> โ
f Vector โ
x Vector โ
y)
mapL :: (KnownNat n, KnownNat m) => (โ -> โ) -> L n m -> L n m
mapL :: (โ -> โ) -> L n m -> L n m
mapL โ -> โ
f = (Matrix โ -> Matrix โ) -> L n m -> L n m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> L m n -> L m n
overMatL' ((โ -> โ) -> Matrix โ -> Matrix โ
forall b (c :: * -> *) e.
(Element b, Container c e) =>
(e -> b) -> c e -> c b
LA.cmap โ -> โ
f)
detL :: KnownNat n => Sq n -> โ
detL :: Sq n -> โ
detL = Matrix โ -> โ
forall t. Field t => Matrix t -> t
LA.det (Matrix โ -> โ) -> (Sq n -> Matrix โ) -> Sq n -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
invlndetL :: KnownNat n => Sq n -> (L n n, (โ, โ))
invlndetL :: Sq n -> (Sq n, (โ, โ))
invlndetL = (Matrix โ -> Sq n) -> (Matrix โ, (โ, โ)) -> (Sq n, (โ, โ))
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
BF.first Matrix โ -> Sq n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL ((Matrix โ, (โ, โ)) -> (Sq n, (โ, โ)))
-> (Sq n -> (Matrix โ, (โ, โ))) -> Sq n -> (Sq n, (โ, โ))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> (Matrix โ, (โ, โ))
forall t. Field t => Matrix t -> (Matrix t, (t, t))
LA.invlndet (Matrix โ -> (Matrix โ, (โ, โ)))
-> (Sq n -> Matrix โ) -> Sq n -> (Matrix โ, (โ, โ))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sq n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
expmL :: KnownNat n => Sq n -> Sq n
expmL :: Sq n -> Sq n
expmL = (Matrix โ -> Matrix โ) -> Sq n -> Sq n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> L m n -> L m n
overMatL' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.expm
sqrtmL :: KnownNat n => Sq n -> Sq n
sqrtmL :: Sq n -> Sq n
sqrtmL = (Matrix โ -> Matrix โ) -> Sq n -> Sq n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> L m n -> L m n
overMatL' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.sqrtm
invL :: KnownNat n => Sq n -> Sq n
invL :: Sq n -> Sq n
invL = (Matrix โ -> Matrix โ) -> Sq n -> Sq n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> L m n -> L m n
overMatL' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.inv
mulC :: forall m k n. (KnownNat m, KnownNat k, KnownNat n) => M m k -> M k n -> M m n
mulC :: M m k -> M k n -> M m n
mulC (M m k -> Maybe (โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (โ, (Int, Int))
isKonstC -> Just (โ
a,(Int
_,Int
k))) (M k n -> Maybe (โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (โ, (Int, Int))
isKonstC -> Just (โ
b,(Int, Int)
_)) = โ -> M m n
forall t s (d :: * -> *). Sized t s d => t -> s
konst (โ
a โ -> โ -> โ
forall a. Num a => a -> a -> a
* โ
b โ -> โ -> โ
forall a. Num a => a -> a -> a
* Int -> โ
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k)
mulC (M m k -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (โ, Vector โ, (Int, Int))
isDiagC -> Just (โ
0,Vector โ
a,(Int, Int)
_)) (M k n -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (โ, Vector โ, (Int, Int))
isDiagC -> Just (โ
0,Vector โ
b,(Int, Int)
_)) = โ -> C k -> M m n
forall field (vec :: Nat -> *) (mat :: Nat -> Nat -> *) (m :: Nat)
(n :: Nat) (k :: Nat).
(Domain field vec mat, KnownNat m, KnownNat n, KnownNat k) =>
field -> vec k -> mat m n
diagR โ
0 (Vector โ -> C k
forall (n :: Nat). Vector โ -> C n
mkC Vector โ
v :: C k)
where
v :: Vector โ
v = Vector โ
a' Vector โ -> Vector โ -> Vector โ
forall a. Num a => a -> a -> a
* Vector โ
b'
n :: Int
n = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
a) (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
b)
a' :: Vector โ
a' = Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 Int
n Vector โ
a
b' :: Vector โ
b' = Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 Int
n Vector โ
b
mulC M m k
a M k n
b = Matrix โ -> M m n
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM (M m k -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m k
a Matrix โ -> Matrix โ -> Matrix โ
forall t. Numeric t => Matrix t -> Matrix t -> Matrix t
LA.<> M k n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract M k n
b)
appC :: (KnownNat m, KnownNat n) => M m n -> C n -> C m
appC :: M m n -> C n -> C m
appC (M m n -> Maybe (โ, Vector โ, (Int, Int))
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (โ, Vector โ, (Int, Int))
isDiagC -> Just (โ
0, Vector โ
w, (Int, Int)
_)) C n
v = Vector โ -> C m
forall (n :: Nat). Vector โ -> C n
mkC (Vector โ
w Vector โ -> Vector โ -> Vector โ
forall a. Num a => a -> a -> a
* Int -> Int -> Vector โ -> Vector โ
forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
0 (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
w) (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract C n
v))
appC M m n
m C n
v = Vector โ -> C m
forall (n :: Nat). Vector โ -> C n
mkC (M m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
m Matrix โ -> Vector โ -> Vector โ
forall t. Numeric t => Matrix t -> Vector t -> Vector t
LA.#> C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract C n
v)
dotC :: KnownNat n => C n -> C n -> โ
dotC :: C n -> C n -> โ
dotC (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
u) (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
v) = Vector โ -> Vector โ -> โ
forall t. Numeric t => Vector t -> Vector t -> t
LA.dot Vector โ
u Vector โ
v
crossC :: C 3 -> C 3 -> C 3
crossC :: C 3 -> C 3 -> C 3
crossC (C 3 -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (C 3 -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = Vector โ -> C 3
forall (n :: Nat). Vector โ -> C n
mkC ([โ] -> Vector โ
forall a. Storable a => [a] -> Vector a
LA.fromList [โ
z1, โ
z2, โ
z3])
where
z1 :: โ
z1 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1
z2 :: โ
z2 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
2
z3 :: โ
z3 = Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
-Vector โ
xVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
1โ -> โ -> โ
forall a. Num a => a -> a -> a
*Vector โ
yVector โ -> Int -> โ
forall c t. Indexable c t => c -> Int -> t
!Int
0
outerC :: (KnownNat m, KnownNat n) => C n -> C m -> M n m
outerC :: C n -> C m -> M n m
outerC (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (C m -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = Matrix โ -> M n m
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM (Vector โ -> Vector โ -> Matrix โ
forall t. Product t => Vector t -> Vector t -> Matrix t
LA.outer Vector โ
x Vector โ
y)
mapC :: KnownNat n => (โ -> โ) -> C n -> C n
mapC :: (โ -> โ) -> C n -> C n
mapC โ -> โ
f (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Vector โ
v) = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC ((โ -> โ) -> Vector โ -> Vector โ
forall b (c :: * -> *) e.
(Element b, Container c e) =>
(e -> b) -> c e -> c b
LA.cmap โ -> โ
f Vector โ
v)
zipWithC :: KnownNat n => (โ -> โ -> โ) -> C n -> C n -> C n
zipWithC :: (โ -> โ -> โ) -> C n -> C n -> C n
zipWithC โ -> โ -> โ
f (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
x) (C n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Vector โ
y) = Vector โ -> C n
forall (n :: Nat). Vector โ -> C n
mkC ((โ -> โ -> โ) -> Vector โ -> Vector โ -> Vector โ
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
LA.zipVectorWith โ -> โ -> โ
f Vector โ
x Vector โ
y)
mapM' :: (KnownNat n, KnownNat m) => (โ -> โ) -> M n m -> M n m
mapM' :: (โ -> โ) -> M n m -> M n m
mapM' โ -> โ
f = (Matrix โ -> Matrix โ) -> M n m -> M n m
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> M m n -> M m n
overMatM' ((โ -> โ) -> Matrix โ -> Matrix โ
forall b (c :: * -> *) e.
(Element b, Container c e) =>
(e -> b) -> c e -> c b
LA.cmap โ -> โ
f)
detM :: KnownNat n => M n n -> โ
detM :: M n n -> โ
detM = Matrix โ -> โ
forall t. Field t => Matrix t -> t
LA.det (Matrix โ -> โ) -> (M n n -> Matrix โ) -> M n n -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
invlndetM :: KnownNat n => M n n -> (M n n, (โ, โ))
invlndetM :: M n n -> (M n n, (โ, โ))
invlndetM = (Matrix โ -> M n n) -> (Matrix โ, (โ, โ)) -> (M n n, (โ, โ))
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
BF.first Matrix โ -> M n n
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM ((Matrix โ, (โ, โ)) -> (M n n, (โ, โ)))
-> (M n n -> (Matrix โ, (โ, โ))) -> M n n -> (M n n, (โ, โ))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix โ -> (Matrix โ, (โ, โ))
forall t. Field t => Matrix t -> (Matrix t, (t, t))
LA.invlndet (Matrix โ -> (Matrix โ, (โ, โ)))
-> (M n n -> Matrix โ) -> M n n -> (Matrix โ, (โ, โ))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M n n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
expmM :: KnownNat n => M n n -> M n n
expmM :: M n n -> M n n
expmM = (Matrix โ -> Matrix โ) -> M n n -> M n n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> M m n -> M m n
overMatM' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.expm
sqrtmM :: KnownNat n => M n n -> M n n
sqrtmM :: M n n -> M n n
sqrtmM = (Matrix โ -> Matrix โ) -> M n n -> M n n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> M m n -> M m n
overMatM' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.sqrtm
invM :: KnownNat n => M n n -> M n n
invM :: M n n -> M n n
invM = (Matrix โ -> Matrix โ) -> M n n -> M n n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix โ -> Matrix โ) -> M m n -> M m n
overMatM' Matrix โ -> Matrix โ
forall t. Field t => Matrix t -> Matrix t
LA.inv
diagRectR :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => โ -> R k -> L m n
diagRectR :: โ -> R k -> L m n
diagRectR โ
x R k
v
| Int
m' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (โ -> Vector โ -> Int -> Int -> Matrix โ
forall t. Storable t => t -> Vector t -> Int -> Int -> Matrix t
LA.diagRect โ
x Vector โ
ev Int
m' Int
n')
| Int
m'Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
n' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = L m n
r
| Bool
otherwise = [โ] -> L m n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
[โ] -> L m n
matrix []
where
r :: L m n
r = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Vector โ -> Matrix โ
forall a. Storable a => Vector a -> Matrix a
asRow ([Vector โ] -> Vector โ
forall t. Storable t => [Vector t] -> Vector t
vjoin [โ -> Vector โ
forall (c :: * -> *) e. Container c e => e -> c e
scalar โ
x, Vector โ
ev, Vector โ
zeros]))
ev :: Vector โ
ev = R k -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R k
v
zeros :: Vector โ
zeros = โ -> Int -> Vector โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
x (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 ((Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
m' Int
n') Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
ev))
(Int
m',Int
n') = L m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
r
diagRectC :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => โ -> C k -> M m n
diagRectC :: โ -> C k -> M m n
diagRectC โ
x C k
v
| Int
m' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Matrix โ -> M m n
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM (โ -> Vector โ -> Int -> Int -> Matrix โ
forall t. Storable t => t -> Vector t -> Int -> Int -> Matrix t
LA.diagRect โ
x Vector โ
ev Int
m' Int
n')
| Int
m'Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
n' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = M m n
r
| Bool
otherwise = [โ] -> M m n
forall t s (d :: * -> *). Sized t s d => [t] -> s
fromList []
where
r :: M m n
r = Matrix โ -> M m n
forall (m :: Nat) (n :: Nat). Matrix โ -> M m n
mkM (Vector โ -> Matrix โ
forall a. Storable a => Vector a -> Matrix a
asRow ([Vector โ] -> Vector โ
forall t. Storable t => [Vector t] -> Vector t
vjoin [โ -> Vector โ
forall (c :: * -> *) e. Container c e => e -> c e
scalar โ
x, Vector โ
ev, Vector โ
zeros]))
ev :: Vector โ
ev = C k -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract C k
v
zeros :: Vector โ
zeros = โ -> Int -> Vector โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
x (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 ((Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
m' Int
n') Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector โ
ev))
(Int
m',Int
n') = M m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size M m n
r
mean :: (KnownNat n, 1<=n) => R n -> โ
mean :: R n -> โ
mean R n
v = R n
v R n -> R n -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
<ยท> (R n
1R n -> R n -> R n
forall a. Fractional a => a -> a -> a
/R n
forall (n :: Nat). KnownNat n => R n
dim)
test :: (Bool, IO ())
test :: (Bool, IO ())
test = (Bool
ok,IO ()
info)
where
ok :: Bool
ok = Sq 5 -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract (Sq 5
forall (n :: Nat). KnownNat n => Sq n
eye :: Sq 5) Matrix โ -> Matrix โ -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Matrix โ
forall a. (Num a, Element a) => Int -> Matrix a
ident Int
5
Bool -> Bool -> Bool
&& (Sq 3 -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap (Sq 3 -> Matrix โ) -> (Sym 3 -> Sq 3) -> Sym 3 -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Sym 3 -> Sq 3
forall (n :: Nat). Sym n -> Sq n
unSym) (Sq 3 -> Sym 3
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Sym n
mTm Sq 3
forall (n :: Nat). KnownNat n => Sq n
sm :: Sym 3) Matrix โ -> Matrix โ -> Bool
forall a. Eq a => a -> a -> Bool
== Matrix โ -> Matrix โ
forall m mt. Transposable m mt => m -> mt
tr ((Int
3Int -> Int -> [โ] -> Matrix โ
forall a. Storable a => Int -> Int -> [a] -> Matrix a
><Int
3)[โ
1..]) Matrix โ -> Matrix โ -> Matrix โ
forall t. Numeric t => Matrix t -> Matrix t -> Matrix t
LA.<> (Int
3Int -> Int -> [โ] -> Matrix โ
forall a. Storable a => Int -> Int -> [a] -> Matrix a
><Int
3)[โ
1..]
Bool -> Bool -> Bool
&& L 3 5 -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap (L 3 5
GL
tm :: L 3 5) Matrix โ -> Matrix โ -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> [โ] -> Matrix โ
LA.matrix Int
5 [โ
1..โ
15]
Bool -> Bool -> Bool
&& โ
thingS โ -> โ -> Bool
forall a. Eq a => a -> a -> Bool
== โ
thingD
Bool -> Bool -> Bool
&& โ
precS โ -> โ -> Bool
forall a. Eq a => a -> a -> Bool
== โ
precD
Bool -> Bool -> Bool
&& Vector โ -> (forall (n :: Nat). KnownNat n => R n -> โ) -> โ
forall z.
Vector โ -> (forall (n :: Nat). KnownNat n => R n -> z) -> z
withVector ([โ] -> Vector โ
LA.vector [โ
1..โ
15]) forall (n :: Nat). KnownNat n => R n -> โ
sumV โ -> โ -> Bool
forall a. Eq a => a -> a -> Bool
== Vector โ -> โ
forall (c :: * -> *) e. Container c e => c e -> e
sumElements ([โ] -> Vector โ
forall a. Storable a => [a] -> Vector a
LA.fromList [โ
1..โ
15])
info :: IO ()
info = do
R 2 -> IO ()
forall a. Show a => a -> IO ()
print (R 2 -> IO ()) -> R 2 -> IO ()
forall a b. (a -> b) -> a -> b
$ R 2
u
R 3 -> IO ()
forall a. Show a => a -> IO ()
print (R 3 -> IO ()) -> R 3 -> IO ()
forall a b. (a -> b) -> a -> b
$ R 3
v
Sq 3 -> IO ()
forall a. Show a => a -> IO ()
print (Sq 3
forall (n :: Nat). KnownNat n => Sq n
eye :: Sq 3)
โ -> IO ()
forall a. Show a => a -> IO ()
print (โ -> IO ()) -> โ -> IO ()
forall a b. (a -> b) -> a -> b
$ ((R 2
u R 2 -> โ -> R (2 + 1)
forall (n :: Nat). KnownNat n => R n -> โ -> R (n + 1)
& โ
5) R 3 -> R 3 -> R 3
forall a. Num a => a -> a -> a
+ R 3
1) R 3 -> R 3 -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
<ยท> R 3
v
L 2 5 -> IO ()
forall a. Show a => a -> IO ()
print (L 2 5
GL
tm :: L 2 5)
L 2 3 -> IO ()
forall a. Show a => a -> IO ()
print (L 2 3
GL
tm L 2 3 -> Sq 3 -> L 2 3
forall (m :: Nat) (k :: Nat) (n :: Nat).
(KnownNat m, KnownNat k, KnownNat n) =>
L m k -> L k n -> L m n
<> Sq 3
forall (n :: Nat). KnownNat n => Sq n
sm :: L 2 3)
โ -> IO ()
forall a. Show a => a -> IO ()
print โ
thingS
โ -> IO ()
forall a. Show a => a -> IO ()
print โ
thingD
โ -> IO ()
forall a. Show a => a -> IO ()
print โ
precS
โ -> IO ()
forall a. Show a => a -> IO ()
print โ
precD
โ -> IO ()
forall a. Show a => a -> IO ()
print (โ -> IO ()) -> โ -> IO ()
forall a b. (a -> b) -> a -> b
$ Vector โ -> (forall (n :: Nat). KnownNat n => R n -> โ) -> โ
forall z.
Vector โ -> (forall (n :: Nat). KnownNat n => R n -> z) -> z
withVector ([โ] -> Vector โ
LA.vector [โ
1..โ
15]) forall (n :: Nat). KnownNat n => R n -> โ
sumV
IO ()
splittest
sumV :: R n -> โ
sumV R n
w = R n
w R n -> R n -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
<ยท> โ -> R n
forall t s (d :: * -> *). Sized t s d => t -> s
konst โ
1
u :: R 2
u = โ -> โ -> R 2
vec2 โ
3 โ
5
๐ง :: โ -> R 1
๐ง โ
x = [โ] -> R 1
forall (n :: Nat). KnownNat n => [โ] -> R n
vector [โ
x] :: R 1
v :: R (2 + 1)
v = โ -> R 1
๐ง โ
2 R 1 -> โ -> R (1 + 1)
forall (n :: Nat). KnownNat n => R n -> โ -> R (n + 1)
& โ
4 R 2 -> โ -> R (2 + 1)
forall (n :: Nat). KnownNat n => R n -> โ -> R (n + 1)
& โ
7
tm :: GL
tm :: L m n
tm = โ -> [โ] -> L m n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
โ -> [โ] -> L m n
lmat โ
0 [โ
1..]
lmat :: forall m n . (KnownNat m, KnownNat n) => โ -> [โ] -> L m n
lmat :: โ -> [โ] -> L m n
lmat โ
z [โ]
xs = L m n
r
where
r :: L m n
r = Matrix โ -> L m n
forall (m :: Nat) (n :: Nat). Matrix โ -> L m n
mkL (Matrix โ -> L m n) -> ([โ] -> Matrix โ) -> [โ] -> L m n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Vector โ -> Matrix โ
forall t. Storable t => Int -> Vector t -> Matrix t
reshape Int
n' (Vector โ -> Matrix โ) -> ([โ] -> Vector โ) -> [โ] -> Matrix โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [โ] -> Vector โ
forall a. Storable a => [a] -> Vector a
LA.fromList ([โ] -> Vector โ) -> ([โ] -> [โ]) -> [โ] -> Vector โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [โ] -> [โ]
forall a. Int -> [a] -> [a]
take (Int
m'Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
n') ([โ] -> L m n) -> [โ] -> L m n
forall a b. (a -> b) -> a -> b
$ [โ]
xs [โ] -> [โ] -> [โ]
forall a. [a] -> [a] -> [a]
++ โ -> [โ]
forall a. a -> [a]
repeat โ
z
(Int
m',Int
n') = L m n -> IndexOf Matrix
forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
r
sm :: GSq
sm :: Sq n
sm = โ -> [โ] -> Sq n
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
โ -> [โ] -> L m n
lmat โ
0 [โ
1..]
thingS :: โ
thingS = (R 2
u R 2 -> โ -> R (2 + 1)
forall (n :: Nat). KnownNat n => R n -> โ -> R (n + 1)
& โ
1) R 3 -> R 3 -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
<ยท> L 10 3 -> L 3 10
forall m mt. Transposable m mt => m -> mt
tr L 10 3
q L 3 10 -> R 10 -> R 3
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> R n -> R m
#> L 10 3
q L 10 3 -> R 3 -> R 10
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> R n -> R m
#> R 3
v
where
q :: L 10 3
q = L 10 3
GL
tm :: L 10 3
thingD :: โ
thingD = [Vector โ] -> Vector โ
forall t. Storable t => [Vector t] -> Vector t
vjoin [R 2 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 2
u, Vector โ
1] Vector โ -> Vector โ -> โ
forall t. Numeric t => Vector t -> Vector t -> t
LA.<.> Matrix โ -> Matrix โ
forall m mt. Transposable m mt => m -> mt
tr Matrix โ
m Matrix โ -> Vector โ -> Vector โ
forall t. Numeric t => Matrix t -> Vector t -> Vector t
LA.#> Matrix โ
m Matrix โ -> Vector โ -> Vector โ
forall t. Numeric t => Matrix t -> Vector t -> Vector t
LA.#> R 3 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 3
v
where
m :: Matrix โ
m = Int -> [โ] -> Matrix โ
LA.matrix Int
3 [โ
1..โ
30]
precS :: โ
precS = (โ
1::Double) โ -> โ -> โ
forall a. Num a => a -> a -> a
+ (โ
2::Double) โ -> โ -> โ
forall a. Num a => a -> a -> a
* ((R 3
1 :: R 3) R 3 -> R 3 -> R 3
forall a. Num a => a -> a -> a
* (R 2
u R 2 -> โ -> R (2 + 1)
forall (n :: Nat). KnownNat n => R n -> โ -> R (n + 1)
& โ
6)) R 3 -> R 3 -> โ
forall (n :: Nat). KnownNat n => R n -> R n -> โ
<ยท> โ -> Sq 3
forall t s (d :: * -> *). Sized t s d => t -> s
konst โ
2 Sq 3 -> R 3 -> R 3
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> R n -> R m
#> R 3
v
precD :: โ
precD = โ
1 โ -> โ -> โ
forall a. Num a => a -> a -> a
+ โ
2 โ -> โ -> โ
forall a. Num a => a -> a -> a
* [Vector โ] -> Vector โ
forall t. Storable t => [Vector t] -> Vector t
vjoin[R 2 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 2
u, Vector โ
6] Vector โ -> Vector โ -> โ
forall t. Numeric t => Vector t -> Vector t -> t
LA.<.> โ -> (Int, Int) -> Matrix โ
forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst โ
2 (Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size (R 2 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 2
u) Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1, Vector โ -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size (R 3 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 3
v)) Matrix โ -> Vector โ -> Vector โ
forall t. Numeric t => Matrix t -> Vector t -> Vector t
LA.#> R 3 -> Vector โ
forall (n :: Nat). R n -> Vector โ
ud1 R 3
v
splittest :: IO ()
splittest
= do
let v :: R 7
v = R 7
forall (n :: Nat). KnownNat n => R n
range :: R 7
a :: R 4
a = (R 3, R 4) -> R 4
forall a b. (a, b) -> b
snd (R 7 -> (R 3, R (7 - 3))
forall (p :: Nat) (n :: Nat).
(KnownNat p, KnownNat n, p <= n) =>
R n -> (R p, R (n - p))
split R 7
v) :: R 4
R 4 -> IO ()
forall a. Show a => a -> IO ()
print (R 4 -> IO ()) -> R 4 -> IO ()
forall a b. (a -> b) -> a -> b
$ R 4
a
R 5 -> IO ()
forall a. Show a => a -> IO ()
print (R 5 -> IO ()) -> R 5 -> IO ()
forall a b. (a -> b) -> a -> b
$ (โ, R 5) -> R 5
forall a b. (a, b) -> b
snd ((โ, R 5) -> R 5) -> (R 7 -> (โ, R 5)) -> R 7 -> R 5
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R 6 -> (โ, R 5)
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R 6 -> (โ, R 5)) -> (R 7 -> R 6) -> R 7 -> (โ, R 5)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (โ, R 6) -> R 6
forall a b. (a, b) -> b
snd ((โ, R 6) -> R 6) -> (R 7 -> (โ, R 6)) -> R 7 -> R 6
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R 7 -> (โ, R 6)
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R 7 -> R 5) -> R 7 -> R 5
forall a b. (a -> b) -> a -> b
$ R 7
v
โ -> IO ()
forall a. Show a => a -> IO ()
print (โ -> IO ()) -> โ -> IO ()
forall a b. (a -> b) -> a -> b
$ R 3 -> โ
forall (n :: Nat). (KnownNat n, (1 <=? n) ~ 'True) => R n -> โ
first (โ -> โ -> โ -> R 3
vec3 โ
1 โ
2 โ
3)
โ -> IO ()
forall a. Show a => a -> IO ()
print (โ -> IO ()) -> โ -> IO ()
forall a b. (a -> b) -> a -> b
$ R 3 -> โ
forall (n :: Nat).
(KnownNat (n - 1), KnownNat n, (1 <=? n) ~ 'True,
(1 <=? (n - 1)) ~ 'True) =>
R n -> โ
second (โ -> โ -> โ -> R 3
vec3 โ
1 โ
2 โ
3)
โ -> IO ()
forall a. Show a => a -> IO ()
print (โ -> IO ()) -> โ -> IO ()
forall a b. (a -> b) -> a -> b
$ R 3 -> โ
forall (n :: Nat).
(KnownNat ((n - 1) - 1), KnownNat (n - 1), KnownNat n,
(1 <=? ((n - 1) - 1)) ~ 'True, (1 <=? n) ~ 'True,
(1 <=? (n - 1)) ~ 'True) =>
R n -> โ
third (โ -> โ -> โ -> R 3
vec3 โ
1 โ
2 โ
3)
L 4 6 -> IO ()
forall a. Show a => a -> IO ()
print (L 4 6 -> IO ()) -> L 4 6 -> IO ()
forall a b. (a -> b) -> a -> b
$ ((L 2 6, L 4 6) -> L 4 6
forall a b. (a, b) -> b
snd ((L 2 6, L 4 6) -> L 4 6) -> (L 2 6, L 4 6) -> L 4 6
forall a b. (a -> b) -> a -> b
$ L 6 6 -> (L 2 6, L (6 - 2) 6)
forall (p :: Nat) (m :: Nat) (n :: Nat).
(KnownNat p, KnownNat m, KnownNat n, p <= m) =>
L m n -> (L p n, L (m - p) n)
splitRows L 6 6
forall (n :: Nat). KnownNat n => Sq n
eye :: L 4 6)
where
first :: R n -> โ
first R n
v = (โ, R (n - 1)) -> โ
forall a b. (a, b) -> a
fst ((โ, R (n - 1)) -> โ) -> (R n -> (โ, R (n - 1))) -> R n -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> (โ, R (n - 1))
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R n -> โ) -> R n -> โ
forall a b. (a -> b) -> a -> b
$ R n
v
second :: R n -> โ
second R n
v = R (n - 1) -> โ
forall (n :: Nat). (KnownNat n, (1 <=? n) ~ 'True) => R n -> โ
first (R (n - 1) -> โ) -> (R n -> R (n - 1)) -> R n -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (โ, R (n - 1)) -> R (n - 1)
forall a b. (a, b) -> b
snd ((โ, R (n - 1)) -> R (n - 1))
-> (R n -> (โ, R (n - 1))) -> R n -> R (n - 1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> (โ, R (n - 1))
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R n -> โ) -> R n -> โ
forall a b. (a -> b) -> a -> b
$ R n
v
third :: R n -> โ
third R n
v = R ((n - 1) - 1) -> โ
forall (n :: Nat). (KnownNat n, (1 <=? n) ~ 'True) => R n -> โ
first (R ((n - 1) - 1) -> โ) -> (R n -> R ((n - 1) - 1)) -> R n -> โ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (โ, R ((n - 1) - 1)) -> R ((n - 1) - 1)
forall a b. (a, b) -> b
snd ((โ, R ((n - 1) - 1)) -> R ((n - 1) - 1))
-> (R n -> (โ, R ((n - 1) - 1))) -> R n -> R ((n - 1) - 1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R (n - 1) -> (โ, R ((n - 1) - 1))
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R (n - 1) -> (โ, R ((n - 1) - 1)))
-> (R n -> R (n - 1)) -> R n -> (โ, R ((n - 1) - 1))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (โ, R (n - 1)) -> R (n - 1)
forall a b. (a, b) -> b
snd ((โ, R (n - 1)) -> R (n - 1))
-> (R n -> (โ, R (n - 1))) -> R n -> R (n - 1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R n -> (โ, R (n - 1))
forall (n :: Nat). (KnownNat n, 1 <= n) => R n -> (โ, R (n - 1))
headTail (R n -> โ) -> R n -> โ
forall a b. (a -> b) -> a -> b
$ R n
v
instance (KnownNat n', KnownNat m') => Testable (L n' m')
where
checkT :: L n' m' -> (Bool, IO ())
checkT L n' m'
_ = (Bool, IO ())
test
instance KnownNat n => Normed (R n)
where
norm_0 :: R n -> โ
norm_0 R n
v = Vector โ -> โ
forall a. Normed a => a -> โ
norm_0 (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
norm_1 :: R n -> โ
norm_1 R n
v = Vector โ -> โ
forall a. Normed a => a -> โ
norm_1 (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
norm_2 :: R n -> โ
norm_2 R n
v = Vector โ -> โ
forall a. Normed a => a -> โ
norm_2 (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
norm_Inf :: R n -> โ
norm_Inf R n
v = Vector โ -> โ
forall a. Normed a => a -> โ
norm_Inf (R n -> Vector โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
instance (KnownNat m, KnownNat n) => Normed (L m n)
where
norm_0 :: L m n -> โ
norm_0 L m n
m = Matrix โ -> โ
forall a. Normed a => a -> โ
norm_0 (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
m)
norm_1 :: L m n -> โ
norm_1 L m n
m = Matrix โ -> โ
forall a. Normed a => a -> โ
norm_1 (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
m)
norm_2 :: L m n -> โ
norm_2 L m n
m = Matrix โ -> โ
forall a. Normed a => a -> โ
norm_2 (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
m)
norm_Inf :: L m n -> โ
norm_Inf L m n
m = Matrix โ -> โ
forall a. Normed a => a -> โ
norm_Inf (L m n -> Matrix โ
forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
m)
mkSym :: (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
f = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sym n) -> (Sym n -> Sq n) -> Sym n -> Sym n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sq n -> Sq n
f (Sq n -> Sq n) -> (Sym n -> Sq n) -> Sym n -> Sq n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sym n -> Sq n
forall (n :: Nat). Sym n -> Sq n
unSym
mkSym2 :: (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 Sq n -> Sq n -> Sq n
f Sym n
x Sym n
y = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sq n -> Sq n
f (Sym n -> Sq n
forall (n :: Nat). Sym n -> Sq n
unSym Sym n
x) (Sym n -> Sq n
forall (n :: Nat). Sym n -> Sq n
unSym Sym n
y))
instance KnownNat n => Num (Sym n)
where
+ :: Sym n -> Sym n -> Sym n
(+) = (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat) (n :: Nat).
(Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 Sq n -> Sq n -> Sq n
forall a. Num a => a -> a -> a
(+)
* :: Sym n -> Sym n -> Sym n
(*) = (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat) (n :: Nat).
(Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 Sq n -> Sq n -> Sq n
forall a. Num a => a -> a -> a
(*)
(-) = (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat) (n :: Nat).
(Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 (-)
abs :: Sym n -> Sym n
abs = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Num a => a -> a
abs
signum :: Sym n -> Sym n
signum = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Num a => a -> a
signum
negate :: Sym n -> Sym n
negate = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Num a => a -> a
negate
fromInteger :: Integer -> Sym n
fromInteger = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sym n) -> (Integer -> Sq n) -> Integer -> Sym n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Sq n
forall a. Num a => Integer -> a
fromInteger
instance KnownNat n => Fractional (Sym n)
where
fromRational :: Rational -> Sym n
fromRational = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym (Sq n -> Sym n) -> (Rational -> Sq n) -> Rational -> Sym n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Sq n
forall a. Fractional a => Rational -> a
fromRational
/ :: Sym n -> Sym n -> Sym n
(/) = (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat) (n :: Nat).
(Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 Sq n -> Sq n -> Sq n
forall a. Fractional a => a -> a -> a
(/)
instance KnownNat n => Floating (Sym n)
where
sin :: Sym n -> Sym n
sin = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
sin
cos :: Sym n -> Sym n
cos = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
cos
tan :: Sym n -> Sym n
tan = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
tan
asin :: Sym n -> Sym n
asin = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
asin
acos :: Sym n -> Sym n
acos = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
acos
atan :: Sym n -> Sym n
atan = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
atan
sinh :: Sym n -> Sym n
sinh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
sinh
cosh :: Sym n -> Sym n
cosh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
cosh
tanh :: Sym n -> Sym n
tanh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
tanh
asinh :: Sym n -> Sym n
asinh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
asinh
acosh :: Sym n -> Sym n
acosh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
acosh
atanh :: Sym n -> Sym n
atanh = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
atanh
exp :: Sym n -> Sym n
exp = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
exp
log :: Sym n -> Sym n
log = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
log
sqrt :: Sym n -> Sym n
sqrt = (Sq n -> Sq n) -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat). (Sq n -> Sq n) -> Sym n -> Sym n
mkSym Sq n -> Sq n
forall a. Floating a => a -> a
sqrt
** :: Sym n -> Sym n -> Sym n
(**) = (Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
forall (n :: Nat) (n :: Nat) (n :: Nat).
(Sq n -> Sq n -> Sq n) -> Sym n -> Sym n -> Sym n
mkSym2 Sq n -> Sq n -> Sq n
forall a. Floating a => a -> a -> a
(**)
pi :: Sym n
pi = Sq n -> Sym n
forall (n :: Nat). Sq n -> Sym n
Sym Sq n
forall a. Floating a => a
pi
instance KnownNat n => Additive (Sym n) where
add :: Sym n -> Sym n -> Sym n
add = Sym n -> Sym n -> Sym n
forall a. Num a => a -> a -> a
(+)
instance KnownNat n => Transposable (Sym n) (Sym n) where
tr :: Sym n -> Sym n
tr = Sym n -> Sym n
forall a. a -> a
id
tr' :: Sym n -> Sym n
tr' = Sym n -> Sym n
forall a. a -> a
id
instance KnownNat n => Transposable (Her n) (Her n) where
tr :: Her n -> Her n
tr = Her n -> Her n
forall a. a -> a
id
tr' :: Her n -> Her n
tr' (Her M n n
m) = M n n -> Her n
forall (n :: Nat). M n n -> Her n
Her (M n n -> M n n
forall m mt. Transposable m mt => m -> mt
tr' M n n
m)