{-# LANGUAGE TypeOperators #-}
module Numeric.LAPACK.Matrix.Array.Unpacked where
import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Square.Basic as Square
import qualified Numeric.LAPACK.Matrix.Plain as Plain
import qualified Numeric.LAPACK.Matrix.Basic as Basic
import qualified Numeric.LAPACK.Matrix.Private as Matrix
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import qualified Numeric.LAPACK.Matrix.Extent.Strict as ExtentStrict
import qualified Numeric.LAPACK.Matrix.Extent as Extent
import Numeric.LAPACK.Vector (Vector)
import Numeric.LAPACK.Shape.Private (Unchecked)
import qualified Numeric.Netlib.Class as Class
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Shape ((::+))
type Unpacked property lower upper meas vert horiz height width =
ArrMatrix.ArrayMatrix Layout.Unpacked
property lower upper meas vert horiz height width
type Quadratic property lower upper sh =
Unpacked property lower upper
Extent.Shape Extent.Small Extent.Small sh sh
type LowerTrapezoid meas vert horiz height width =
Unpacked Omni.Arbitrary Layout.Filled Layout.Empty
meas vert horiz height width
type UpperTrapezoid meas vert horiz height width =
Unpacked Omni.Arbitrary Layout.Empty Layout.Filled
meas vert horiz height width
recheck ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
(Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
Unpacked property lower upper
meas vert horiz (Unchecked height) (Unchecked width) a ->
Unpacked property lower upper meas vert horiz height width a
recheck = ArrMatrix.liftUnpacked1 Basic.recheck
uncheck ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
(Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
Unpacked property lower upper meas vert horiz height width a ->
Unpacked property lower upper
meas vert horiz (Unchecked height) (Unchecked width) a
uncheck = ArrMatrix.liftUnpacked1 Basic.uncheck
fillLower ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
Unpacked property lower upper meas vert horiz height width a ->
Unpacked property Layout.Filled upper meas vert horiz height width a
fillLower = ArrMatrix.liftUnpacked1 id
fillUpper ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
Unpacked property lower upper meas vert horiz height width a ->
Unpacked property lower Layout.Filled meas vert horiz height width a
fillUpper = ArrMatrix.liftUnpacked1 id
fillBoth ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
Unpacked property lower upper meas vert horiz height width a ->
Unpacked property Layout.Filled Layout.Filled meas vert horiz height width a
fillBoth = ArrMatrix.liftUnpacked1 id
mapExtent ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
(Extent.Measure measA, Extent.C vertA, Extent.C horizA) =>
(Extent.Measure measB, Extent.C vertB, Extent.C horizB) =>
Extent.Map measA vertA horizA measB vertB horizB height width ->
Unpacked property lower upper measA vertA horizA height width a ->
Unpacked property lower upper measB vertB horizB height width a
mapExtent = ArrMatrix.liftUnpacked1 . Plain.mapExtent . ExtentStrict.apply
transpose ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
(Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
Unpacked property lower upper meas vert horiz height width a ->
Unpacked property upper lower meas horiz vert width height a
transpose = ArrMatrix.liftUnpacked1 Basic.transpose
swapMultiply ::
(Omni.Property propertyA, Omni.Strip lowerA, Omni.Strip upperA) =>
(Omni.Property propertyB, Omni.Strip lowerB, Omni.Strip upperB) =>
(Extent.Measure measA, Extent.C vertA, Extent.C horizA,
Extent.Measure measB, Extent.C vertB, Extent.C horizB) =>
(matrix ->
Unpacked propertyA upperA lowerA measA horizA vertA widthA heightA a ->
Unpacked propertyB upperB lowerB measB horizB vertB widthB heightB a) ->
Unpacked propertyA lowerA upperA measA vertA horizA heightA widthA a ->
matrix ->
Unpacked propertyB lowerB upperB measB vertB horizB heightB widthB a
swapMultiply multiplyTrans a b = transpose $ multiplyTrans b $ transpose a
takeTopLeft ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper,
Shape.C sh0, Shape.C sh1, Class.Floating a) =>
Quadratic property lower upper (sh0::+sh1) a ->
Quadratic property lower upper sh0 a
takeTopLeft =
ArrMatrix.liftUnpacked1 $
Basic.recheck . Square.fromFull . Basic.uncheck .
Basic.takeTop . Basic.takeLeft . Matrix.fromFull
takeTopRight ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper,
Shape.C sh0, Shape.C sh1, Class.Floating a) =>
Quadratic property lower upper (sh0::+sh1) a -> ArrMatrix.General sh0 sh1 a
takeTopRight =
ArrMatrix.liftUnpacked1 $
Basic.takeTop . Basic.takeRight . Matrix.fromFull
takeBottomLeft ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper,
Shape.C sh0, Shape.C sh1, Class.Floating a) =>
Quadratic property lower upper (sh0::+sh1) a -> ArrMatrix.General sh1 sh0 a
takeBottomLeft =
ArrMatrix.liftUnpacked1 $
Basic.takeBottom . Basic.takeLeft . Matrix.fromFull
takeBottomRight ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper,
Shape.C sh0, Shape.C sh1, Class.Floating a) =>
Quadratic property lower upper (sh0::+sh1) a ->
Quadratic property lower upper sh1 a
takeBottomRight =
ArrMatrix.liftUnpacked1 $
Basic.recheck . Square.fromFull . Basic.uncheck .
Basic.takeBottom . Basic.takeRight . Matrix.fromFull
multiplyVector ::
(Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
(Extent.Measure meas, Extent.C vert, Extent.C horiz,
Shape.C height, Shape.C width, Eq width, Class.Floating a) =>
Unpacked property lower upper meas vert horiz height width a ->
Vector width a -> Vector height a
multiplyVector = Basic.multiplyVector . ArrMatrix.unpackedToVector
multiply ::
(Omni.Property propertyA, Omni.Strip lowerA, Omni.Strip upperA) =>
(Omni.Property propertyB, Omni.Strip lowerB, Omni.Strip upperB) =>
(Omni.Property propertyC, Omni.Strip lowerC, Omni.Strip upperC) =>
(Extent.Measure meas, Extent.C vert, Extent.C horiz,
Shape.C height,
Shape.C fuse, Eq fuse,
Shape.C width,
Class.Floating a) =>
Unpacked propertyA lowerA upperA meas vert horiz height fuse a ->
Unpacked propertyB upperB lowerB meas vert horiz fuse width a ->
Unpacked propertyC upperC lowerC meas vert horiz height width a
multiply = ArrMatrix.liftUnpacked2 Basic.multiply