{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 708

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}

{-# OPTIONS_GHC -fno-warn-missing-signatures #-}

{- |
Module      :  Internal.Static
Copyright   :  (c) Alberto Ruiz 2006-14
License     :  BSD3
Stability   :  provisional

-}

module Internal.Static where


import GHC.TypeLits
import qualified Numeric.LinearAlgebra as LA
import Numeric.LinearAlgebra hiding (konst,size,R,C)
import Internal.Vector as D hiding (R,C)
import Internal.ST
import Control.DeepSeq
import Data.Proxy(Proxy)
import Foreign.Storable(Storable)
import Text.Printf

import Data.Binary
import GHC.Generics (Generic)
import Data.Proxy (Proxy(..))

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

type  = Double
type  = Complex Double

newtype Dim (n :: Nat) t = Dim t
  deriving (Int -> Dim n t -> ShowS
forall (n :: Nat) t. Show t => Int -> Dim n t -> ShowS
forall (n :: Nat) t. Show t => [Dim n t] -> ShowS
forall (n :: Nat) t. Show t => Dim n t -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Dim n t] -> ShowS
$cshowList :: forall (n :: Nat) t. Show t => [Dim n t] -> ShowS
show :: Dim n t -> String
$cshow :: forall (n :: Nat) t. Show t => Dim n t -> String
showsPrec :: Int -> Dim n t -> ShowS
$cshowsPrec :: forall (n :: Nat) t. Show t => Int -> Dim n t -> ShowS
Show, forall (n :: Nat) t x. Rep (Dim n t) x -> Dim n t
forall (n :: Nat) t x. Dim n t -> Rep (Dim n t) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (n :: Nat) t x. Rep (Dim n t) x -> Dim n t
$cfrom :: forall (n :: Nat) t x. Dim n t -> Rep (Dim n t) x
Generic)

instance (KnownNat n, Binary a) => Binary (Dim n a) where
  get :: Get (Dim n a)
get = do
    Integer
k <- forall t. Binary t => Get t
get
    let n :: Integer
n = forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall {k} (t :: k). Proxy t
Proxy :: Proxy n)
    if Integer
n forall a. Eq a => a -> a -> Bool
== Integer
k
      then forall (n :: Nat) t. t -> Dim n t
Dim forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall t. Binary t => Get t
get
      else forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Expected dimension " forall a. [a] -> [a] -> [a]
++ (forall a. Show a => a -> String
show Integer
n) forall a. [a] -> [a] -> [a]
++ String
", but found dimension " forall a. [a] -> [a] -> [a]
++ (forall a. Show a => a -> String
show Integer
k))

  put :: Dim n a -> Put
put (Dim a
x) = do
    forall t. Binary t => t -> Put
put (forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall {k} (t :: k). Proxy t
Proxy :: Proxy n))
    forall t. Binary t => t -> Put
put a
x

lift1F
  :: (c t -> c t)
  -> Dim n (c t) -> Dim n (c t)
lift1F :: forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F c t -> c t
f (Dim c t
v) = forall (n :: Nat) t. t -> Dim n t
Dim (c t -> c t
f c t
v)

lift2F
  :: (c t -> c t -> c t)
  -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F :: forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F c t -> c t -> c t
f (Dim c t
u) (Dim c t
v) = forall (n :: Nat) t. t -> Dim n t
Dim (c t -> c t -> c t
f c t
u c t
v)

instance NFData t => NFData (Dim n t) where
    rnf :: Dim n t -> ()
rnf (Dim (forall a. NFData a => a -> a
force -> !t
_)) = ()

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

