{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Numeric.LAPACK.Matrix.BandedHermitian (
BandedHermitian,
Transposition(..),
size,
fromList,
identity,
diagonal,
takeDiagonal,
toHermitian,
toBanded,
multiplyVector,
multiplyFull,
gramian,
sumRank1,
eigenvalues,
eigensystem,
) where
import qualified Numeric.LAPACK.Matrix.BandedHermitian.Eigen as Eigen
import qualified Numeric.LAPACK.Matrix.BandedHermitian.Basic as Basic
import qualified Numeric.LAPACK.Matrix.Array.Banded as Banded
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Shape.Private as MatrixShape
import qualified Numeric.LAPACK.Matrix.Extent as Extent
import Numeric.LAPACK.Matrix.Array.Banded (Square)
import Numeric.LAPACK.Matrix.Array.Triangular (Hermitian)
import Numeric.LAPACK.Matrix.Array (Full)
import Numeric.LAPACK.Matrix.Shape.Private (Order, UnaryProxy)
import Numeric.LAPACK.Matrix.Modifier (Transposition(NonTransposed, Transposed))
import Numeric.LAPACK.Vector (Vector)
import Numeric.LAPACK.Scalar (RealOf)
import qualified Numeric.Netlib.Class as Class
import qualified Type.Data.Num.Unary.Literal as TypeNum
import qualified Type.Data.Num.Unary as Unary
import Type.Data.Num.Unary ((:+:))
import qualified Data.Array.Comfort.Shape as Shape
import Foreign.Storable (Storable)
import Data.Tuple.HT (mapFst)
type BandedHermitian offDiag sh = Banded.Hermitian offDiag sh
type Diagonal size = BandedHermitian TypeNum.U0 size
size :: BandedHermitian offDiag sh a -> sh
size = MatrixShape.bandedHermitianSize . ArrMatrix.shape
fromList ::
(Unary.Natural offDiag, Shape.C size, Storable a) =>
UnaryProxy offDiag -> Order -> size -> [a] ->
BandedHermitian offDiag size a
fromList numOff order size_ =
ArrMatrix.lift0 . Basic.fromList numOff order size_
identity :: (Shape.C sh, Class.Floating a) => sh -> Diagonal sh a
identity = ArrMatrix.lift0 . Basic.identity
diagonal ::
(Shape.C sh, Class.Floating a) => Vector sh (RealOf a) -> Diagonal sh a
diagonal = ArrMatrix.lift0 . Basic.diagonal
takeDiagonal ::
(Unary.Natural offDiag, Shape.C size, Class.Floating a) =>
BandedHermitian offDiag size a -> Vector size (RealOf a)
takeDiagonal = Basic.takeDiagonal . ArrMatrix.toVector
toHermitian ::
(Unary.Natural offDiag, Shape.C size, Class.Floating a) =>
BandedHermitian offDiag size a -> Hermitian size a
toHermitian = ArrMatrix.lift1 Basic.toHermitian
toBanded ::
(Unary.Natural offDiag, Shape.C size, Class.Floating a) =>
BandedHermitian offDiag size a ->
Square offDiag offDiag size a
toBanded = ArrMatrix.lift1 Basic.toBanded
multiplyVector ::
(Unary.Natural offDiag, Shape.C size, Eq size, Class.Floating a) =>
Transposition -> BandedHermitian offDiag size a ->
Vector size a -> Vector size a
multiplyVector transposed = Basic.multiplyVector transposed . ArrMatrix.toVector
gramian ::
(Shape.C size, Eq size, Class.Floating a,
Unary.Natural sub, Unary.Natural super) =>
Square sub super size a ->
BandedHermitian (sub :+: super) size a
gramian = ArrMatrix.lift1 Basic.gramian
multiplyFull ::
(Unary.Natural offDiag, Extent.C vert, Extent.C horiz,
Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
Transposition -> BandedHermitian offDiag height a ->
Full vert horiz height width a ->
Full vert horiz height width a
multiplyFull = ArrMatrix.lift2 . Basic.multiplyFull
sumRank1 ::
(Unary.Natural k, Shape.Indexed sh, Class.Floating a) =>
Order -> sh ->
[(RealOf a, (Shape.Index sh, Basic.StaticVector (Unary.Succ k) a))] ->
BandedHermitian k sh a
sumRank1 order sh = ArrMatrix.lift0 . Basic.sumRank1 order sh
eigenvalues ::
(Unary.Natural offDiag, Shape.C sh, Class.Floating a) =>
BandedHermitian offDiag sh a -> Vector sh (RealOf a)
eigenvalues = Eigen.values . ArrMatrix.toVector
eigensystem ::
(Unary.Natural offDiag, Shape.C sh, Class.Floating a) =>
BandedHermitian offDiag sh a -> (ArrMatrix.Square sh a, Vector sh (RealOf a))
eigensystem = mapFst ArrMatrix.lift0 . Eigen.decompose . ArrMatrix.toVector