{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-}
module Numeric.LAPACK.Matrix.Diagonal (
   Diagonal, FlexDiagonal,
   fromList, autoFromList,
   fromVector,
   lift,

   stack, (%%%),
   split,

   multiply,

   solve,
   inverse,
   determinant,
   ) where

import qualified Numeric.LAPACK.Matrix.Quadratic as Quad
import qualified Numeric.LAPACK.Matrix.Banded as Banded

import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Basic as FullBasic
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent
import qualified Numeric.LAPACK.Vector as Vector
import qualified Numeric.LAPACK.Scalar as Scalar
import Numeric.LAPACK.Matrix.Array.Banded (Diagonal, FlexDiagonal)
import Numeric.LAPACK.Matrix.Layout.Private (Order)
import Numeric.LAPACK.Matrix.Private (ShapeInt)
import Numeric.LAPACK.Vector (Vector)
import Numeric.LAPACK.Shape.Private (Unchecked(Unchecked))

import qualified Numeric.Netlib.Class as Class

import Type.Base.Proxy (Proxy(Proxy))

import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Storable (Array)
import Data.Array.Comfort.Shape ((::+))

import Foreign.Storable (Storable)



fromList :: (Shape.C sh, Storable a) => Order -> sh -> [a] -> Diagonal sh a
fromList :: Order -> sh -> [a] -> Diagonal sh a
fromList Order
order sh
sh = (UnaryProxy U0, UnaryProxy U0)
-> Order -> sh -> [a] -> Diagonal sh a
forall sub super size a.
(Natural sub, Natural super, C size, Storable a) =>
(UnaryProxy sub, UnaryProxy super)
-> Order -> size -> [a] -> Square sub super size a
Banded.squareFromList (UnaryProxy U0
forall a. Proxy a
Proxy,UnaryProxy U0
forall a. Proxy a
Proxy) Order
order sh
sh

autoFromList :: (Storable a) => Order -> [a] -> Diagonal ShapeInt a
autoFromList :: Order -> [a] -> Diagonal ShapeInt a
autoFromList Order
order = Order -> Vector ShapeInt a -> Diagonal ShapeInt a
forall sh a.
(C sh, Storable a) =>
Order -> Vector sh a -> Diagonal sh a
fromVector Order
order (Vector ShapeInt a -> Diagonal ShapeInt a)
-> ([a] -> Vector ShapeInt a) -> [a] -> Diagonal ShapeInt a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Vector ShapeInt a
forall a. Storable a => [a] -> Vector ShapeInt a
Vector.autoFromList

fromVector :: (Shape.C sh, Storable a) => Order -> Vector sh a -> Diagonal sh a
fromVector :: Order -> Vector sh a -> Diagonal sh a
fromVector Order
order = OmniArray
  Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh a
-> Diagonal sh a
forall pack prop lower upper meas vert horiz height width a.
OmniArray pack prop lower upper meas vert horiz height width a
-> Matrix
     (Array pack prop) () () lower upper meas vert horiz height width a
ArrMatrix.Array (OmniArray
   Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh a
 -> Diagonal sh a)
-> (Vector sh a
    -> OmniArray
         Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh a)
-> Vector sh a
-> Diagonal sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (sh
 -> Omni
      Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh)
-> Vector sh a
-> OmniArray
     Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape (Order
-> sh
-> Omni
     Packed Arbitrary (Bands U0) (Bands U0) Shape Small Small sh sh
forall pack property lower upper sh.
(Quadratic pack property lower upper, C sh) =>
Order
-> sh -> Omni pack property lower upper Shape Small Small sh sh
Omni.quadratic Order
order)


takeDiagonal ::
   (Omni.TriDiag diag) =>
   FlexDiagonal diag sh a -> Vector sh a
takeDiagonal :: FlexDiagonal diag sh a -> Vector sh a
takeDiagonal = (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh
 -> sh)
