{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module Internal.Container where
import Internal.Vector
import Internal.Matrix
import Internal.Element
import Internal.Numeric
import Internal.Algorithms(Field,linearSolveSVD,Herm,mTm)
#if MIN_VERSION_base(4,11,0)
import Prelude hiding ((<>))
#endif
linspace :: (Fractional e, Container Vector e) => Int -> (e, e) -> Vector e
linspace :: forall e.
(Fractional e, Container Vector e) =>
Int -> (e, e) -> Vector e
linspace Int
0 (e, e)
_ = forall a. Storable a => [a] -> Vector a
fromList[]
linspace Int
1 (e
a,e
b) = forall a. Storable a => [a] -> Vector a
fromList[(e
aforall a. Num a => a -> a -> a
+e
b)forall a. Fractional a => a -> a -> a
/e
2]
linspace Int
n (e
a,e
b) = forall (c :: * -> *) e. Container c e => e -> c e -> c e
addConstant e
a forall a b. (a -> b) -> a -> b
$ forall t (c :: * -> *). Linear t c => t -> c t -> c t
scale e
s forall a b. (a -> b) -> a -> b
$ forall a. Storable a => [a] -> Vector a
fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Integral a, Num b) => a -> b
fromIntegral [Int
0 .. Int
nforall a. Num a => a -> a -> a
-Int
1]
where s :: e
s = (e
bforall a. Num a => a -> a -> a
-e
a)forall a. Fractional a => a -> a -> a
/forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
nforall a. Num a => a -> a -> a
-Int
1)
infixr 8 <.>
(<.>) :: Numeric t => Vector t -> Vector t -> t
<.> :: forall t. Numeric t => Vector t -> Vector t -> t
(<.>) = forall t. Numeric t => Vector t -> Vector t -> t
dot
infixr 8 #>
(#>) :: Numeric t => Matrix t -> Vector t -> Vector t
#> :: forall t. Numeric t => Matrix t -> Vector t -> Vector t
(#>) = forall t. Product t => Matrix t -> Vector t -> Vector t
mXv
app :: Numeric t => Matrix t -> Vector t -> Vector t
app :: forall t. Numeric t => Matrix t -> Vector t -> Vector t
app = forall t. Numeric t => Matrix t -> Vector t -> Vector t
(#>)
infixl 8 <#
(<#) :: Numeric t => Vector t -> Matrix t -> Vector t
<# :: forall t. Numeric t => Vector t -> Matrix t -> Vector t
(<#) = forall t. Product t => Vector t -> Matrix t -> Vector t
vXm
class Mul a b c | a b -> c where
infixl 7 <>
(<>) :: Product t => a t -> b t -> c t
instance Mul Matrix Matrix Matrix where
<> :: forall t. Product t => Matrix t -> Matrix t -> Matrix t
(<>) = forall t. Product t => Matrix t -> Matrix t -> Matrix t
mXm
instance Mul Matrix Vector Vector where
<> :: forall t. Product t => Matrix t -> Vector t -> Vector t
(<>) Matrix t
m Vector t
v = forall t. Element t => Matrix t -> Vector t
flatten forall a b. (a -> b) -> a -> b
$ Matrix t
m forall (a :: * -> *) (b :: * -> *) (c :: * -> *) t.
(Mul a b c, Product t) =>
a t -> b t -> c t
<> forall a. Storable a => Vector a -> Matrix a
asColumn Vector t
v
instance Mul Vector Matrix Vector where
<> :: forall t. Product t => Vector t -> Matrix t -> Vector t
(<>) Vector t
v Matrix t
m = forall t. Element t => Matrix t -> Vector t
flatten forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Vector a -> Matrix a
asRow Vector t
v forall (a :: * -> *) (b :: * -> *) (c :: * -> *) t.
(Mul a b c, Product t) =>
a t -> b t -> c t
<> Matrix t
m
infixl 7 <\>
(<\>) :: (LSDiv c, Field t) => Matrix t -> c t -> c t
<\> :: forall (c :: * -> *) t.
(LSDiv c, Field t) =>
Matrix t -> c t -> c t
(<\>) = forall (c :: * -> *) t.
(LSDiv c, Field t) =>
Matrix t -> c t -> c t
linSolve
class LSDiv c
where
linSolve :: Field t => Matrix t -> c t -> c t
instance LSDiv Vector
where
linSolve :: forall t. Field t => Matrix t -> Vector t -> Vector t
linSolve Matrix t
m Vector t
v = forall t. Element t => Matrix t -> Vector t
flatten (forall t. Field t => Matrix t -> Matrix t -> Matrix t
linearSolveSVD Matrix t
m (forall t. Storable t => Int -> Vector t -> Matrix t
reshape Int
1 Vector t
v))
instance LSDiv Matrix
where
linSolve :: forall t. Field t => Matrix t -> Matrix t -> Matrix t
linSolve = forall t. Field t => Matrix t -> Matrix t -> Matrix t
linearSolveSVD
class Build d f c e | d -> c, c -> d, f -> e, f -> d, f -> c, c e -> f, d e -> f
where
build :: d -> f -> c e
instance Container Vector e => Build Int (e -> e) Vector e
where
build :: Int -> (e -> e) -> Vector e
build = forall (c :: * -> *) e.
Container c e =>
IndexOf c -> ArgOf c e -> c e
build'
instance (Num e, Container Vector e) => Build (Int,Int) (e -> e -> e) Matrix e
where
build :: (Int, Int) -> (e -> e -> e) -> Matrix e
build = forall (c :: * -> *) e.
Container c e =>
IndexOf c -> ArgOf c e -> c e
build'
dot :: (Numeric t) => Vector t -> Vector t -> t
dot :: forall t. Numeric t => Vector t -> Vector t -> t
dot Vector t
u Vector t
v = forall e. Product e => Vector e -> Vector e -> e
udot (forall (c :: * -> *) e. Container c e => c e -> c e
conj Vector t
u) Vector t
v
optimiseMult :: Monoid (Matrix t) => [Matrix t] -> Matrix t
optimiseMult :: forall t. Monoid (Matrix t) => [Matrix t] -> Matrix t
optimiseMult = forall a. Monoid a => [a] -> a
mconcat
meanCov :: Matrix Double -> (Vector Double, Herm Double)
meanCov :: Matrix Double -> (Vector Double, Herm Double)
meanCov Matrix Double
x = (Vector Double
med,Herm Double
cov) where
r :: Int
r = forall t. Matrix t -> Int
rows Matrix Double
x
k :: Double
k = Double
1 forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
r
med :: Vector Double
med = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
konst Double
k Int
r forall t. Product t => Vector t -> Matrix t -> Vector t
`vXm` Matrix Double
x
meds :: Matrix Double
meds = forall e d (c :: * -> *). Konst e d c => e -> d -> c e
konst Double
1 Int
r forall t. Product t => Vector t -> Vector t -> Matrix t
`outer` Vector Double
med
xc :: Matrix Double
xc = Matrix Double
x forall (c :: * -> *) e. Container c e => c e -> c e -> c e
`sub` Matrix Double
meds
cov :: Herm Double
cov = forall t (c :: * -> *). Linear t c => t -> c t -> c t
scale (forall a. Fractional a => a -> a
recip (forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
rforall a. Num a => a -> a -> a
-Int
1))) (forall t. Numeric t => Matrix t -> Herm t
mTm Matrix Double
xc)
sortVector :: (Ord t, Element t) => Vector t -> Vector t
sortVector :: forall t. (Ord t, Element t) => Vector t -> Vector t
sortVector = forall a. (Element a, Ord a) => Vector a -> Vector a
sortV
sortIndex :: (Ord t, Element t) => Vector t -> Vector I
sortIndex :: forall t. (Ord t, Element t) => Vector t -> Vector I
sortIndex = forall a. (Element a, Ord a) => Vector a -> Vector I
sortI
ccompare :: (Ord t, Container c t) => c t -> c t -> c I
ccompare :: forall t (c :: * -> *). (Ord t, Container c t) => c t -> c t -> c I
ccompare = forall (c :: * -> *) e. (Container c e, Ord e) => c e -> c e -> c I
ccompare'
cselect :: (Container c t) => c I -> c t -> c t -> c t -> c t
cselect :: forall (c :: * -> *) t.
Container c t =>
c I -> c t -> c t -> c t -> c t
cselect = forall (c :: * -> *) t.
Container c t =>
c I -> c t -> c t -> c t -> c t
cselect'
remap :: Element t => Matrix I -> Matrix I -> Matrix t -> Matrix t
remap :: forall t. Element t => Matrix I -> Matrix I -> Matrix t -> Matrix t
remap Matrix I
i Matrix I
j Matrix t
m
| forall (c :: * -> *) e. Container c e => c e -> e
minElement Matrix I
i forall a. Ord a => a -> a -> Bool
>= I
0 Bool -> Bool -> Bool
&& forall (c :: * -> *) e. Container c e => c e -> e
maxElement Matrix I
i forall a. Ord a => a -> a -> Bool
< forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall t. Matrix t -> Int
rows Matrix t
m) Bool -> Bool -> Bool
&&
forall (c :: * -> *) e. Container c e => c e -> e
minElement Matrix I
j forall a. Ord a => a -> a -> Bool
>= I
0 Bool -> Bool -> Bool
&& forall (c :: * -> *) e. Container c e => c e -> e
maxElement Matrix I
j forall a. Ord a => a -> a -> Bool
< forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall t. Matrix t -> Int
cols Matrix t
m) = forall t. Element t => Matrix I -> Matrix I -> Matrix t -> Matrix t
remapM Matrix I
i' Matrix I
j' Matrix t
m
| Bool
otherwise = forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"out of range index in remap"
where
[Matrix I
i',Matrix I
j'] = forall t. Element t => [Matrix t] -> [Matrix t]
conformMs [Matrix I
i,Matrix I
j]