newtype R n = R (Dim n (Vector ))
  deriving (Integer -> R n
R n -> R n
R n -> R n -> R n
forall (n :: Nat). Integer -> R n
forall (n :: Nat). R n -> R n
forall (n :: Nat). R n -> R n -> R n
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> R n
$cfromInteger :: forall (n :: Nat). Integer -> R n
signum :: R n -> R n
$csignum :: forall (n :: Nat). R n -> R n
abs :: R n -> R n
$cabs :: forall (n :: Nat). R n -> R n
negate :: R n -> R n
$cnegate :: forall (n :: Nat). R n -> R n
* :: R n -> R n -> R n
$c* :: forall (n :: Nat). R n -> R n -> R n
- :: R n -> R n -> R n
$c- :: forall (n :: Nat). R n -> R n -> R n
+ :: R n -> R n -> R n
$c+ :: forall (n :: Nat). R n -> R n -> R n
Num,Rational -> R n
R n -> R n
R n -> R n -> R n
forall (n :: Nat). Num (R n)
forall (n :: Nat). Rational -> R n
forall (n :: Nat). R n -> R n
forall (n :: Nat). R n -> R n -> R n
forall a.
Num a
-> (a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
fromRational :: Rational -> R n
$cfromRational :: forall (n :: Nat). Rational -> R n
recip :: R n -> R n
$crecip :: forall (n :: Nat). R n -> R n
/ :: R n -> R n -> R n
$c/ :: forall (n :: Nat). R n -> R n -> R n
Fractional,R n
R n -> R n
R n -> R n -> R n
forall (n :: Nat). Fractional (R n)
forall (n :: Nat). R n
forall (n :: Nat). R n -> R n
forall (n :: Nat). R n -> R n -> R n
forall a.
Fractional a
-> a
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> Floating a
log1mexp :: R n -> R n
$clog1mexp :: forall (n :: Nat). R n -> R n
log1pexp :: R n -> R n
$clog1pexp :: forall (n :: Nat). R n -> R n
expm1 :: R n -> R n
$cexpm1 :: forall (n :: Nat). R n -> R n
log1p :: R n -> R n
$clog1p :: forall (n :: Nat). R n -> R n
atanh :: R n -> R n
$catanh :: forall (n :: Nat). R n -> R n
acosh :: R n -> R n
$cacosh :: forall (n :: Nat). R n -> R n
asinh :: R n -> R n
$casinh :: forall (n :: Nat). R n -> R n
tanh :: R n -> R n
$ctanh :: forall (n :: Nat). R n -> R n
cosh :: R n -> R n
$ccosh :: forall (n :: Nat). R n -> R n
sinh :: R n -> R n
$csinh :: forall (n :: Nat). R n -> R n
atan :: R n -> R n
$catan :: forall (n :: Nat). R n -> R n
acos :: R n -> R n
$cacos :: forall (n :: Nat). R n -> R n
asin :: R n -> R n
$casin :: forall (n :: Nat). R n -> R n
tan :: R n -> R n
$ctan :: forall (n :: Nat). R n -> R n
cos :: R n -> R n
$ccos :: forall (n :: Nat). R n -> R n
sin :: R n -> R n
$csin :: forall (n :: Nat). R n -> R n
logBase :: R n -> R n -> R n
$clogBase :: forall (n :: Nat). R n -> R n -> R n
** :: R n -> R n -> R n
$c** :: forall (n :: Nat). R n -> R n -> R n
sqrt :: R n -> R n
$csqrt :: forall (n :: Nat). R n -> R n
log :: R n -> R n
$clog :: forall (n :: Nat). R n -> R n
exp :: R n -> R n
$cexp :: forall (n :: Nat). R n -> R n
pi :: R n
$cpi :: forall (n :: Nat). R n
Floating,forall (n :: Nat) x. Rep (R n) x -> R n
forall (n :: Nat) x. R n -> Rep (R n) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (n :: Nat) x. Rep (R n) x -> R n
$cfrom :: forall (n :: Nat) x. R n -> Rep (R n) x
Generic,Get (R n)
[R n] -> Put
R n -> Put
forall (n :: Nat). KnownNat n => Get (R n)
forall (n :: Nat). KnownNat n => [R n] -> Put
forall (n :: Nat). KnownNat n => R n -> Put
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [R n] -> Put
$cputList :: forall (n :: Nat). KnownNat n => [R n] -> Put
get :: Get (R n)
$cget :: forall (n :: Nat). KnownNat n => Get (R n)
put :: R n -> Put
$cput :: forall (n :: Nat). KnownNat n => R n -> Put
Binary)

newtype C n = C (Dim n (Vector ))
  deriving (Integer -> C n
C n -> C n
C n -> C n -> C n
forall (n :: Nat). Integer -> C n
forall (n :: Nat). C n -> C n
forall (n :: Nat). C n -> C n -> C n
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> C n
$cfromInteger :: forall (n :: Nat). Integer -> C n
signum :: C n -> C n
$csignum :: forall (n :: Nat). C n -> C n
abs :: C n -> C n
$cabs :: forall (n :: Nat). C n -> C n
negate :: C n -> C n
$cnegate :: forall (n :: Nat). C n -> C n
* :: C n -> C n -> C n
$c* :: forall (n :: Nat). C n -> C n -> C n
- :: C n -> C n -> C n
$c- :: forall (n :: Nat). C n -> C n -> C n
+ :: C n -> C n -> C n
$c+ :: forall (n :: Nat). C n -> C n -> C n
Num,Rational -> C n
C n -> C n
C n -> C n -> C n
forall (n :: Nat). Num (C n)
forall (n :: Nat). Rational -> C n
forall (n :: Nat). C n -> C n
forall (n :: Nat). C n -> C n -> C n
forall a.
Num a
-> (a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
fromRational :: Rational -> C n
$cfromRational :: forall (n :: Nat). Rational -> C n
recip :: C n -> C n
$crecip :: forall (n :: Nat). C n -> C n
/ :: C n -> C n -> C n
$c/ :: forall (n :: Nat). C n -> C n -> C n
Fractional,C n
C n -> C n
C n -> C n -> C n
forall (n :: Nat). Fractional (C n)
forall (n :: Nat). C n
forall (n :: Nat). C n -> C n
forall (n :: Nat). C n -> C n -> C n
forall a.
Fractional a
-> a
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> Floating a
log1mexp :: C n -> C n
$clog1mexp :: forall (n :: Nat). C n -> C n
log1pexp :: C n -> C n
$clog1pexp :: forall (n :: Nat). C n -> C n
expm1 :: C n -> C n
$cexpm1 :: forall (n :: Nat). C n -> C n
log1p :: C n -> C n
$clog1p :: forall (n :: Nat). C n -> C n
atanh :: C n -> C n
$catanh :: forall (n :: Nat). C n -> C n
acosh :: C n -> C n
$cacosh :: forall (n :: Nat). C n -> C n
asinh :: C n -> C n
$casinh :: forall (n :: Nat). C n -> C n
tanh :: C n -> C n
$ctanh :: forall (n :: Nat). C n -> C n
cosh :: C n -> C n
$ccosh :: forall (n :: Nat). C n -> C n
sinh :: C n -> C n
$csinh :: forall (n :: Nat). C n -> C n
atan :: C n -> C n
$catan :: forall (n :: Nat). C n -> C n
acos :: C n -> C n
$cacos :: forall (n :: Nat). C n -> C n
asin :: C n -> C n
$casin :: forall (n :: Nat). C n -> C n
tan :: C n -> C n
$ctan :: forall (n :: Nat). C n -> C n
cos :: C n -> C n
$ccos :: forall (n :: Nat). C n -> C n
sin :: C n -> C n
$csin :: forall (n :: Nat). C n -> C n
logBase :: C n -> C n -> C n
$clogBase :: forall (n :: Nat). C n -> C n -> C n
** :: C n -> C n -> C n
$c** :: forall (n :: Nat). C n -> C n -> C n
sqrt :: C n -> C n
$csqrt :: forall (n :: Nat). C n -> C n
log :: C n -> C n
$clog :: forall (n :: Nat). C n -> C n
exp :: C n -> C n
$cexp :: forall (n :: Nat). C n -> C n
pi :: C n
$cpi :: forall (n :: Nat). C n
Floating,forall (n :: Nat) x. Rep (C n) x -> C n
forall (n :: Nat) x. C n -> Rep (C n) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (n :: Nat) x. Rep (C n) x -> C n
$cfrom :: forall (n :: Nat) x. C n -> Rep (C n) x
Generic)

newtype L m n = L (Dim m (Dim n (Matrix )))
  deriving (forall (m :: Nat) (n :: Nat) x. Rep (L m n) x -> L m n
forall (m :: Nat) (n :: Nat) x. L m n -> Rep (L m n) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (m :: Nat) (n :: Nat) x. Rep (L m n) x -> L m n
$cfrom :: forall (m :: Nat) (n :: Nat) x. L m n -> Rep (L m n) x
Generic, Get (L m n)
[L m n] -> Put
L m n -> Put
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
Get (L m n)
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
[L m n] -> Put
forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Put
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [L m n] -> Put
$cputList :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
[L m n] -> Put
get :: Get (L m n)
$cget :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
Get (L m n)
put :: L m n -> Put
$cput :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Put
Binary)

newtype M m n = M (Dim m (Dim n (Matrix )))
  deriving (forall (m :: Nat) (n :: Nat) x. Rep (M m n) x -> M m n
forall (m :: Nat) (n :: Nat) x. M m n -> Rep (M m n) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (m :: Nat) (n :: Nat) x. Rep (M m n) x -> M m n
$cfrom :: forall (m :: Nat) (n :: Nat) x. M m n -> Rep (M m n) x
Generic)

mkR :: Vector  -> R n
mkR :: forall (n :: Nat). Vector ℝ -> R n
mkR = forall (n :: Nat). Dim n (Vector ℝ) -> R n
R forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim

mkC :: Vector  -> C n
mkC :: forall (n :: Nat). Vector ℂ -> C n
mkC = forall (n :: Nat). Dim n (Vector ℂ) -> C n
C forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim

mkL :: Matrix  -> L m n
mkL :: forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL Matrix ℝ
x = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L (forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim Matrix ℝ
x))

mkM :: Matrix  -> M m n
mkM :: forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM Matrix ℂ
x = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M (forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim Matrix ℂ
x))

instance NFData (R n) where
    rnf :: R n -> ()
rnf (R (forall a. NFData a => a -> a
force -> !Dim n (Vector ℝ)
_)) = ()

instance NFData (C n) where
    rnf :: C n -> ()
rnf (C (forall a. NFData a => a -> a
force -> !Dim n (Vector ℂ)
_)) = ()

instance NFData (L n m) where
    rnf :: L n m -> ()
rnf (L (forall a. NFData a => a -> a
force -> !Dim n (Dim m (Matrix ℝ))
_)) = ()

instance NFData (M n m) where
    rnf :: M n m -> ()
rnf (M (forall a. NFData a => a -> a
force -> !Dim n (Dim m (Matrix ℂ))
_)) = ()

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