-> Array
     (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
-> Vector sh a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh
-> sh
forall pack property lower upper sh.
Omni pack property lower upper Shape Small Small sh sh -> sh
Omni.squareSize (Array
   (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
 -> Vector sh a)
-> (FlexDiagonal diag sh a
    -> Array
         (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a)
-> FlexDiagonal diag sh a
-> Vector sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlexDiagonal diag sh a
-> Array
     (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap


lift ::
   (Layout.Packing pack,
    Shape.C sha, Shape.C shb, Class.Floating a, Class.Floating b) =>
   (Array sha a -> Array shb b) ->
   FlexDiagonalP pack Omni.Arbitrary sha a ->
   FlexDiagonalP pack Omni.Arbitrary shb b
lift :: (Array sha a -> Array shb b)
-> FlexDiagonalP pack Arbitrary sha a
-> FlexDiagonalP pack Arbitrary shb b
lift Array sha a -> Array shb b
f FlexDiagonalP pack Arbitrary sha a
a =
   case FlexDiagonalP pack Arbitrary sha a -> PackingSingleton pack
forall pack diag lower upper meas vert horiz height width a.
Packing pack =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> PackingSingleton pack
ArrMatrix.packTag FlexDiagonalP pack Arbitrary sha a
a of
      PackingSingleton pack
Layout.Packed ->
         Order -> Array shb b -> FlexDiagonalP pack Arbitrary shb b
forall property pack lower upper sh a.
(Diagonal property, Quadratic pack property lower upper, C sh,
 Floating a) =>
Order -> Vector sh a -> Quadratic pack property lower upper sh a
Quad.diagonal (FlexDiagonalP pack Arbitrary sha a -> Order
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Order
ArrMatrix.order FlexDiagonalP pack Arbitrary sha a
a) (Array shb b -> FlexDiagonalP pack Arbitrary shb b)
-> Array shb b -> FlexDiagonalP pack Arbitrary shb b
forall a b. (a -> b) -> a -> b
$ Array sha a -> Array shb b
f (Array sha a -> Array shb b) -> Array sha a -> Array shb b
forall a b. (a -> b) -> a -> b
$ FlexDiagonalP pack Arbitrary sha a -> Array sha a
forall sh a pack property lower upper.
(C sh, Floating a) =>
Quadratic pack property lower upper sh a -> Vector sh a
Quad.takeDiagonal FlexDiagonalP pack Arbitrary sha a
a
      PackingSingleton pack
Layout.Unpacked ->
         Order -> Array shb b -> FlexDiagonalP pack Arbitrary shb b
forall property pack lower upper sh a.
(Diagonal property, Quadratic pack property lower upper, C sh,
 Floating a) =>
Order -> Vector sh a -> Quadratic pack property lower upper sh a
Quad.diagonal (FlexDiagonalP pack Arbitrary sha a -> Order
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Order
ArrMatrix.order FlexDiagonalP pack Arbitrary sha a
a) (Array shb b -> FlexDiagonalP pack Arbitrary shb b)
-> Array shb b -> FlexDiagonalP pack Arbitrary shb b
forall a b. (a -> b) -> a -> b
$ Array sha a -> Array shb b
f (Array sha a -> Array shb b) -> Array sha a -> Array shb b
forall a b. (a -> b) -> a -> b
$ FlexDiagonalP pack Arbitrary sha a -> Array sha a
forall sh a pack property lower upper.
(C sh, Floating a) =>
Quadratic pack property lower upper sh a -> Vector sh a
Quad.takeDiagonal FlexDiagonalP pack Arbitrary sha a
a


type FlexDiagonalP pack diag sh =
         ArrMatrix.Quadratic pack diag Layout.Empty Layout.Empty sh

infixr 2 %%%

(%%%), stack ::
   (Layout.Packing pack) =>
   (Omni.TriDiag diag, Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   FlexDiagonalP pack diag sh0 a ->
   FlexDiagonalP pack diag sh1 a ->
   FlexDiagonalP pack diag (sh0::+sh1) a
%%% :: FlexDiagonalP pack diag sh0 a
-> FlexDiagonalP pack diag sh1 a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
(%%%) = FlexDiagonalP pack diag sh0 a
-> FlexDiagonalP pack diag sh1 a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
forall pack diag sh0 sh1 a.
(Packing pack, TriDiag diag, C sh0, C sh1, Floating a) =>
FlexDiagonalP pack diag sh0 a
-> FlexDiagonalP pack diag sh1 a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
stack
stack :: FlexDiagonalP pack diag sh0 a
-> FlexDiagonalP pack diag sh1 a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
stack FlexDiagonalP pack diag sh0 a
a FlexDiagonalP pack diag sh1 a
b =
   let order :: Order
order = Omni pack diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1
-> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order (Omni pack diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1
 -> Order)
-> Omni pack diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1
-> Order
forall a b. (a -> b) -> a -> b
$ FlexDiagonalP pack diag sh1 a
-> Omni pack diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape FlexDiagonalP pack diag sh1 a
b in
   case FlexDiagonalP pack diag sh0 a -> PackingSingleton pack
forall pack diag lower upper meas vert horiz height width a.
Packing pack =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> PackingSingleton pack
ArrMatrix.packTag FlexDiagonalP pack diag sh0 a
a of
      PackingSingleton pack
Layout.Packed ->
         OmniArray
  pack
  diag
  (Bands U0)
  (Bands U0)
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
forall pack prop lower upper meas vert horiz height width a.
OmniArray pack prop lower upper meas vert horiz height width a
-> Matrix
     (Array pack prop) () () lower upper meas vert horiz height width a
ArrMatrix.Array (OmniArray
   pack
   diag
   (Bands U0)
   (Bands U0)
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> FlexDiagonalP pack diag (sh0 ::+ sh1) a)
-> OmniArray
     pack
     diag
     (Bands U0)
     (Bands U0)
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
-> FlexDiagonalP pack diag (sh0 ::+ sh1) a
forall a b. (a -> b) -> a -> b
$
         ((sh0 ::+ sh1)
 -> Omni
      pack
      diag
      (Bands U0)
      (Bands U0)
      Shape
      Small
      Small
      (sh0 ::+ sh1)
      (sh0 ::+ sh1))
-> Array (sh0 ::+ sh1) a
-> OmniArray
     pack
     diag
     (Bands U0)
     (Bands U0)
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape (Order
-> (sh0 ::+ sh1)
-> Omni
     pack
     diag
     (Bands U0)
     (Bands U0)
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
forall pack diag size.
(Packing pack, TriDiag diag) =>
Order
-> size
-> Omni pack diag (Bands U0) (Bands U0) Shape Small Small size size
Omni.uncheckedDiagonal Order
order) (Array (sh0 ::+ sh1) a
 -> OmniArray
      pack
      diag
      (Bands U0)
      (Bands U0)
      Shape
      Small
      Small
      (sh0 ::+ sh1)
      (sh0 ::+ sh1)
      a)
-> Array (sh0 ::+ sh1) a
-> OmniArray
     pack
     diag
     (Bands U0)
     (Bands U0)
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
forall a b. (a -> b) -> a -> b
$
         Array sh0 a -> Array sh1 a -> Array (sh0 ::+ sh1) a
forall shx shy a.
(C shx, C shy, Storable a) =>
Array shx a -> Array shy a -> Array (shx ::+ shy) a
Vector.append (FlexDiagonal diag sh0 a -> Array sh0 a
forall diag sh a.
TriDiag diag =>
FlexDiagonal diag sh a -> Vector sh a
takeDiagonal FlexDiagonalP pack diag sh0 a
FlexDiagonal diag sh0 a
a) (FlexDiagonal diag sh1 a -> Array sh1 a
forall diag sh a.
TriDiag diag =>
FlexDiagonal diag sh a -> Vector sh a
takeDiagonal FlexDiagonalP pack diag sh1 a
FlexDiagonal diag sh1 a
b)
      PackingSingleton pack
Layout.Unpacked ->
         let shc :: General (Unchecked sh0) (Unchecked sh1)
shc =
               Order
-> Unchecked sh0
-> Unchecked sh1
-> General (Unchecked sh0) (Unchecked sh1)
forall height width.
Order -> height -> width -> General height width
Layout.general Order
order
                  (sh0 -> Unchecked sh0
forall sh. sh -> Unchecked sh
Unchecked (sh0 -> Unchecked sh0) -> sh0 -> Unchecked sh0
forall a b. (a -> b) -> a -> b
$ FlexDiagonalP pack diag sh0 a -> sh0
forall pack property lower upper sh a.
Quadratic pack property lower upper sh a -> sh
Quad.size FlexDiagonalP pack diag sh0 a
a) (sh1 -> Unchecked sh1
forall sh. sh -> Unchecked sh
Unchecked (sh1 -> Unchecked sh1) -> sh1 -> Unchecked sh1
forall a b. (a -> b) -> a -> b
$ FlexDiagonalP pack diag sh1 a -> sh1
forall pack property lower upper sh a.
Quadratic pack property lower upper sh a -> sh
Quad.size FlexDiagonalP pack diag sh1 a
b)
         in (FullArray Shape Small Small sh0 sh0 a
 -> FullArray Shape Small Small sh1 sh1 a
 -> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> UnpackedMatrix
     diag (Bands U0) (Bands U0) Shape Small Small sh0 sh0 a
-> UnpackedMatrix
     diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1 a
-> UnpackedMatrix
     diag
     (Bands U0)
     (Bands U0)
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
forall propertyA lowerA upperA propertyB lowerB upperB propertyC
       lowerC upperC measA vertA horizA heightA widthA a measB vertB
       horizB heightB widthB b measC vertC horizC heightC widthC c.
(Property propertyA, Strip lowerA, Strip upperA,
 Property propertyB, Strip lowerB, Strip upperB, Property propertyC,
 Strip lowerC, Strip upperC) =>
(FullArray measA vertA horizA heightA widthA a
 -> FullArray measB vertB horizB heightB widthB b
 -> FullArray measC vertC horizC heightC widthC c)
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyB lowerB upperB measB vertB horizB heightB widthB b
-> UnpackedMatrix
     propertyC lowerC upperC measC vertC horizC heightC widthC c
ArrMatrix.liftUnpacked2
               (\FullArray Shape Small Small sh0 sh0 a
a_ FullArray Shape Small Small sh1 sh1 a
b_ ->
                  (Extent
   Shape
   Small
   Small
   (Unchecked sh0 ::+ Unchecked sh1)
   (Unchecked sh0 ::+ Unchecked sh1)
 -> Extent Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1))
-> Full
     Shape
     Small
     Small
     (Unchecked sh0 ::+ Unchecked sh1)
     (Unchecked sh0 ::+ Unchecked sh1)
     a
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Full measA vertA horizA heightA widthA a
-> Full measB vertB horizB heightB widthB a
FullBasic.mapExtent Extent
  Shape
  Small
  Small
  (Unchecked sh0 ::+ Unchecked sh1)
  (Unchecked sh0 ::+ Unchecked sh1)
-> Extent Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
forall meas vert horiz heightA heightB widthA widthB.
(Measure meas, C vert, C horiz) =>
Extent
  meas
  vert
  horiz
  (Unchecked heightA ::+ Unchecked heightB)
  (Unchecked widthA ::+ Unchecked widthB)
-> Extent meas vert horiz (heightA ::+ heightB) (widthA ::+ widthB)
Extent.recheckAppend (Full
   Shape
   Small
   Small
   (Unchecked sh0 ::+ Unchecked sh1)
   (Unchecked sh0 ::+ Unchecked sh1)
   a
 -> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> Full
     Shape
     Small
     Small
     (Unchecked sh0 ::+ Unchecked sh1)
     (Unchecked sh0 ::+ Unchecked sh1)
     a
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall a b. (a -> b) -> a -> b
$
                  Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
-> General (Unchecked sh0) (Unchecked sh1) a
-> General (Unchecked sh1) (Unchecked sh0) a
-> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
-> Full
     Shape
     Small
     Small
     (Unchecked sh0 ::+ Unchecked sh1)
     (Unchecked sh0 ::+ Unchecked sh1)
     a
forall meas vert horiz heightA heightB widthA widthB a.
(Measure meas, C vert, C horiz, C heightA, Eq heightA, C heightB,
 Eq heightB, C widthA, Eq widthA, C widthB, Eq widthB,
 Floating a) =>
Full meas vert horiz heightA widthA a
-> General heightA widthB a
-> General heightB widthA a
-> Full meas vert horiz heightB widthB a
-> Full meas vert horiz (heightA ::+ heightB) (widthA ::+ widthB) a
FullBasic.stack
                     (FullArray Shape Small Small sh0 sh0 a
-> Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas vert horiz (Unchecked height) (Unchecked width) a
FullBasic.uncheck FullArray Shape Small Small sh0 sh0 a
a_) (General (Unchecked sh0) (Unchecked sh1)
-> General (Unchecked sh0) (Unchecked sh1) a
forall sh a. (C sh, Floating a) => sh -> Vector sh a
Vector.zero General (Unchecked sh0) (Unchecked sh1)
shc)
                     (Full Size Big Big (Unchecked sh1) (Unchecked sh0)
-> General (Unchecked sh1) (Unchecked sh0) a
forall sh a. (C sh, Floating a) => sh -> Vector sh a
Vector.zero (Full Size Big Big (Unchecked sh1) (Unchecked sh0)
 -> General (Unchecked sh1) (Unchecked sh0) a)
-> Full Size Big Big (Unchecked sh1) (Unchecked sh0)
-> General (Unchecked sh1) (Unchecked sh0) a
forall a b. (a -> b) -> a -> b
$ General (Unchecked sh0) (Unchecked sh1)
-> Full Size Big Big (Unchecked sh1) (Unchecked sh0)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width
-> Full meas horiz vert width height
Layout.inverse General (Unchecked sh0) (Unchecked sh1)
shc) (FullArray Shape Small Small sh1 sh1 a
-> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas vert horiz (Unchecked height) (Unchecked width) a
FullBasic.uncheck FullArray Shape Small Small sh1 sh1 a
b_))
               FlexDiagonalP pack diag sh0 a
UnpackedMatrix
  diag (Bands U0) (Bands U0) Shape Small Small sh0 sh0 a
a FlexDiagonalP pack diag sh1 a
UnpackedMatrix
  diag (Bands U0) (Bands U0) Shape Small Small sh1 sh1 a
b

split ::
   (Omni.TriDiag diag, Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   FlexDiagonalP pack diag (sh0::+sh1) a ->
   (FlexDiagonalP pack diag sh0 a, FlexDiagonalP pack diag sh1 a)
split :: FlexDiagonalP pack diag (sh0 ::+ sh1) a
-> (FlexDiagonalP pack diag sh0 a, FlexDiagonalP pack diag sh1 a)
split FlexDiagonalP pack diag (sh0 ::+ sh1) a
a = (FlexDiagonalP pack diag (sh0 ::+ sh1) a
-> FlexDiagonalP pack diag sh0 a
forall sh0 sh1 a pack property lower upper.
(C sh0, C sh1, Floating a) =>
Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
Quad.takeTopLeft FlexDiagonalP pack diag (sh0 ::+ sh1) a
a, FlexDiagonalP pack diag (sh0 ::+ sh1) a
-> FlexDiagonalP pack diag sh1 a
forall sh0 sh1 a pack property lower upper.
(C sh0, C sh1, Floating a) =>
Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
Quad.takeBottomRight FlexDiagonalP pack diag (sh0 ::+ sh1) a
a)


multiply ::
   (Omni.TriDiag diag, Shape.C sh, Eq sh, Class.Floating a) =>
   FlexDiagonal diag sh a -> FlexDiagonal diag sh a -> FlexDiagonal diag sh a
multiply :: FlexDiagonal diag sh a
-> FlexDiagonal diag sh a -> FlexDiagonal diag sh a
multiply = (OmniArray
   Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
 -> OmniArray
      Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
 -> OmniArray
      Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a)
-> FlexDiagonal diag sh a
-> FlexDiagonal diag sh a
-> FlexDiagonal diag sh a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       a packB propB lowerB upperB measB vertB horizB heightB widthB b
       packC propC lowerC upperC measC vertC horizC heightC widthC c.
(OmniArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> OmniArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b
 -> OmniArray
      packC propC lowerC upperC measC vertC horizC heightC widthC c)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
-> ArrayMatrix
     packC propC lowerC upperC measC vertC horizC heightC widthC c
ArrMatrix.liftOmni2 OmniArray
  Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
-> OmniArray
     Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
-> OmniArray
     Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
forall sh a.
(C sh, Eq sh, Floating a) =>
Vector sh a -> Vector sh a -> Vector sh a
Vector.mul


solve ::
   (Omni.TriDiag diag,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
   FlexDiagonal diag height a ->
   ArrMatrix.Full meas vert horiz height width a ->
   ArrMatrix.Full meas vert horiz height width a
solve :: FlexDiagonal diag height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solve FlexDiagonal diag height a
a =
   case FlexDiagonal diag height a -> DiagSingleton diag
forall diag pack lower upper meas vert horiz height width a.
TriDiag diag =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> DiagSingleton diag
ArrMatrix.diagTag FlexDiagonal diag height a
a of
      DiagSingleton diag
Omni.Arbitrary -> FlexDiagonal diag height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall diag sub super meas vert horiz sh nrhs a.
(TriDiag diag, Natural sub, Natural super, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
Quadratic diag sub super sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Banded.solve FlexDiagonal diag height a
a
      DiagSingleton diag
Omni.Unit -> \Full meas vert horiz height width a
b ->
         if Omni
  Packed diag (Bands U0) (Bands U0) Shape Small Small height height
-> height
forall pack property lower upper sh.
Omni pack property lower upper Shape Small Small sh sh -> sh
Omni.squareSize (FlexDiagonal diag height a
-> Omni
     Packed diag (Bands U0) (Bands U0) Shape Small Small height height
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape FlexDiagonal diag height a
a) height -> height -> Bool
forall a. Eq a => a -> a -> Bool
==
               Omni Unpacked Arbitrary Filled Filled meas vert horiz height width
-> height
forall meas vert horiz pack property lower upper height width.
(Measure meas, C vert, C horiz) =>
Omni pack property lower upper meas vert horiz height width
-> height
Omni.height (Full meas vert horiz height width a
-> Omni
     Unpacked Arbitrary Filled Filled meas vert horiz height width
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape Full meas vert horiz height width a
b)
            then Full meas vert horiz height width a
b
            else [Char] -> Full meas vert horiz height width a
forall a. HasCallStack => [Char] -> a
error ([Char]
"Diagonal.solve: height shapes mismatch")

inverse ::
   (Omni.TriDiag diag, Shape.C sh, Class.Floating a) =>
   FlexDiagonal diag sh a -> FlexDiagonal diag sh a
inverse :: FlexDiagonal diag sh a -> FlexDiagonal diag sh a
inverse FlexDiagonal diag sh a
a =
   case FlexDiagonal diag sh a -> DiagSingleton diag
forall diag pack lower upper meas vert horiz height width a.
TriDiag diag =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> DiagSingleton diag
ArrMatrix.diagTag FlexDiagonal diag sh a
a of
      DiagSingleton diag
Omni.Unit -> FlexDiagonal diag sh a
a
      DiagSingleton diag
Omni.Arbitrary -> (OmniArray
   Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
 -> OmniArray
      Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a)
-> FlexDiagonal diag sh a -> FlexDiagonal diag sh a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       a packB propB lowerB upperB measB vertB horizB heightB widthB b.
(OmniArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> OmniArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.liftOmni1 OmniArray
  Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
-> OmniArray
     Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh a
forall sh a. (C sh, Floating a) => Vector sh a -> Vector sh a
Vector.recip FlexDiagonal diag sh a
a

determinant ::
   (Omni.TriDiag diag, Shape.C sh, Class.Floating a) =>
   FlexDiagonal diag sh a -> a
determinant :: FlexDiagonal diag sh a -> a
determinant FlexDiagonal diag sh a
a =
   case FlexDiagonal diag sh a -> DiagSingleton diag
forall diag pack lower upper meas vert horiz height width a.
TriDiag diag =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> DiagSingleton diag
ArrMatrix.diagTag FlexDiagonal diag sh a
a of
      DiagSingleton diag
Omni.Unit -> a
forall a. Floating a => a
Scalar.one
      DiagSingleton diag
Omni.Arbitrary -> Vector
  (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
-> a
forall sh a. (C sh, Floating a) => Vector sh a -> a
Vector.product (Vector
   (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
 -> a)
-> Vector
     (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
-> a
forall a b. (a -> b) -> a -> b
$ FlexDiagonal diag sh a
-> Vector
     (Omni Packed diag (Bands U0) (Bands U0) Shape Small Small sh sh) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap FlexDiagonal diag sh a
a