{-# 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
Copyright   :  (c) Alberto Ruiz 2014
License     :  BSD3
Stability   :  experimental

Experimental interface with statically checked dimensions.

See code examples at http://dis.um.es/~alberto/hmatrix/static.html.

-}

module Numeric.LinearAlgebra.Static(
    -- * Vector
       โ„, R,
    vec2, vec3, vec4, (&), (#), split, headTail,
    vector,
    linspace, range, dim,
    -- * Matrix
    L, Sq, build,
    row, col, (|||),(===), splitRows, splitCols,
    unrow, uncol,
    tr,
    eye,
    diag,
    blockAt,
    matrix,
    -- * Complex
    โ„‚, C, M, Her, her, ๐‘–,
    toComplex,
    fromComplex,
    complex,
    real,
    imag,
    sqMagnitude,
    magnitude,
    -- * Products
    (<>),(#>),(<.>),
    -- * Linear Systems
    linSolve, (<\>),
    -- * Factorizations
    svd, withCompactSVD, svdTall, svdFlat, Eigen(..),
    withNullspace, withOrth, qr, chol,
    -- * Norms
    Normed(..),
    -- * Random arrays
    Seed, RandDist(..),
    randomVector, rand, randn, gaussianSample, uniformSample,
    -- * Misc
    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 -> 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 -> 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 |||
-- (|||) :: (KnownNat r, KnownNat c1, KnownNat c2) => L r c1 -> L r c2 -> L r (c1+c2)
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 CSq n = CL 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

-- use qrRaw?

--------------------------------------------------------------------------------

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)

-- | Useful for constraining two dependently typed vectors to match each
-- other in length when they are unknown at compile-time.
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)

-- | Useful for constraining two dependently typed matrices to match each
-- other in dimensions when they are unknown at compile-time.
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    -- ^ minimums of each row
    -> R n    -- ^ maximums of each row
    -> 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 (isDiag -> Just (0,a,_)) (extract -> b) = mkL (asColumn a * takeRows (LA.size a) b)

-- mulR (extract -> a) (isDiag -> Just (0,b,_)) = mkL (takeColumns (LA.size b) a * asRow 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 (isDiagC -> Just (0,a,_)) (extract -> b) = mkM (asColumn a * takeRows (LA.size a) b)

-- mulC (extract -> a) (isDiagC -> Just (0,b,_)) = mkM (takeColumns (LA.size b) a * asRow 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)