type V n t = Dim n (Vector t)

ud :: Dim n (Vector t) -> Vector t
ud :: forall (n :: Nat) t. Dim n (Vector t) -> Vector t
ud (Dim Vector t
v) = Vector t
v

mkV :: forall (n :: Nat) t . t -> Dim n t
mkV :: forall (n :: Nat) t. t -> Dim n t
mkV = forall (n :: Nat) t. t -> Dim n t
Dim


vconcat :: forall n m t . (KnownNat n, KnownNat m, Numeric t)
    => V n t -> V m t -> V (n+m) t
(forall (n :: Nat) t. Dim n (Vector t) -> Vector t
ud -> Vector t
u) vconcat :: forall (n :: Nat) (m :: Nat) t.
(KnownNat n, KnownNat m, Numeric t) =>
V n t -> V m t -> V (n + m) t
`vconcat` (forall (n :: Nat) t. Dim n (Vector t) -> Vector t
ud -> Vector t
v) = forall (n :: Nat) t. t -> Dim n t
mkV (forall t. Storable t => [Vector t] -> Vector t
vjoin [Vector t
u', Vector t
v'])
  where
    du :: Int
du = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n)
    dv :: Int
dv = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy m)
    u' :: Vector t
u' | Int
du forall a. Eq a => a -> a -> Bool
/= Int
1 Bool -> Bool -> Bool
&& forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
u forall a. Eq a => a -> a -> Bool
== Int
1 = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Vector t
u forall t. Storable t => Vector t -> Int -> t
D.@> Int
0) Int
du
       | Bool
otherwise = Vector t
u
    v' :: Vector t
v' | Int
dv forall a. Eq a => a -> a -> Bool
/= Int
1 Bool -> Bool -> Bool
&& forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
v forall a. Eq a => a -> a -> Bool
== Int
1 = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Vector t
v forall t. Storable t => Vector t -> Int -> t
D.@> Int
0) Int
dv
       | Bool
otherwise = Vector t
v


gvec2 :: Storable t => t -> t -> V 2 t
gvec2 :: forall t. Storable t => t -> t -> V 2 t
gvec2 t
a t
b = forall (n :: Nat) t. t -> Dim n t
mkV forall a b. (a -> b) -> a -> b
$ forall t. Storable t => (forall s. ST s (STVector s t)) -> Vector t
runSTVector forall a b. (a -> b) -> a -> b
$ do
    STVector s t
v <- forall t s. Storable t => Int -> ST s (STVector s t)
newUndefinedVector Int
2
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
0 t
a
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
1 t
b
    forall (m :: * -> *) a. Monad m => a -> m a
return STVector s t
v

gvec3 :: Storable t => t -> t -> t -> V 3 t
gvec3 :: forall t. Storable t => t -> t -> t -> V 3 t
gvec3 t
a t
b t
c = forall (n :: Nat) t. t -> Dim n t
mkV forall a b. (a -> b) -> a -> b
$ forall t. Storable t => (forall s. ST s (STVector s t)) -> Vector t
runSTVector forall a b. (a -> b) -> a -> b
$ do
    STVector s t
v <- forall t s. Storable t => Int -> ST s (STVector s t)
newUndefinedVector Int
3
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
0 t
a
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
1 t
b
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
2 t
c
    forall (m :: * -> *) a. Monad m => a -> m a
return STVector s t
v


gvec4 :: Storable t => t -> t -> t -> t -> V 4 t
gvec4 :: forall t. Storable t => t -> t -> t -> t -> V 4 t
gvec4 t
a t
b t
c t
d = forall (n :: Nat) t. t -> Dim n t
mkV forall a b. (a -> b) -> a -> b
$ forall t. Storable t => (forall s. ST s (STVector s t)) -> Vector t
runSTVector forall a b. (a -> b) -> a -> b
$ do
    STVector s t
v <- forall t s. Storable t => Int -> ST s (STVector s t)
newUndefinedVector Int
4
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
0 t
a
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
1 t
b
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
2 t
c
    forall t s. Storable t => STVector s t -> Int -> t -> ST s ()
writeVector STVector s t
v Int
3 t
d
    forall (m :: * -> *) a. Monad m => a -> m a
return STVector s t
v


gvect :: forall n t . (Show t, KnownNat n, Numeric t) => String -> [t] -> V n t
gvect :: forall (n :: Nat) t.
(Show t, KnownNat n, Numeric t) =>
String -> [t] -> V n t
gvect String
st [t]
xs'
    | Bool
ok = forall (n :: Nat) t. t -> Dim n t
mkV Vector t
v
    | Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest) Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a. [a] -> [a]
tail [t]
rest) = forall {a}. String -> a
abort (forall a. Show a => a -> String
show [t]
xs')
    | Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest) = forall {a}. String -> a
abort (forall a. [a] -> [a]
init (forall a. Show a => a -> String
show ([t]
xsforall a. [a] -> [a] -> [a]
++forall a. Int -> [a] -> [a]
take Int
1 [t]
rest))forall a. [a] -> [a] -> [a]
++String
", ... ]")
    | Bool
otherwise = forall {a}. String -> a
abort (forall a. Show a => a -> String
show [t]
xs)
  where
    ([t]
xs,[t]
rest) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
d [t]
xs'
    ok :: Bool
ok = forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
v forall a. Eq a => a -> a -> Bool
== Int
d Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest
    v :: Vector t
v = forall a. Storable a => [a] -> Vector a
LA.fromList [t]
xs
    d :: Int
d = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n)
    abort :: String -> a
abort String
info = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
stforall a. [a] -> [a] -> [a]
++String
" "forall a. [a] -> [a] -> [a]
++forall a. Show a => a -> String
show Int
dforall a. [a] -> [a] -> [a]
++String
" can't be created from elements "forall a. [a] -> [a] -> [a]
++String
info


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

type GM m n t = Dim m (Dim n (Matrix t))


gmat :: forall m n t . (Show t, KnownNat m, KnownNat n, Numeric t) => String -> [t] -> GM m n t
gmat :: forall (m :: Nat) (n :: Nat) t.
(Show t, KnownNat m, KnownNat n, Numeric t) =>
String -> [t] -> GM m n t
gmat String
st [t]
xs'
    | Bool
ok = forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim Matrix t
x)
    | Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest) Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a. [a] -> [a]
tail [t]
rest) = forall {a}. String -> a
abort (forall a. Show a => a -> String
show [t]
xs')
    | Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest) = forall {a}. String -> a
abort (forall a. [a] -> [a]
init (forall a. Show a => a -> String
show ([t]
xsforall a. [a] -> [a] -> [a]
++forall a. Int -> [a] -> [a]
take Int
1 [t]
rest))forall a. [a] -> [a] -> [a]
++String
", ... ]")
    | Bool
otherwise = forall {a}. String -> a
abort (forall a. Show a => a -> String
show [t]
xs)
  where
    ([t]
xs,[t]
rest) = forall a. Int -> [a] -> ([a], [a])
splitAt (Int
m'forall a. Num a => a -> a -> a
*Int
n') [t]
xs'
    v :: Vector t
v = forall a. Storable a => [a] -> Vector a
LA.fromList [t]
xs
    x :: Matrix t
x = forall t. Storable t => Int -> Vector t -> Matrix t
reshape Int
n' Vector t
v
    ok :: Bool
ok = forall (t :: * -> *) a. Foldable t => t a -> Bool
null [t]
rest Bool -> Bool -> Bool
&& ((Int
n' forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& forall t. Storable t => Vector t -> Int
dim Vector t
v forall a. Eq a => a -> a -> Bool
== Int
0) Bool -> Bool -> Bool
|| Int
n'forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& (forall a. Integral a => a -> a -> a
rem (forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
v) Int
n' forall a. Eq a => a -> a -> Bool
== Int
0) Bool -> Bool -> Bool
&& forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Matrix t
x forall a. Eq a => a -> a -> Bool
== (Int
m',Int
n'))
    m' :: Int
m' = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy m) :: Int
    n' :: Int
n' = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n) :: Int
    abort :: String -> a
abort String
info = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
st forall a. [a] -> [a] -> [a]
++String
" "forall a. [a] -> [a] -> [a]
++forall a. Show a => a -> String
show Int
m' forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n'forall a. [a] -> [a] -> [a]
++String
" can't be created from elements " forall a. [a] -> [a] -> [a]
++ String
info

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

class Num t => Sized t s d | s -> t, s -> d
  where
    konst     ::  t   -> s
    unwrap    ::  s   -> d t
    fromList  :: [t]  -> s
    extract   ::  s   -> d t
    create    ::  d t -> Maybe s
    size      ::  s   -> IndexOf d

singleV :: c t -> Bool
singleV c t
v = forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size c t
v forall a. Eq a => a -> a -> Bool
== IndexOf c
1
singleM :: Matrix t -> Bool
singleM Matrix t
m = forall t. Matrix t -> Int
rows Matrix t
m forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& forall t. Matrix t -> Int
cols Matrix t
m forall a. Eq a => a -> a -> Bool
== Int
1


instance KnownNat n => Sized  (C n) Vector
  where
    size :: C n -> IndexOf Vector
size C n
_ = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n)
    konst :: ℂ -> C n
konst x = forall (n :: Nat). Vector ℂ -> C n
mkC (forall (c :: * -> *) e. Container c e => e -> c e
LA.scalar x)
    unwrap :: C n -> Vector ℂ
unwrap (C (Dim Vector ℂ
v)) = Vector ℂ
v
    fromList :: [ℂ] -> C n
fromList [ℂ]
xs = forall (n :: Nat). Dim n (Vector ℂ) -> C n
C (forall (n :: Nat) t.
(Show t, KnownNat n, Numeric t) =>
String -> [t] -> V n t
gvect String
"C" [ℂ]
xs)
    extract :: C n -> Vector ℂ
extract s :: C n
s@(forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Vector ℂ
v)
      | forall {c :: * -> *} {t}.
(Eq (IndexOf c), Container c t, Num (IndexOf c)) =>
c t -> Bool
singleV Vector ℂ
v = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Vector ℂ
vforall c t. Indexable c t => c -> Int -> t
!Int
0) (forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size C n
s)
      | Bool
otherwise = Vector ℂ
v
    create :: Vector ℂ -> Maybe (C n)
create Vector ℂ
v
        | forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector ℂ
v forall a. Eq a => a -> a -> Bool
== forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size C n
r = forall a. a -> Maybe a
Just C n
r
        | Bool
otherwise = forall a. Maybe a
Nothing
      where
        r :: C n
r = forall (n :: Nat). Vector ℂ -> C n
mkC Vector ℂ
v :: C n


instance KnownNat n => Sized  (R n) Vector
  where
    size :: R n -> IndexOf Vector
size R n
_ = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n)
    konst :: ℝ -> R n
konst x = forall (n :: Nat). Vector ℝ -> R n
mkR (forall (c :: * -> *) e. Container c e => e -> c e
LA.scalar x)
    unwrap :: R n -> Vector ℝ
unwrap (R (Dim Vector ℝ
v)) = Vector ℝ
v
    fromList :: [ℝ] -> R n
fromList [ℝ]
xs = forall (n :: Nat). Dim n (Vector ℝ) -> R n
R (forall (n :: Nat) t.
(Show t, KnownNat n, Numeric t) =>
String -> [t] -> V n t
gvect String
"R" [ℝ]
xs)
    extract :: R n -> Vector ℝ
extract s :: R n
s@(forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Vector ℝ
v)
      | forall {c :: * -> *} {t}.
(Eq (IndexOf c), Container c t, Num (IndexOf c)) =>
c t -> Bool
singleV Vector ℝ
v = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Vector ℝ
vforall c t. Indexable c t => c -> Int -> t
!Int
0) (forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
s)
      | Bool
otherwise = Vector ℝ
v
    create :: Vector ℝ -> Maybe (R n)
create Vector ℝ
v
        | forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector ℝ
v forall a. Eq a => a -> a -> Bool
== forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
r = forall a. a -> Maybe a
Just R n
r
        | Bool
otherwise = forall a. Maybe a
Nothing
      where
        r :: R n
r = forall (n :: Nat). Vector ℝ -> R n
mkR Vector ℝ
v :: R n



instance (KnownNat m, KnownNat n) => Sized  (L m n) Matrix
  where
    size :: L m n -> IndexOf Matrix
size L m n
_ = ((forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal) (forall a. HasCallStack => a
undefined :: Proxy m)
             ,(forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal) (forall a. HasCallStack => a
undefined :: Proxy n))
    konst :: ℝ -> L m n
konst x = forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL (forall (c :: * -> *) e. Container c e => e -> c e
LA.scalar x)
    fromList :: [ℝ] -> L m n
fromList [ℝ]
xs = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L (forall (m :: Nat) (n :: Nat) t.
(Show t, KnownNat m, KnownNat n, Numeric t) =>
String -> [t] -> GM m n t
gmat String
"L" [ℝ]
xs)
    unwrap :: L m n -> Matrix ℝ
unwrap (L (Dim (Dim Matrix ℝ
m))) = Matrix ℝ
m
    extract :: L m n -> Matrix ℝ
extract (forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag -> Just (z,Vector ℝ
y,(Int
m',Int
n'))) = forall t. Storable t => t -> Vector t -> Int -> Int -> Matrix t
diagRect z Vector ℝ
y Int
m' Int
n'
    extract s :: L m n
s@(forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Matrix ℝ
a)
        | forall {t}. Matrix t -> Bool
singleM Matrix ℝ
a = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Matrix ℝ
a forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0)) (forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
s)
        | Bool
otherwise = Matrix ℝ
a
    create :: Matrix ℝ -> Maybe (L m n)
create Matrix ℝ
x
        | forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Matrix ℝ
x forall a. Eq a => a -> a -> Bool
== forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
r = forall a. a -> Maybe a
Just L m n
r
        | Bool
otherwise = forall a. Maybe a
Nothing
      where
        r :: L m n
r = forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL Matrix ℝ
x :: L m n


instance (KnownNat m, KnownNat n) => Sized  (M m n) Matrix
  where
    size :: M m n -> IndexOf Matrix
size M m n
_ = ((forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal) (forall a. HasCallStack => a
undefined :: Proxy m)
             ,(forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal) (forall a. HasCallStack => a
undefined :: Proxy n))
    konst :: ℂ -> M m n
konst x = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall (c :: * -> *) e. Container c e => e -> c e
LA.scalar x)
    fromList :: [ℂ] -> M m n
fromList [ℂ]
xs = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M (forall (m :: Nat) (n :: Nat) t.
(Show t, KnownNat m, KnownNat n, Numeric t) =>
String -> [t] -> GM m n t
gmat String
"M" [ℂ]
xs)
    unwrap :: M m n -> Matrix ℂ
unwrap (M (Dim (Dim Matrix ℂ
m))) = Matrix ℂ
m
    extract :: M m n -> Matrix ℂ
extract (forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (z,Vector ℂ
y,(Int
m',Int
n'))) = forall t. Storable t => t -> Vector t -> Int -> Int -> Matrix t
diagRect z Vector ℂ
y Int
m' Int
n'
    extract s :: M m n
s@(forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap -> Matrix ℂ
a)
        | forall {t}. Matrix t -> Bool
singleM Matrix ℂ
a = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst (Matrix ℂ
a forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0)) (forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size M m n
s)
        | Bool
otherwise = Matrix ℂ
a
    create :: Matrix ℂ -> Maybe (M m n)
create Matrix ℂ
x
        | forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Matrix ℂ
x forall a. Eq a => a -> a -> Bool
== forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size M m n
r = forall a. a -> Maybe a
Just M m n
r
        | Bool
otherwise = forall a. Maybe a
Nothing
      where
        r :: M m n
r = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM Matrix ℂ
x :: M m n

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

instance (KnownNat n, KnownNat m) => Transposable (L m n) (L n m)
  where
    tr :: L m n -> L n m
tr a :: L m n
a@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag -> Just (ℝ, Vector ℝ, (Int, Int))
_) = forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL (forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
a)
    tr (forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix ℝ
a) = forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL (forall m mt. Transposable m mt => m -> mt
tr Matrix ℝ
a)
    tr' :: L m n -> L n m
tr' = forall m mt. Transposable m mt => m -> mt
tr

instance (KnownNat n, KnownNat m) => Transposable (M m n) (M n m)
  where
    tr :: M m n -> M n m
tr a :: M m n
a@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (ℂ, Vector ℂ, (Int, Int))
_) = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
a)
    tr (forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix ℂ
a) = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall m mt. Transposable m mt => m -> mt
tr Matrix ℂ
a)
    tr' :: M m n -> M n m
tr' a :: M m n
a@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (ℂ, Vector ℂ, (Int, Int))
_) = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
a)
    tr' (forall t s (d :: * -> *). Sized t s d => s -> d t
extract -> Matrix ℂ
a) = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall m mt. Transposable m mt => m -> mt
tr' Matrix ℂ
a)

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

isDiag :: forall m n . (KnownNat m, KnownNat n) => L m n -> Maybe (, Vector , (Int,Int))
isDiag :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag (L Dim m (Dim n (Matrix ℝ))
x) = forall (m :: Nat) (n :: Nat) t.
(Numeric t, KnownNat m, KnownNat n) =>
GM m n t -> Maybe (t, Vector t, (Int, Int))
isDiagg Dim m (Dim n (Matrix ℝ))
x

isDiagC :: forall m n . (KnownNat m, KnownNat n) => M m n -> Maybe (, Vector , (Int,Int))
isDiagC :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC (M Dim m (Dim n (Matrix ℂ))
x) = forall (m :: Nat) (n :: Nat) t.
(Numeric t, KnownNat m, KnownNat n) =>
GM m n t -> Maybe (t, Vector t, (Int, Int))
isDiagg Dim m (Dim n (Matrix ℂ))
x


isDiagg :: forall m n t . (Numeric t, KnownNat m, KnownNat n) => GM m n t -> Maybe (t, Vector t, (Int,Int))
isDiagg :: forall (m :: Nat) (n :: Nat) t.
(Numeric t, KnownNat m, KnownNat n) =>
GM m n t -> Maybe (t, Vector t, (Int, Int))
isDiagg (Dim (Dim Matrix t
x))
    | forall {t}. Matrix t -> Bool
singleM Matrix t
x = forall a. Maybe a
Nothing
    | forall t. Matrix t -> Int
rows Matrix t
x forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& Int
m' forall a. Ord a => a -> a -> Bool
> Int
1 Bool -> Bool -> Bool
|| forall t. Matrix t -> Int
cols Matrix t
x forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& Int
n' forall a. Ord a => a -> a -> Bool
> Int
1 = forall a. a -> Maybe a
Just (t
z,Vector t
yz,(Int
m',Int
n'))
    | Bool
otherwise = forall a. Maybe a
Nothing
  where
    m' :: Int
m' = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy m) :: Int
    n' :: Int
n' = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal forall a b. (a -> b) -> a -> b
$ (forall a. HasCallStack => a
undefined :: Proxy n) :: Int
    v :: Vector t
v = forall t. Element t => Matrix t -> Vector t
flatten Matrix t
x
    z :: t
z = Vector t
v forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` Int
0
    y :: Vector t
y = forall t. Storable t => Int -> Int -> Vector t -> Vector t
subVector Int
1 (forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
vforall a. Num a => a -> a -> a
-Int
1) Vector t
v
    ny :: IndexOf Vector
ny = forall (c :: * -> *) t. Container c t => c t -> IndexOf c
LA.size Vector t
y
    zeros :: Vector t
zeros = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
LA.konst t
0 (forall a. Ord a => a -> a -> a
max Int
0 (forall a. Ord a => a -> a -> a
min Int
m' Int
n' forall a. Num a => a -> a -> a
- Int
ny))
    yz :: Vector t
yz = forall t. Storable t => [Vector t] -> Vector t
vjoin [Vector t
y,Vector t
zeros]

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

instance KnownNat n => Show (R n)
  where
    show :: R n -> String
show s :: R n
s@(R (Dim Vector ℝ
v))
      | forall {c :: * -> *} {t}.
(Eq (IndexOf c), Container c t, Num (IndexOf c)) =>
c t -> Bool
singleV Vector ℝ
v = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Vector ℝ
vforall c t. Indexable c t => c -> Int -> t
!Int
0) forall a. [a] -> [a] -> [a]
++ String
" :: R " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
d forall a. [a] -> [a] -> [a]
++ String
")"
      | Bool
otherwise = String
"(vector " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Vector ℝ
v forall a. [a] -> [a] -> [a]
++ String
" :: R " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
d forall a. [a] -> [a] -> [a]
++String
")"
      where
        d :: IndexOf Vector
d = forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size R n
s

instance KnownNat n => Show (C n)
  where
    show :: C n -> String
show s :: C n
s@(C (Dim Vector ℂ
v))
      | forall {c :: * -> *} {t}.
(Eq (IndexOf c), Container c t, Num (IndexOf c)) =>
c t -> Bool
singleV Vector ℂ
v = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Vector ℂ
vforall c t. Indexable c t => c -> Int -> t
!Int
0) forall a. [a] -> [a] -> [a]
++ String
" :: C " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
d forall a. [a] -> [a] -> [a]
++ String
")"
      | Bool
otherwise = String
"(vector " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Vector ℂ
v forall a. [a] -> [a] -> [a]
++ String
" :: C " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
d forall a. [a] -> [a] -> [a]
++String
")"
      where
        d :: IndexOf Vector
d = forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size C n
s

instance (KnownNat m, KnownNat n) => Show (L m n)
  where
    show :: L m n -> String
show (forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag -> Just (z,Vector ℝ
y,(Int
m',Int
n'))) = forall r. PrintfType r => String -> r
printf String
"(diag %s %s :: L %d %d)" (forall a. Show a => a -> String
show z) (forall a. Show a => a -> String
show Vector ℝ
y) Int
m' Int
n'
    show s :: L m n
s@(L (Dim (Dim Matrix ℝ
x)))
       | forall {t}. Matrix t -> Bool
singleM Matrix ℝ
x = forall r. PrintfType r => String -> r
printf String
"(%s :: L %d %d)" (forall a. Show a => a -> String
show (Matrix ℝ
x forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0))) Int
m' Int
n'
       | Bool
otherwise = String
"(matrix" forall a. [a] -> [a] -> [a]
++ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'\n') (forall a. Show a => a -> String
show Matrix ℝ
x) forall a. [a] -> [a] -> [a]
++ String
" :: L " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
m' forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n' forall a. [a] -> [a] -> [a]
++ String
")"
      where
        (Int
m',Int
n') = forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size L m n
s

instance (KnownNat m, KnownNat n) => Show (M m n)
  where
    show :: M m n -> String
show (forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (z,Vector ℂ
y,(Int
m',Int
n'))) = forall r. PrintfType r => String -> r
printf String
"(diag %s %s :: M %d %d)" (forall a. Show a => a -> String
show z) (forall a. Show a => a -> String
show Vector ℂ
y) Int
m' Int
n'
    show s :: M m n
s@(M (Dim (Dim Matrix ℂ
x)))
       | forall {t}. Matrix t -> Bool
singleM Matrix ℂ
x = forall r. PrintfType r => String -> r
printf String
"(%s :: M %d %d)" (forall a. Show a => a -> String
show (Matrix ℂ
x forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
0,Int
0))) Int
m' Int
n'
       | Bool
otherwise = String
"(matrix" forall a. [a] -> [a] -> [a]
++ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'\n') (forall a. Show a => a -> String
show Matrix ℂ
x) forall a. [a] -> [a] -> [a]
++ String
" :: M " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
m' forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n' forall a. [a] -> [a] -> [a]
++ String
")"
      where
        (Int
m',Int
n') = forall t s (d :: * -> *). Sized t s d => s -> IndexOf d
size M m n
s

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

instance (Num (Vector t), Numeric t )=> Num (Dim n (Vector t))
  where
    + :: Dim n (Vector t) -> Dim n (Vector t) -> Dim n (Vector t)
(+) = forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall a. Num a => a -> a -> a
(+)
    * :: Dim n (Vector t) -> Dim n (Vector t) -> Dim n (Vector t)
(*) = forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall a. Num a => a -> a -> a
(*)
    (-) = forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F (-)
    abs :: Dim n (Vector t) -> Dim n (Vector t)
abs = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Num a => a -> a
abs
    signum :: Dim n (Vector t) -> Dim n (Vector t)
signum = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Num a => a -> a
signum
    negate :: Dim n (Vector t) -> Dim n (Vector t)
negate = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Num a => a -> a
negate
    fromInteger :: Integer -> Dim n (Vector t)
fromInteger Integer
x = forall (n :: Nat) t. t -> Dim n t
Dim (forall a. Num a => Integer -> a
fromInteger Integer
x)

instance (Num (Vector t), Fractional t, Numeric t) => Fractional (Dim n (Vector t))
  where
    fromRational :: Rational -> Dim n (Vector t)
fromRational Rational
x = forall (n :: Nat) t. t -> Dim n t
Dim (forall a. Fractional a => Rational -> a
fromRational Rational
x)
    / :: Dim n (Vector t) -> Dim n (Vector t) -> Dim n (Vector t)
(/) = forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall a. Fractional a => a -> a -> a
(/)

instance (Fractional t, Floating (Vector t), Numeric t) => Floating (Dim n (Vector t)) where
    sin :: Dim n (Vector t) -> Dim n (Vector t)
sin   = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
sin
    cos :: Dim n (Vector t) -> Dim n (Vector t)
cos   = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
cos
    tan :: Dim n (Vector t) -> Dim n (Vector t)
tan   = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
tan
    asin :: Dim n (Vector t) -> Dim n (Vector t)
asin  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
asin
    acos :: Dim n (Vector t) -> Dim n (Vector t)
acos  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
acos
    atan :: Dim n (Vector t) -> Dim n (Vector t)
atan  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
atan
    sinh :: Dim n (Vector t) -> Dim n (Vector t)
sinh  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
sinh
    cosh :: Dim n (Vector t) -> Dim n (Vector t)
cosh  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
cosh
    tanh :: Dim n (Vector t) -> Dim n (Vector t)
tanh  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
tanh
    asinh :: Dim n (Vector t) -> Dim n (Vector t)
asinh = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
asinh
    acosh :: Dim n (Vector t) -> Dim n (Vector t)
acosh = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
acosh
    atanh :: Dim n (Vector t) -> Dim n (Vector t)
atanh = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
atanh
    exp :: Dim n (Vector t) -> Dim n (Vector t)
exp   = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
exp
    log :: Dim n (Vector t) -> Dim n (Vector t)
log   = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
log
    sqrt :: Dim n (Vector t) -> Dim n (Vector t)
sqrt  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall a. Floating a => a -> a
sqrt
    ** :: Dim n (Vector t) -> Dim n (Vector t) -> Dim n (Vector t)
(**)  = forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall a. Floating a => a -> a -> a
(**)
    pi :: Dim n (Vector t)
pi    = forall (n :: Nat) t. t -> Dim n t
Dim forall a. Floating a => a
pi


instance (Num (Vector t), Numeric t) => Num (Dim m (Dim n (Matrix t)))
  where
    + :: Dim m (Dim n (Matrix t))
-> Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
(+) = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F) forall a. Num a => a -> a -> a
(+)
    * :: Dim m (Dim n (Matrix t))
-> Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
(*) = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F) forall a. Num a => a -> a -> a
(*)
    (-) = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F) (-)
    abs :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
abs = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Num a => a -> a
abs
    signum :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
signum = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Num a => a -> a
signum
    negate :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
negate = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Num a => a -> a
negate
    fromInteger :: Integer -> Dim m (Dim n (Matrix t))
fromInteger Integer
x = forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim (forall a. Num a => Integer -> a
fromInteger Integer
x))

instance (Num (Vector t), Fractional t, Numeric t) => Fractional (Dim m (Dim n (Matrix t)))
  where
    fromRational :: Rational -> Dim m (Dim n (Matrix t))
fromRational Rational
x = forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim (forall a. Fractional a => Rational -> a
fromRational Rational
x))
    / :: Dim m (Dim n (Matrix t))
-> Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
(/) = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2Fforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F) forall a. Fractional a => a -> a -> a
(/)

instance (Floating (Vector t), Floating t, Numeric t) => Floating (Dim m (Dim n (Matrix t))) where
    sin :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
sin   = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
sin
    cos :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
cos   = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
cos
    tan :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
tan   = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
tan
    asin :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
asin  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
asin
    acos :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
acos  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
acos
    atan :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
atan  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
atan
    sinh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
sinh  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
sinh
    cosh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
cosh  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
cosh
    tanh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
tanh  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
tanh
    asinh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
asinh = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
asinh
    acosh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
acosh = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
acosh
    atanh :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
atanh = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
atanh
    exp :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
exp   = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
exp
    log :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
log   = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
log
    sqrt :: Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
sqrt  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t) -> Dim n (c t) -> Dim n (c t)
lift1F) forall a. Floating a => a -> a
sqrt
    ** :: Dim m (Dim n (Matrix t))
-> Dim m (Dim n (Matrix t)) -> Dim m (Dim n (Matrix t))
(**)  = (forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (c :: * -> *) t (n :: Nat).
(c t -> c t -> c t) -> Dim n (c t) -> Dim n (c t) -> Dim n (c t)
lift2F) forall a. Floating a => a -> a -> a
(**)
    pi :: Dim m (Dim n (Matrix t))
pi    = forall (n :: Nat) t. t -> Dim n t
Dim (forall (n :: Nat) t. t -> Dim n t
Dim forall a. Floating a => a
pi)

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


adaptDiag :: (L m n -> L m n -> t) -> L m n -> L m n -> t
adaptDiag L m n -> L m n -> t
f a :: L m n
a@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag -> Just (ℝ, Vector ℝ, (Int, Int))
_) L m n
b | forall {n :: Nat} {m :: Nat}.
(KnownNat n, KnownNat m) =>
L m n -> Bool
isFull L m n
b = L m n -> L m n -> t
f (forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL (forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
a)) L m n
b
adaptDiag L m n -> L m n -> t
f L m n
a b :: L m n
b@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag -> Just (ℝ, Vector ℝ, (Int, Int))
_) | forall {n :: Nat} {m :: Nat}.
(KnownNat n, KnownNat m) =>
L m n -> Bool
isFull L m n
a = L m n -> L m n -> t
f L m n
a (forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL (forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
b))
adaptDiag L m n -> L m n -> t
f L m n
a L m n
b = L m n -> L m n -> t
f L m n
a L m n
b

isFull :: L m n -> Bool
isFull L m n
m = forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
L m n -> Maybe (ℝ, Vector ℝ, (Int, Int))
isDiag L m n
m forall a. Eq a => a -> a -> Bool
== forall a. Maybe a
Nothing Bool -> Bool -> Bool
&& Bool -> Bool
not (forall {t}. Matrix t -> Bool
singleM (forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap L m n
m))


lift1L :: (Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f (L Dim m (Dim n (Matrix ℝ))
v) = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L (Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f Dim m (Dim n (Matrix ℝ))
v)
lift2L :: (Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2L Dim m (Dim n (Matrix ℝ))
-> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f (L Dim m (Dim n (Matrix ℝ))
a) (L Dim m (Dim n (Matrix ℝ))
b) = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L (Dim m (Dim n (Matrix ℝ))
-> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f Dim m (Dim n (Matrix ℝ))
a Dim m (Dim n (Matrix ℝ))
b)
lift2LD :: (Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD Dim m (Dim n (Matrix ℝ))
-> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {t}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(L m n -> L m n -> t) -> L m n -> L m n -> t
adaptDiag (forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat} {m :: Nat}
       {n :: Nat}.
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2L Dim m (Dim n (Matrix ℝ))
-> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ))
f)


instance (KnownNat n, KnownNat m) =>  Num (L n m)
  where
    + :: L n m -> L n m -> L n m
(+) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD forall a. Num a => a -> a -> a
(+)
    * :: L n m -> L n m -> L n m
(*) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD forall a. Num a => a -> a -> a
(*)
    (-) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD (-)
    abs :: L n m -> L n m
abs = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Num a => a -> a
abs
    signum :: L n m -> L n m
signum = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Num a => a -> a
signum
    negate :: L n m -> L n m
negate = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Num a => a -> a
negate
    fromInteger :: Integer -> L n m
fromInteger = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
fromInteger

instance (KnownNat n, KnownNat m) => Fractional (L n m)
  where
    fromRational :: Rational -> L n m
fromRational = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℝ)) -> L m n
L forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => Rational -> a
fromRational
    / :: L n m -> L n m -> L n m
(/) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD forall a. Fractional a => a -> a -> a
(/)

instance (KnownNat n, KnownNat m) => Floating (L n m) where
    sin :: L n m -> L n m
sin   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
sin
    cos :: L n m -> L n m
cos   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
cos
    tan :: L n m -> L n m
tan   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
tan
    asin :: L n m -> L n m
asin  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
asin
    acos :: L n m -> L n m
acos  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
acos
    atan :: L n m -> L n m
atan  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
atan
    sinh :: L n m -> L n m
sinh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
sinh
    cosh :: L n m -> L n m
cosh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
cosh
    tanh :: L n m -> L n m
tanh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
tanh
    asinh :: L n m -> L n m
asinh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
asinh
    acosh :: L n m -> L n m
acosh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
acosh
    atanh :: L n m -> L n m
atanh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
atanh
    exp :: L n m -> L n m
exp   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
exp
    log :: L n m -> L n m
log   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
log
    sqrt :: L n m -> L n m
sqrt  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n
lift1L forall a. Floating a => a -> a
sqrt
    ** :: L n m -> L n m -> L n m
(**)  = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℝ))
 -> Dim m (Dim n (Matrix ℝ)) -> Dim m (Dim n (Matrix ℝ)))
-> L m n -> L m n -> L m n
lift2LD forall a. Floating a => a -> a -> a
(**)
    pi :: L n m
pi    = forall t s (d :: * -> *). Sized t s d => t -> s
konst forall a. Floating a => a
pi

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

adaptDiagC :: (M m n -> M m n -> t) -> M m n -> M m n -> t
adaptDiagC M m n -> M m n -> t
f a :: M m n
a@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (ℂ, Vector ℂ, (Int, Int))
_) M m n
b | forall {n :: Nat} {m :: Nat}.
(KnownNat n, KnownNat m) =>
M m n -> Bool
isFullC M m n
b = M m n -> M m n -> t
f (forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
a)) M m n
b
adaptDiagC M m n -> M m n -> t
f M m n
a b :: M m n
b@(forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC -> Just (ℂ, Vector ℂ, (Int, Int))
_) | forall {n :: Nat} {m :: Nat}.
(KnownNat n, KnownNat m) =>
M m n -> Bool
isFullC M m n
a = M m n -> M m n -> t
f M m n
a (forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM (forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
b))
adaptDiagC M m n -> M m n -> t
f M m n
a M m n
b = M m n -> M m n -> t
f M m n
a M m n
b

isFullC :: M m n -> Bool
isFullC M m n
m = forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
M m n -> Maybe (ℂ, Vector ℂ, (Int, Int))
isDiagC M m n
m forall a. Eq a => a -> a -> Bool
== forall a. Maybe a
Nothing Bool -> Bool -> Bool
&& Bool -> Bool
not (forall {t}. Matrix t -> Bool
singleM (forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap M m n
m))

lift1M :: (Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f (M Dim m (Dim n (Matrix ℂ))
v) = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M (Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f Dim m (Dim n (Matrix ℂ))
v)
lift2M :: (Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2M Dim m (Dim n (Matrix ℂ))
-> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f (M Dim m (Dim n (Matrix ℂ))
a) (M Dim m (Dim n (Matrix ℂ))
b) = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M (Dim m (Dim n (Matrix ℂ))
-> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f Dim m (Dim n (Matrix ℂ))
a Dim m (Dim n (Matrix ℂ))
b)
lift2MD :: (Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD Dim m (Dim n (Matrix ℂ))
-> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {t}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(M m n -> M m n -> t) -> M m n -> M m n -> t
adaptDiagC (forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat} {m :: Nat}
       {n :: Nat}.
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2M Dim m (Dim n (Matrix ℂ))
-> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ))
f)

instance (KnownNat n, KnownNat m) =>  Num (M n m)
  where
    + :: M n m -> M n m -> M n m
(+) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD forall a. Num a => a -> a -> a
(+)
    * :: M n m -> M n m -> M n m
(*) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD forall a. Num a => a -> a -> a
(*)
    (-) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD (-)
    abs :: M n m -> M n m
abs = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Num a => a -> a
abs
    signum :: M n m -> M n m
signum = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Num a => a -> a
signum
    negate :: M n m -> M n m
negate = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Num a => a -> a
negate
    fromInteger :: Integer -> M n m
fromInteger = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
fromInteger

instance (KnownNat n, KnownNat m) => Fractional (M n m)
  where
    fromRational :: Rational -> M n m
fromRational = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) t. t -> Dim n t
Dim forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => Rational -> a
fromRational
    / :: M n m -> M n m -> M n m
(/) = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD forall a. Fractional a => a -> a -> a
(/)

instance (KnownNat n, KnownNat m) => Floating (M n m) where
    sin :: M n m -> M n m
sin   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
sin
    cos :: M n m -> M n m
cos   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
cos
    tan :: M n m -> M n m
tan   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
tan
    asin :: M n m -> M n m
asin  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
asin
    acos :: M n m -> M n m
acos  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
acos
    atan :: M n m -> M n m
atan  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
atan
    sinh :: M n m -> M n m
sinh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
sinh
    cosh :: M n m -> M n m
cosh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
cosh
    tanh :: M n m -> M n m
tanh  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
tanh
    asinh :: M n m -> M n m
asinh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
asinh
    acosh :: M n m -> M n m
acosh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
acosh
    atanh :: M n m -> M n m
atanh = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
atanh
    exp :: M n m -> M n m
exp   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
exp
    log :: M n m -> M n m
log   = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
log
    sqrt :: M n m -> M n m
sqrt  = forall {m :: Nat} {n :: Nat} {m :: Nat} {n :: Nat}.
(Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n
lift1M forall a. Floating a => a -> a
sqrt
    ** :: M n m -> M n m -> M n m
(**)  = forall {m :: Nat} {n :: Nat} {n :: Nat} {m :: Nat} {m :: Nat}
       {n :: Nat}.
(KnownNat m, KnownNat n, KnownNat n, KnownNat m) =>
(Dim m (Dim n (Matrix ℂ))
 -> Dim m (Dim n (Matrix ℂ)) -> Dim m (Dim n (Matrix ℂ)))
-> M m n -> M m n -> M m n
lift2MD forall a. Floating a => a -> a -> a
(**)
    pi :: M n m
pi    = forall (m :: Nat) (n :: Nat). Dim m (Dim n (Matrix ℂ)) -> M m n
M forall a. Floating a => a
pi

instance Additive (R n) where
    add :: R n -> R n -> R n
add = forall a. Num a => a -> a -> a
(+)

instance Additive (C n) where
    add :: C n -> C n -> C n
add = forall a. Num a => a -> a -> a
(+)

instance (KnownNat m, KnownNat n) => Additive (L m n) where
    add :: L m n -> L m n -> L m n
add = forall a. Num a => a -> a -> a
(+)

instance (KnownNat m, KnownNat n) => Additive (M m n) where
    add :: M m n -> M m n -> M m n
add = forall a. Num a => a -> a -> a
(+)

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


class Disp t
  where
    disp :: Int -> t -> IO ()


instance (KnownNat m, KnownNat n) => Disp (L m n)
  where
    disp :: Int -> L m n -> IO ()
disp Int
n L m n
x = do
        let a :: Matrix ℝ
a = forall t s (d :: * -> *). Sized t s d => s -> d t
extract L m n
x
        let su :: String
su = Int -> Matrix ℝ -> String
LA.dispf Int
n Matrix ℝ
a
        forall r. PrintfType r => String -> r
printf String
"L %d %d" (forall t. Matrix t -> Int
rows Matrix ℝ
a) (forall t. Matrix t -> Int
cols Matrix ℝ
a) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr (forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'\n') forall a b. (a -> b) -> a -> b
$ String
su)

instance (KnownNat m, KnownNat n) => Disp (M m n)
  where
    disp :: Int -> M m n -> IO ()
disp Int
n M m n
x = do
        let a :: Matrix ℂ
a = forall t s (d :: * -> *). Sized t s d => s -> d t
extract M m n
x
        let su :: String
su = Int -> Matrix ℂ -> String
LA.dispcf Int
n Matrix ℂ
a
        forall r. PrintfType r => String -> r
printf String
"M %d %d" (forall t. Matrix t -> Int
rows Matrix ℂ
a) (forall t. Matrix t -> Int
cols Matrix ℂ
a) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr (forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'\n') forall a b. (a -> b) -> a -> b
$ String
su)


instance KnownNat n => Disp (R n)
  where
    disp :: Int -> R n -> IO ()
disp Int
n R n
v = do
        let su :: String
su = Int -> Matrix ℝ -> String
LA.dispf Int
n (forall a. Storable a => Vector a -> Matrix a
asRow forall a b. (a -> b) -> a -> b
$ forall t s (d :: * -> *). Sized t s d => s -> d t
extract R n
v)
        String -> IO ()
putStr String
"R " forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr (forall a. [a] -> [a]
tail forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'x') forall a b. (a -> b) -> a -> b
$ String
su)

instance KnownNat n => Disp (C n)
  where
    disp :: Int -> C n -> IO ()
disp Int
n C n
v = do
        let su :: String
su = Int -> Matrix ℂ -> String
LA.dispcf Int
n (forall a. Storable a => Vector a -> Matrix a
asRow forall a b. (a -> b) -> a -> b
$ forall t s (d :: * -> *). Sized t s d => s -> d t
extract C n
v)
        String -> IO ()
putStr String
"C " forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
putStr (forall a. [a] -> [a]
tail forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=Char
'x') forall a b. (a -> b) -> a -> b
$ String
su)

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

overMatL' :: (KnownNat m, KnownNat n)
          => (LA.Matrix  -> LA.Matrix ) -> L m n -> L m n
overMatL' :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix ℝ -> Matrix ℝ) -> L m n -> L m n
overMatL' Matrix ℝ -> Matrix ℝ
f = forall (m :: Nat) (n :: Nat). Matrix ℝ -> L m n
mkL forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix ℝ -> Matrix ℝ
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
{-# INLINE overMatL' #-}

overMatM' :: (KnownNat m, KnownNat n)
          => (LA.Matrix  -> LA.Matrix ) -> M m n -> M m n
overMatM' :: forall (m :: Nat) (n :: Nat).
(KnownNat m, KnownNat n) =>
(Matrix ℂ -> Matrix ℂ) -> M m n -> M m n
overMatM' Matrix ℂ -> Matrix ℂ
f = forall (m :: Nat) (n :: Nat). Matrix ℂ -> M m n
mkM forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix ℂ -> Matrix ℂ
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t s (d :: * -> *). Sized t s d => s -> d t
unwrap
{-# INLINE overMatM' #-}


#else

module Numeric.LinearAlgebra.Static.Internal where

#endif