{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
module Numeric.LAPACK.Linear.Plain (
   LowerUpper,
   Tall, Wide, Square, LiberalSquare,
   Transposition(..),
   Conjugation(..),
   Inversion(..),
   mapExtent,
   fromMatrix,
   toMatrix,
   solve,
   multiplyFull,

   determinant,

   extractP,
   multiplyP,

   extractL,
   wideExtractL,
   wideMultiplyL,
   wideSolveL,

   extractU,
   tallExtractU,
   tallMultiplyU,
   tallSolveU,

   caseTallWide,
   ) where

import qualified Numeric.LAPACK.Matrix.Divide as Divide
import qualified Numeric.LAPACK.Matrix.Multiply as Multiply
import qualified Numeric.LAPACK.Matrix.Type as Matrix
import qualified Numeric.LAPACK.Matrix.Banded.Basic as Banded
import qualified Numeric.LAPACK.Matrix.Basic as Basic
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Layout as LayoutPub
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import qualified Numeric.LAPACK.Matrix.Extent.Strict as ExtentStrict
import qualified Numeric.LAPACK.Matrix.Extent.Private as ExtentPriv
import qualified Numeric.LAPACK.Matrix.Extent as Extent
import qualified Numeric.LAPACK.Matrix.Private as MatrixPriv
import qualified Numeric.LAPACK.Permutation.Private as Perm
import qualified Numeric.LAPACK.Split as Split
import Numeric.LAPACK.Output ((/+/))
import Numeric.LAPACK.Matrix.Plain.Format (formatArray)
import Numeric.LAPACK.Matrix.Type (Matrix, FormatMatrix(formatMatrix))
import Numeric.LAPACK.Matrix.Triangular.Basic (Lower, Upper)
import Numeric.LAPACK.Matrix.Layout.Private
         (Order(RowMajor, ColumnMajor), Triangle(Triangle))
import Numeric.LAPACK.Matrix.Modifier
         (Transposition(NonTransposed, Transposed),
          Conjugation(NonConjugated, Conjugated),
          Inversion(NonInverted, Inverted))
import Numeric.LAPACK.Matrix.Private (Full)
import Numeric.LAPACK.Linear.Private (solver, withInfo)
import Numeric.LAPACK.Vector (Vector)
import Numeric.LAPACK.Shape.Private (Unchecked(Unchecked), deconsUnchecked)
import Numeric.LAPACK.Private
         (copyBlock, copyTransposed, copyToColumnMajor, copyToColumnMajorTemp)

import qualified Numeric.LAPACK.FFI.Generic as LapackGen
import qualified Numeric.BLAS.FFI.Generic as BlasGen
import qualified Numeric.Netlib.Utility as Call
import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Storable.Unchecked.Monadic as ArrayIO
import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Storable.Unchecked (Array(Array), (!))

import Foreign.Marshal.Array (advancePtr)
import Foreign.ForeignPtr (withForeignPtr, castForeignPtr)
import Foreign.Ptr (Ptr)
import Foreign.Storable (Storable)

import Control.Monad.Trans.Cont (ContT(ContT), evalContT)
import Control.Monad.IO.Class (liftIO)
import Control.Monad (forM_)

import Data.Monoid ((<>))


data LU

data instance Matrix LU xl xu lower upper meas vert horiz height width a where
   LowerUpper ::
      Banded.RectangularDiagonal meas vert horiz
         height width (Perm.Element height) ->
      SplitArray meas vert horiz height width a ->
      LowerUpperFlex lower upper meas vert horiz height width a

deriving instance
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Storable a,
    Show height, Show width, Show a) =>
   Show (Matrix LU xl xu lower upper meas vert horiz height width a)

type SplitArray meas vert horiz height width a =
   Split.Split Layout.Triangle meas vert horiz height width a

split_ ::
   Matrix LU xl xu lower upper meas vert horiz height width a ->
   SplitArray meas vert horiz height width a
split_ :: Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_ (LowerUpper _pivot split) = SplitArray meas vert horiz height width a
split

type LowerUpperFlex = Matrix LU () ()
type LowerUpper = LowerUpperFlex Layout.Filled Layout.Filled
type Tall height width =
         LowerUpper Extent.Size Extent.Big Extent.Small height width
type Wide height width =
         LowerUpper Extent.Size Extent.Small Extent.Big height width
type LiberalSquare height width = SquareMeas Extent.Size height width
type Square sh = SquareMeas Extent.Shape sh sh
type SquareMeas meas height width =
         LowerUpper meas Extent.Small Extent.Small height width

instance FormatMatrix LU where
   formatMatrix :: String
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> out
formatMatrix String
fmt lu :: Matrix LU xl xu lower upper meas vert horiz height width a
lu@(LowerUpper _ipiv m) =
      Permutation height -> out
forall sh out. (C sh, Output out) => Permutation sh -> out
Perm.format (Inversion
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Permutation height
forall meas vert horiz height width lower upper a.
(Measure meas, C vert, C horiz, C height, C width) =>
Inversion
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Permutation height
extractP Inversion
NonInverted Matrix LU xl xu lower upper meas vert horiz height width a
LowerUpperFlex lower upper meas vert horiz height width a
lu)
      out -> out -> out
forall out. Output out => out -> out -> out
/+/
      String
-> Array (Split Triangle meas vert horiz height width) a -> out
forall sh a out.
(FormatArray sh, Floating a, Output out) =>
String -> Array sh a -> out
formatArray String
fmt Array (Split Triangle meas vert horiz height width) a
m


mapExtent ::
   (Extent.C vertA, Extent.C horizA) =>
   (Extent.C vertB, Extent.C horizB) =>
   ExtentStrict.Map measA vertA horizA measB vertB horizB height width ->
   LowerUpperFlex lower upper measA vertA horizA height width a ->
   LowerUpperFlex lower upper measB vertB horizB height width a
mapExtent :: Map measA vertA horizA measB vertB horizB height width
-> LowerUpperFlex lower upper measA vertA horizA height width a
-> LowerUpperFlex lower upper measB vertB horizB height width a
mapExtent Map measA vertA horizA measB vertB horizB height width
f (LowerUpper pivot split) =
   let g :: Map measA vertA horizA measB vertB horizB height width
g = Map measA vertA horizA measB vertB horizB height width
-> Map measA vertA horizA measB vertB horizB height width
forall measA vertA horizA measB vertB horizB height width.
Map measA vertA horizA measB vertB horizB height width
-> Map measA vertA horizA measB vertB horizB height width
ExtentStrict.apply Map measA vertA horizA measB vertB horizB height width
f
   in RectangularDiagonal
  measB vertB horizB height width (Element height)
-> SplitArray measB vertB horizB height width a
-> LowerUpperFlex lower upper measB vertB horizB height width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper (Map measA vertA horizA measB vertB horizB height width
-> Banded U0 U0 measA vertA horizA height width (Element height)
-> RectangularDiagonal
     measB vertB horizB height width (Element height)
forall vertA horizA vertB horizB measA measB height width sub super
       a.
(C vertA, C horizA, C vertB, C horizB) =>
Map measA vertA horizA measB vertB horizB height width
-> Banded sub super measA vertA horizA height width a
-> Banded sub super measB vertB horizB height width a
Banded.mapExtent Map measA vertA horizA measB vertB horizB height width
g Banded U0 U0 measA vertA horizA height width (Element height)
pivot) (SplitArray measB vertB horizB height width a
 -> LowerUpperFlex lower upper measB vertB horizB height width a)
-> SplitArray measB vertB horizB height width a
-> LowerUpperFlex lower upper measB vertB horizB height width a
forall a b. (a -> b) -> a -> b
$
      (Split Triangle measA vertA horizA height width
 -> Split Triangle measB vertB horizB height width)
-> Array (Split Triangle measA vertA horizA height width) a
-> SplitArray measB vertB horizB height width a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape (Map measA vertA horizA measB vertB horizB height width
-> Split Triangle measA vertA horizA height width
-> Split Triangle measB vertB horizB height width
forall measA vertA horizA measB vertB horizB height width lower.
Map measA vertA horizA measB vertB horizB height width
-> Split lower measA vertA horizA height width
-> Split lower measB vertB horizB height width
Layout.splitMapExtent Map measA vertA horizA measB vertB horizB height width
g) Array (Split Triangle measA vertA horizA height width) a
split


mapPivotHeight ::
   (sh0 -> sh1) ->
   Vector shape (Perm.Element sh0) -> Vector shape (Perm.Element sh1)
mapPivotHeight :: (sh0 -> sh1)
-> Vector shape (Element sh0) -> Vector shape (Element sh1)
mapPivotHeight sh0 -> sh1
_f (Array shape
shape ForeignPtr (Element sh0)
xs) = shape -> ForeignPtr (Element sh1) -> Vector shape (Element sh1)
forall sh a. sh -> ForeignPtr a -> Array sh a
Array shape
shape (ForeignPtr (Element sh0) -> ForeignPtr (Element sh1)
forall a b. ForeignPtr a -> ForeignPtr b
castForeignPtr ForeignPtr (Element sh0)
xs)

mapHeight ::
   (Extent.C vert, Extent.C horiz) =>
   (heightA -> heightB) ->
   LowerUpperFlex lower upper Extent.Size vert horiz heightA width a ->
   LowerUpperFlex lower upper Extent.Size vert horiz heightB width a
mapHeight :: (heightA -> heightB)
-> LowerUpperFlex lower upper Size vert horiz heightA width a
-> LowerUpperFlex lower upper Size vert horiz heightB width a
mapHeight heightA -> heightB
f (LowerUpper pivot split) =
   RectangularDiagonal Size vert horiz heightB width (Element heightB)
-> SplitArray Size vert horiz heightB width a
-> LowerUpperFlex lower upper Size vert horiz heightB width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper
      ((heightA -> heightB)
-> Banded U0 U0 Size vert horiz heightA width (Element heightB)
-> RectangularDiagonal
     Size vert horiz heightB width (Element heightB)
forall vert horiz heightA heightB sub super width a.
(C vert, C horiz) =>
(heightA -> heightB)
-> Banded sub super Size vert horiz heightA width a
-> Banded sub super Size vert horiz heightB width a
Banded.mapHeight heightA -> heightB
f (Banded U0 U0 Size vert horiz heightA width (Element heightB)
 -> RectangularDiagonal
      Size vert horiz heightB width (Element heightB))
-> Banded U0 U0 Size vert horiz heightA width (Element heightB)
-> RectangularDiagonal
     Size vert horiz heightB width (Element heightB)
forall a b. (a -> b) -> a -> b
$ (heightA -> heightB)
-> Vector
     (Banded U0 U0 Size vert horiz heightA width) (Element heightA)
-> Banded U0 U0 Size vert horiz heightA width (Element heightB)
forall sh0 sh1 shape.
(sh0 -> sh1)
-> Vector shape (Element sh0) -> Vector shape (Element sh1)
mapPivotHeight heightA -> heightB
f Vector
  (Banded U0 U0 Size vert horiz heightA width) (Element heightA)
pivot)
      ((heightA -> heightB)
-> Split Triangle Size vert horiz heightA width a
-> SplitArray Size vert horiz heightB width a
forall vert horiz heightA heightB lower width a.
(C vert, C horiz) =>
(heightA -> heightB)
-> Split lower Size vert horiz heightA width a
-> Split lower Size vert horiz heightB width a
Split.mapHeight heightA -> heightB
f Split Triangle Size vert horiz heightA width a
split)

mapWidth ::
   (Extent.C vert, Extent.C horiz) =>
   (widthA -> widthB) ->
   LowerUpperFlex lower upper Extent.Size vert horiz height widthA a ->
   LowerUpperFlex lower upper Extent.Size vert horiz height widthB a
mapWidth :: (widthA -> widthB)
-> LowerUpperFlex lower upper Size vert horiz height widthA a
-> LowerUpperFlex lower upper Size vert horiz height widthB a
mapWidth widthA -> widthB
f (LowerUpper pivot split) =
   RectangularDiagonal Size vert horiz height widthB (Element height)
-> SplitArray Size vert horiz height widthB a
-> LowerUpperFlex lower upper Size vert horiz height widthB a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper
      ((widthA -> widthB)
-> Banded U0 U0 Size vert horiz height widthA (Element height)
-> RectangularDiagonal
     Size vert horiz height widthB (Element height)
forall vert horiz widthA widthB sub super height a.
(C vert, C horiz) =>
(widthA -> widthB)
-> Banded sub super Size vert horiz height widthA a
-> Banded sub super Size vert horiz height widthB a
Banded.mapWidth widthA -> widthB
f Banded U0 U0 Size vert horiz height widthA (Element height)
pivot)
      ((widthA -> widthB)
-> Split Triangle Size vert horiz height widthA a
-> SplitArray Size vert horiz height widthB a
forall vert horiz widthA widthB lower height a.
(C vert, C horiz) =>
(widthA -> widthB)
-> Split lower Size vert horiz height widthA a
-> Split lower Size vert horiz height widthB a
Split.mapWidth widthA -> widthB
f Split Triangle Size vert horiz height widthA a
split)


fromMatrix ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   Full meas vert horiz height width a ->
   LowerUpper meas vert horiz height width a
fromMatrix :: Full meas vert horiz height width a
-> LowerUpper meas vert horiz height width a
fromMatrix (Array (Layout.Full Order
order Extent meas vert horiz height width
extent) ForeignPtr a
a) =
   let (height
height,width
width) = Extent meas vert horiz height width -> (height, width)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> (height, width)
Extent.dimensions Extent meas vert horiz height width
extent
   in (RectangularDiagonal meas vert horiz height width (Element height)
 -> SplitArray meas vert horiz height width a
 -> LowerUpper meas vert horiz height width a)
-> (RectangularDiagonal
      meas vert horiz height width (Element height),
    SplitArray meas vert horiz height width a)
-> LowerUpper meas vert horiz height width a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpper meas vert horiz height width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper ((RectangularDiagonal
    meas vert horiz height width (Element height),
  SplitArray meas vert horiz height width a)
 -> LowerUpper meas vert horiz height width a)
-> (RectangularDiagonal
      meas vert horiz height width (Element height),
    SplitArray meas vert horiz height width a)
-> LowerUpper meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
      RectangularDiagonal meas vert horiz height width
-> (Int
    -> Ptr (Element height)
    -> IO (SplitArray meas vert horiz height width a))
-> (RectangularDiagonal
      meas vert horiz height width (Element height),
    SplitArray meas vert horiz height width a)
forall sh a b.
(C sh, Storable a) =>
sh -> (Int -> Ptr a -> IO b) -> (Array sh a, b)
Array.unsafeCreateWithSizeAndResult
         ((Int, RectangularDiagonal meas vert horiz height width)
-> RectangularDiagonal meas vert horiz height width
forall a b. (a, b) -> b
snd ((Int, RectangularDiagonal meas vert horiz height width)
 -> RectangularDiagonal meas vert horiz height width)
-> (Int, RectangularDiagonal meas vert horiz height width)
-> RectangularDiagonal meas vert horiz height width
forall a b. (a -> b) -> a -> b
$ Extent meas vert horiz height width
-> (Int, RectangularDiagonal meas vert horiz height width)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz, C height, C width) =>
Extent meas vert horiz height width
-> (Int, RectangularDiagonal meas vert horiz height width)
Layout.rectangularDiagonal Extent meas vert horiz height width
extent) ((Int
  -> Ptr (Element height)
  -> IO (SplitArray meas vert horiz height width a))
 -> (RectangularDiagonal
       meas vert horiz height width (Element height),
     SplitArray meas vert horiz height width a))
-> (Int
    -> Ptr (Element height)
    -> IO (SplitArray meas vert horiz height width a))
-> (RectangularDiagonal
      meas vert horiz height width (Element height),
    SplitArray meas vert horiz height width a)
forall a b. (a -> b) -> a -> b
$ \Int
_ Ptr (Element height)
ipivPtr ->
      Split Triangle meas vert horiz height width
-> (Ptr a -> IO ())
-> IO (SplitArray meas vert horiz height width a)
forall (m :: * -> *) sh a.
(PrimMonad m, C sh, Storable a) =>
sh -> (Ptr a -> IO ()) -> m (Array sh a)
ArrayIO.unsafeCreate
         (Triangle
-> Order
-> Extent meas vert horiz height width
-> Split Triangle meas vert horiz height width
forall lower meas vert horiz height width.
lower
-> Order
-> Extent meas vert horiz height width
-> Split lower meas vert horiz height width
Layout.Split Triangle
Layout.Triangle Order
ColumnMajor Extent meas vert horiz height width
extent) ((Ptr a -> IO ())
 -> IO (SplitArray meas vert horiz height width a))
-> (Ptr a -> IO ())
-> IO (SplitArray meas vert horiz height width a)
forall a b. (a -> b) -> a -> b
$ \Ptr a
luPtr ->

   ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> IO ()) -> ContT () IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
      let m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
height
      let n :: Int
n = width -> Int
forall sh. C sh => sh -> Int
Shape.size width
width
      Ptr CInt
mPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
m
      Ptr CInt
nPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
n
      Ptr a
aPtr <- ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a))
-> ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a
      Ptr CInt
ldaPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
m
      IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ do
         Order -> Int -> Int -> Ptr a -> Ptr a -> IO ()
forall a.
Floating a =>
Order -> Int -> Int -> Ptr a -> Ptr a -> IO ()
copyToColumnMajor Order
order Int
m Int
n Ptr a
aPtr Ptr a
luPtr
         String -> (Ptr CInt -> IO ()) -> IO ()
withInfo String
"getrf" ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
            Ptr CInt
-> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()
forall a.
Floating a =>
Ptr CInt
-> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()
LapackGen.getrf Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
luPtr Ptr CInt
ldaPtr
               (Ptr (Element height) -> Ptr CInt
forall sh. Ptr (Element sh) -> Ptr CInt
Perm.deconsElementPtr Ptr (Element height)
ipivPtr)

solve ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Eq height, Shape.C height, Shape.C width, Class.Floating a) =>
   Square height a ->
   Full meas vert horiz height width a ->
   Full meas vert horiz height width a
solve :: Square height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solve = Transposition
-> Square height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, Eq height, C height, C width,
 Floating a) =>
Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solveTrans Transposition
NonTransposed

solveTrans ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Eq height, Shape.C height, Shape.C width, Class.Floating a) =>
   Transposition ->
   LowerUpperFlex lower upper
      Extent.Shape Extent.Small Extent.Small height height a ->
   Full meas vert horiz height width a ->
   Full meas vert horiz height width a
solveTrans :: Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solveTrans Transposition
trans
   (LowerUpper
      (Array _ ipiv)
      (Array (Layout.Split Layout.Triangle orderLU extentLU) lu)) =

   String
-> height
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz, C height, C width, Eq height,
 Floating a) =>
String
-> height
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solver String
"LowerUpper.solve" (Square height -> height
forall shape. Square shape -> shape
Extent.squareSize Square height
extentLU) ((Int
  -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
         \Int
n Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr -> do
      let lda :: Int
lda = Int
n
      Ptr CChar
transPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char (Char -> FortranIO () (Ptr CChar))
-> Char -> FortranIO () (Ptr CChar)
forall a b. (a -> b) -> a -> b
$
         case Transposition
trans of
            Transposition
NonTransposed -> Char
'N'
            Transposition
Transposed -> Char
'T'
      Ptr a
aPtr <-
         case Order
orderLU of
            Order
RowMajor -> Order -> Int -> Int -> ForeignPtr a -> ContT () IO (Ptr a)
forall a r.
Floating a =>
Order -> Int -> Int -> ForeignPtr a -> ContT r IO (Ptr a)
copyToColumnMajorTemp Order
orderLU Int
n Int
n ForeignPtr a
lu
            Order
ColumnMajor -> ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a))
-> ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
lu
      Ptr CInt
ldaPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
lda
      Ptr CInt
ipivPtr <- (Ptr (Element height) -> Ptr CInt)
-> ContT () IO (Ptr (Element height)) -> FortranIO () (Ptr CInt)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ptr (Element height) -> Ptr CInt
forall sh. Ptr (Element sh) -> Ptr CInt
Perm.deconsElementPtr (ContT () IO (Ptr (Element height)) -> FortranIO () (Ptr CInt))
-> ContT () IO (Ptr (Element height)) -> FortranIO () (Ptr CInt)
forall a b. (a -> b) -> a -> b
$ ((Ptr (Element height) -> IO ()) -> IO ())
-> ContT () IO (Ptr (Element height))
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr (Element height) -> IO ()) -> IO ())
 -> ContT () IO (Ptr (Element height)))
-> ((Ptr (Element height) -> IO ()) -> IO ())
-> ContT () IO (Ptr (Element height))
forall a b. (a -> b) -> a -> b
$ ForeignPtr (Element height)
-> (Ptr (Element height) -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr (Element height)
ipiv
      IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
         String -> (Ptr CInt -> IO ()) -> IO ()
withInfo String
"getrs" ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
            Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
LapackGen.getrs Ptr CChar
transPtr
               Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
aPtr Ptr CInt
ldaPtr Ptr CInt
ipivPtr Ptr a
xPtr Ptr CInt
ldxPtr

{- |
Caution:
@LU.determinant . LU.fromMatrix@ will fail for singular matrices.
-}
determinant ::
   (Extent.Measure meas, Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas Extent.Small Extent.Small height width a -> a
determinant :: LowerUpperFlex lower upper meas Small Small height width a -> a
determinant (LowerUpper ipiv split) =
   [CInt] -> a -> a
forall a. Floating a => [CInt] -> a -> a
Perm.condNegate ((Element height -> CInt) -> [Element height] -> [CInt]
forall a b. (a -> b) -> [a] -> [b]
map Element height -> CInt
forall sh. Element sh -> CInt
Perm.deconsElement ([Element height] -> [CInt]) -> [Element height] -> [CInt]
forall a b. (a -> b) -> a -> b
$ Array (Banded U0 U0 meas Small Small height width) (Element height)
-> [Element height]
forall sh a. (C sh, Storable a) => Array sh a -> [a]
Array.toList Array (Banded U0 U0 meas Small Small height width) (Element height)
ipiv) (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$
   Split Triangle meas Small Small height width a -> a
forall meas vert height width a lower.
(Measure meas, C vert, C height, C width, Floating a) =>
Split lower meas vert Small height width a -> a
Split.determinantR Split Triangle meas Small Small height width a
split


extractP ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width) =>
   Inversion ->
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Perm.Permutation height
extractP :: Inversion
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Permutation height
extractP Inversion
inverted (LowerUpper ipiv _) =
   Inversion
-> Vector
     (Shape (Banded U0 U0 meas vert horiz height width))
     (Element height)
-> Permutation height
forall meas vert horiz height width diagShape.
(Measure meas, C vert, C horiz, C height, C width,
 diagShape ~ RectangularDiagonal meas vert horiz height width) =>
Inversion
-> Vector (Shape diagShape) (Element height) -> Permutation height
Perm.fromTruncatedPivots (Inversion
Inverted Inversion -> Inversion -> Inversion
forall a. Semigroup a => a -> a -> a
<> Inversion
inverted)
      ((Banded U0 U0 meas vert horiz height width
 -> Shape (Banded U0 U0 meas vert horiz height width))
-> Array
     (Banded U0 U0 meas vert horiz height width) (Element height)
-> Vector
     (Shape (Banded U0 U0 meas vert horiz height width))
     (Element height)
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Banded U0 U0 meas vert horiz height width
-> Shape (Banded U0 U0 meas vert horiz height width)
forall sh. sh -> Shape sh
Perm.Shape Array (Banded U0 U0 meas vert horiz height width) (Element height)
ipiv)

multiplyP ::
   (Extent.Measure measA, Extent.C vertA, Extent.C horizA,
    Extent.Measure measB, Extent.C vertB, Extent.C horizB,
    Eq height, Shape.C height, Shape.C widthA, Shape.C widthB,
    Class.Floating a) =>
   Inversion ->
   LowerUpperFlex lower upper measA vertA horizA height widthA a ->
   Full measB vertB horizB height widthB a ->
   Full measB vertB horizB height widthB a
multiplyP :: Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
inverted
      (LowerUpper ipiv@(Array shapeIPiv ipivFPtr)
         (Array (Layout.Split _ _ extentLU) _lu))
      (Array shape :: Full measB vertB horizB height widthB
shape@(Layout.Full Order
order Extent measB vertB horizB height widthB
extent) ForeignPtr a
a) =
   Full measB vertB horizB height widthB
-> (Ptr a -> IO ()) -> Full measB vertB horizB height widthB a
forall sh a.
(C sh, Storable a) =>
sh -> (Ptr a -> IO ()) -> Array sh a
Array.unsafeCreate Full measB vertB horizB height widthB
shape ((Ptr a -> IO ()) -> Full measB vertB horizB height widthB a)
-> (Ptr a -> IO ()) -> Full measB vertB horizB height widthB a
forall a b. (a -> b) -> a -> b
$ \Ptr a
bPtr -> do

   String -> Bool -> IO ()
Call.assert String
"multiplyP: heights mismatch"
      (Extent measA vertA horizA height widthA -> height
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> height
Extent.height Extent measA vertA horizA height widthA
extentLU height -> height -> Bool
forall a. Eq a => a -> a -> Bool
== Extent measB vertB horizB height widthB -> height
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> height
Extent.height Extent measB vertB horizB height widthB
extent)

   let (height
height,widthB
width) = Extent measB vertB horizB height widthB -> (height, widthB)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> (height, width)
Extent.dimensions Extent measB vertB horizB height widthB
extent
   let m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
height
   let n :: Int
n = widthB -> Int
forall sh. C sh => sh -> Int
Shape.size widthB
width
   let k :: Int
k = Banded U0 U0 measA vertA horizA height widthA -> Int
forall sh. C sh => sh -> Int
Shape.size Banded U0 U0 measA vertA horizA height widthA
shapeIPiv

   ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> IO ()) -> ContT () IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
      Ptr a
aPtr <- ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a))
-> ((Ptr a -> IO ()) -> IO ()) -> ContT () IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a
      Ptr (Element height)
ipivPtr <- ((Ptr (Element height) -> IO ()) -> IO ())
-> ContT () IO (Ptr (Element height))
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr (Element height) -> IO ()) -> IO ())
 -> ContT () IO (Ptr (Element height)))
-> ((Ptr (Element height) -> IO ()) -> IO ())
-> ContT () IO (Ptr (Element height))
forall a b. (a -> b) -> a -> b
$ ForeignPtr (Element height)
-> (Ptr (Element height) -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr (Element height)
ipivFPtr
      IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Int -> Ptr a -> Ptr a -> IO ()
forall a. Floating a => Int -> Ptr a -> Ptr a -> IO ()
copyBlock (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
m) Ptr a
aPtr Ptr a
bPtr
      case Order
order of
         Order
ColumnMajor -> do
            Ptr CInt
nPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
n
            Ptr CInt
ldaPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
m
            Ptr CInt
k1Ptr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
1
            Ptr CInt
k2Ptr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
k
            Ptr CInt
incxPtr <-
               Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint (Int -> FortranIO () (Ptr CInt)) -> Int -> FortranIO () (Ptr CInt)
forall a b. (a -> b) -> a -> b
$
               case Inversion
inverted of
                  Inversion
Inverted -> Int
1
                  Inversion
NonInverted -> -Int
1
            IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
               Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> IO ()
LapackGen.laswp Ptr CInt
nPtr Ptr a
bPtr Ptr CInt
ldaPtr Ptr CInt
k1Ptr Ptr CInt
k2Ptr
                  (Ptr (Element height) -> Ptr CInt
forall sh. Ptr (Element sh) -> Ptr CInt
Perm.deconsElementPtr Ptr (Element height)
ipivPtr) Ptr CInt
incxPtr
         Order
RowMajor ->
            IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
            Shape height
-> Int
-> Ptr a
-> Array
     (Shape (Banded U0 U0 measA vertA horizA height widthA))
     (Element height)
-> [Element (Banded U0 U0 measA vertA horizA height widthA)]
-> IO ()
forall meas vert horiz height width a diagShape.
(Measure meas, C vert, C horiz, C height, C width, Floating a,
 diagShape ~ RectangularDiagonal meas vert horiz height width) =>
Shape height
-> Int
-> Ptr a
-> Array (Shape diagShape) (Element height)
-> [Element diagShape]
-> IO ()
swapColumns
               (height -> Shape height
forall sh. sh -> Shape sh
Perm.Shape height
height) Int
n Ptr a
bPtr ((Banded U0 U0 measA vertA horizA height widthA
 -> Shape (Banded U0 U0 measA vertA horizA height widthA))
-> Array
     (Banded U0 U0 measA vertA horizA height widthA) (Element height)
-> Array
     (Shape (Banded U0 U0 measA vertA horizA height widthA))
     (Element height)
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Banded U0 U0 measA vertA horizA height widthA
-> Shape (Banded U0 U0 measA vertA horizA height widthA)
forall sh. sh -> Shape sh
Perm.Shape Array
  (Banded U0 U0 measA vertA horizA height widthA) (Element height)
ipiv) ([Element (Banded U0 U0 measA vertA horizA height widthA)]
 -> IO ())
-> [Element (Banded U0 U0 measA vertA horizA height widthA)]
-> IO ()
forall a b. (a -> b) -> a -> b
$
            Inversion
-> Shape (Banded U0 U0 measA vertA horizA height widthA)
-> [Element (Banded U0 U0 measA vertA horizA height widthA)]
forall sh. C sh => Inversion -> Shape sh -> [Element sh]
Perm.indices (Inversion
Inverted Inversion -> Inversion -> Inversion
forall a. Semigroup a => a -> a -> a
<> Inversion
inverted) (Banded U0 U0 measA vertA horizA height widthA
-> Shape (Banded U0 U0 measA vertA horizA height widthA)
forall sh. sh -> Shape sh
Perm.Shape Banded U0 U0 measA vertA horizA height widthA
shapeIPiv)

{-# INLINE swapColumns #-}
swapColumns ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
   (Shape.C height, Shape.C width, Class.Floating a) =>
   (diagShape ~ Layout.RectangularDiagonal meas vert horiz height width) =>
   Perm.Shape height -> Int -> Ptr a ->
   Array (Perm.Shape diagShape) (Perm.Element height) ->
   [Perm.Element diagShape] -> IO ()
swapColumns :: Shape height
-> Int
-> Ptr a
-> Array (Shape diagShape) (Element height)
-> [Element diagShape]
-> IO ()
swapColumns Shape height
sh Int
n Ptr a
xPtr Array (Shape diagShape) (Element height)
ipiv [Element diagShape]
is = ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> IO ()) -> ContT () IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
   Ptr CInt
nPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
n
   Ptr CInt
incPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
1
   let mapIx :: Element sh -> Element sh
mapIx (Perm.Element CInt
i) = CInt -> Element sh
forall sh. CInt -> Element sh
Perm.Element CInt
i
   let columnPtr :: Element height -> Ptr a
columnPtr Element height
ix = Ptr a -> Int -> Ptr a
forall a. Storable a => Ptr a -> Int -> Ptr a
advancePtr Ptr a
xPtr (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
* Shape height -> Index (Shape height) -> Int
forall sh. Indexed sh => sh -> Index sh -> Int
Shape.uncheckedOffset Shape height
sh Index (Shape height)
Element height
ix)
   IO () -> ContT () IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ [Element diagShape] -> (Element diagShape -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Element diagShape]
is ((Element diagShape -> IO ()) -> IO ())
-> (Element diagShape -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Element diagShape
i ->
      Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
forall a.
Floating a =>
Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
BlasGen.swap Ptr CInt
nPtr (Element height -> Ptr a
columnPtr (Element height -> Ptr a) -> Element height -> Ptr a
forall a b. (a -> b) -> a -> b
$ Element diagShape -> Element height
forall sh sh. Element sh -> Element sh
mapIx Element diagShape
i) Ptr CInt
incPtr (Element height -> Ptr a
columnPtr (Array (Shape diagShape) (Element height)
ipivArray (Shape diagShape) (Element height)
-> Index (Shape diagShape) -> Element height
forall sh a.
(Indexed sh, Storable a) =>
Array sh a -> Index sh -> a
!Index (Shape diagShape)
Element diagShape
i)) Ptr CInt
incPtr



extractL ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Full meas vert horiz height width a
extractL :: LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractL = Either Triangle Triangle
-> Split Triangle meas vert horiz height width a
-> Full meas vert horiz height width a
forall meas vert horiz height width a lower.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
Either lower Triangle
-> Split lower meas vert horiz height width a
-> Full meas vert horiz height width a
Split.extractTriangle (Triangle -> Either Triangle Triangle
forall a b. a -> Either a b
Left Triangle
Triangle) (Split Triangle meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (LowerUpperFlex lower upper meas vert horiz height width a
    -> Split Triangle meas vert horiz height width a)
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper meas vert horiz height width a
-> Split Triangle meas vert horiz height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

wideExtractL ::
   (Extent.Measure meas, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas Extent.Small horiz height width a ->
   Lower height a
wideExtractL :: LowerUpperFlex lower upper meas Small horiz height width a
-> Lower height a
wideExtractL = Split Triangle meas Small horiz height width a -> Lower height a
forall meas horiz height width a lower.
(Measure meas, C horiz, C height, C width, Floating a) =>
Split lower meas Small horiz height width a -> Lower height a
Split.wideExtractL (Split Triangle meas Small horiz height width a -> Lower height a)
-> (LowerUpperFlex lower upper meas Small horiz height width a
    -> Split Triangle meas Small horiz height width a)
-> LowerUpperFlex lower upper meas Small horiz height width a
-> Lower height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper meas Small horiz height width a
-> Split Triangle meas Small horiz height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

wideMultiplyL ::
   (Extent.Measure measA, Extent.C horizA,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height,
    Shape.C widthA, Shape.C widthB, Class.Floating a) =>
   Transposition ->
   LowerUpperFlex lower upper measA Extent.Small horizA height widthA a ->
   Full meas vert horiz height widthB a ->
   Full meas vert horiz height widthB a
wideMultiplyL :: Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
transposed = Transposition
-> Split Triangle measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
forall measA horizA meas vert horiz height widthA widthB a.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> Split Triangle measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
Split.wideMultiplyL Transposition
transposed (Split Triangle measA Small horizA height widthA a
 -> Full meas vert horiz height widthB a
 -> Full meas vert horiz height widthB a)
-> (LowerUpperFlex lower upper measA Small horizA height widthA a
    -> Split Triangle measA Small horizA height widthA a)
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper measA Small horizA height widthA a
-> Split Triangle measA Small horizA height widthA a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

wideSolveL ::
   (Extent.Measure measA, Extent.C horizA,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, Shape.C width, Shape.C nrhs, Class.Floating a) =>
   Transposition -> Conjugation ->
   LowerUpperFlex lower upper measA Extent.Small horizA height width a ->
   Full meas vert horiz height nrhs a -> Full meas vert horiz height nrhs a
wideSolveL :: Transposition
-> Conjugation
-> LowerUpperFlex lower upper measA Small horizA height width a
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
wideSolveL Transposition
transposed Conjugation
conjugated =
   Transposition
-> Conjugation
-> Split Triangle measA Small horizA height width a
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
forall measA horizA meas vert horiz height width nrhs a.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C width, C nrhs, Floating a) =>
Transposition
-> Conjugation
-> Split Triangle measA Small horizA height width a
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
Split.wideSolveL Transposition
transposed Conjugation
conjugated (Split Triangle measA Small horizA height width a
 -> Full meas vert horiz height nrhs a
 -> Full meas vert horiz height nrhs a)
-> (LowerUpperFlex lower upper measA Small horizA height width a
    -> Split Triangle measA Small horizA height width a)
-> LowerUpperFlex lower upper measA Small horizA height width a
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper measA Small horizA height width a
-> Split Triangle measA Small horizA height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_


extractU ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Full meas vert horiz height width a
extractU :: LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractU = Either Triangle Triangle
-> Split Triangle meas vert horiz height width a
-> Full meas vert horiz height width a
forall meas vert horiz height width a lower.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
Either lower Triangle
-> Split lower meas vert horiz height width a
-> Full meas vert horiz height width a
Split.extractTriangle (Triangle -> Either Triangle Triangle
forall a b. b -> Either a b
Right Triangle
Triangle) (Split Triangle meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (LowerUpperFlex lower upper meas vert horiz height width a
    -> Split Triangle meas vert horiz height width a)
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper meas vert horiz height width a
-> Split Triangle meas vert horiz height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

tallExtractU ::
   (Extent.Measure meas, Extent.C vert,
    Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert Extent.Small height width a ->
   Upper width a
tallExtractU :: LowerUpperFlex lower upper meas vert Small height width a
-> Upper width a
tallExtractU = Split Triangle meas vert Small height width a -> Upper width a
forall meas vert height width a lower.
(Measure meas, C vert, C height, C width, Floating a) =>
Split lower meas vert Small height width a -> Upper width a
Split.tallExtractR (Split Triangle meas vert Small height width a -> Upper width a)
-> (LowerUpperFlex lower upper meas vert Small height width a
    -> Split Triangle meas vert Small height width a)
-> LowerUpperFlex lower upper meas vert Small height width a
-> Upper width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper meas vert Small height width a
-> Split Triangle meas vert Small height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

tallMultiplyU ::
   (Extent.Measure measA, Extent.C vertA,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height,
    Shape.C heightA, Shape.C widthB, Class.Floating a) =>
   Transposition ->
   LowerUpperFlex lower upper measA vertA Extent.Small heightA height a ->
   Full meas vert horiz height widthB a ->
   Full meas vert horiz height widthB a
tallMultiplyU :: Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
transposed = Transposition
-> Split Triangle measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
forall measA vertA meas vert horiz height heightA widthB a lower.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> Split lower measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
Split.tallMultiplyR Transposition
transposed (Split Triangle measA vertA Small heightA height a
 -> Full meas vert horiz height widthB a
 -> Full meas vert horiz height widthB a)
-> (LowerUpperFlex lower upper measA vertA Small heightA height a
    -> Split Triangle measA vertA Small heightA height a)
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper measA vertA Small heightA height a
-> Split Triangle measA vertA Small heightA height a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

tallSolveU ::
   (Extent.Measure measA, Extent.C vertA,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Eq width, Shape.C nrhs, Class.Floating a) =>
   Transposition -> Conjugation ->
   LowerUpperFlex lower upper measA vertA Extent.Small height width a ->
   Full meas vert horiz width nrhs a -> Full meas vert horiz width nrhs a
tallSolveU :: Transposition
-> Conjugation
-> LowerUpperFlex lower upper measA vertA Small height width a
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
tallSolveU Transposition
transposed Conjugation
conjugated =
   Transposition
-> Conjugation
-> Split Triangle measA vertA Small height width a
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
forall measA vertA meas vert horiz height width nrhs a lower.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 C width, Eq width, C nrhs, Floating a) =>
Transposition
-> Conjugation
-> Split lower measA vertA Small height width a
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
Split.tallSolveR Transposition
transposed Conjugation
conjugated (Split Triangle measA vertA Small height width a
 -> Full meas vert horiz width nrhs a
 -> Full meas vert horiz width nrhs a)
-> (LowerUpperFlex lower upper measA vertA Small height width a
    -> Split Triangle measA vertA Small height width a)
-> LowerUpperFlex lower upper measA vertA Small height width a
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper measA vertA Small height width a
-> Split Triangle measA vertA Small height width a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_



toMatrix ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, Shape.C width, Eq width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Full meas vert horiz height width a
toMatrix :: LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
toMatrix =
   ToMatrix lower upper height width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
forall lower upper height width a meas vert horiz.
ToMatrix lower upper height width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
getToMatrix (ToMatrix lower upper height width a meas vert horiz
 -> LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
   ToMatrix lower upper height width a Shape Small Small
-> ToMatrix lower upper height width a Size Small Small
-> ToMatrix lower upper height width a Size Small Big
-> ToMatrix lower upper height width a Size Big Small
-> ToMatrix lower upper height width a Size Big Big
-> ToMatrix lower upper height width a meas vert horiz
forall meas vert horiz (f :: * -> * -> * -> *).
(Measure meas, C vert, C horiz) =>
f Shape Small Small
-> f Size Small Small
-> f Size Small Big
-> f Size Big Small
-> f Size Big Big
-> f meas vert horiz
ExtentPriv.switchTagTriple
      ((LowerUpperFlex lower upper Shape Small Small height width a
 -> Full Shape Small Small height width a)
-> ToMatrix lower upper height width a Shape Small Small
forall lower upper height width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
ToMatrix LowerUpperFlex lower upper Shape Small Small height width a
-> Full Shape Small Small height width a
forall meas horiz height width a lower upper.
(Measure meas, C horiz, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
wideToMatrix)
      ((LowerUpperFlex lower upper Size Small Small height width a
 -> Full Size Small Small height width a)
-> ToMatrix lower upper height width a Size Small Small
forall lower upper height width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
ToMatrix LowerUpperFlex lower upper Size Small Small height width a
-> Full Size Small Small height width a
forall meas horiz height width a lower upper.
(Measure meas, C horiz, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
wideToMatrix)
      ((LowerUpperFlex lower upper Size Small Big height width a
 -> Full Size Small Big height width a)
-> ToMatrix lower upper height width a Size Small Big
forall lower upper height width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
ToMatrix LowerUpperFlex lower upper Size Small Big height width a
-> Full Size Small Big height width a
forall meas horiz height width a lower upper.
(Measure meas, C horiz, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
wideToMatrix)
      ((LowerUpperFlex lower upper Size Big Small height width a
 -> Full Size Big Small height width a)
-> ToMatrix lower upper height width a Size Big Small
forall lower upper height width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
ToMatrix LowerUpperFlex lower upper Size Big Small height width a
-> Full Size Big Small height width a
forall meas vert height width a lower upper.
(Measure meas, C vert, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas vert Small height width a
-> Full meas vert Small height width a
tallToMatrix)
      ((LowerUpperFlex lower upper Size Big Big height width a
 -> Full Size Big Big height width a)
-> ToMatrix lower upper height width a Size Big Big
forall lower upper height width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> ToMatrix lower upper height width a meas vert horiz
ToMatrix ((LowerUpperFlex lower upper Size Big Big height width a
  -> Full Size Big Big height width a)
 -> ToMatrix lower upper height width a Size Big Big)
-> (LowerUpperFlex lower upper Size Big Big height width a
    -> Full Size Big Big height width a)
-> ToMatrix lower upper height width a Size Big Big
forall a b. (a -> b) -> a -> b
$
         (LowerUpperFlex Filled Filled Size Big Small height width a
 -> Full Size Big Big height width a)
-> (LowerUpperFlex Filled Filled Size Small Big height width a
    -> Full Size Big Big height width a)
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height width a)
     (LowerUpperFlex Filled Filled Size Small Big height width a)
-> Full Size Big Big height width a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either
            (Full Size Big Small height width a
-> Full Size Big Big height width a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a -> General height width a
MatrixPriv.fromFull (Full Size Big Small height width a
 -> Full Size Big Big height width a)
-> (LowerUpperFlex Filled Filled Size Big Small height width a
    -> Full Size Big Small height width a)
-> LowerUpperFlex Filled Filled Size Big Small height width a
-> Full Size Big Big height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex Filled Filled Size Big Small height width a
-> Full Size Big Small height width a
forall meas vert height width a lower upper.
(Measure meas, C vert, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas vert Small height width a
-> Full meas vert Small height width a
tallToMatrix)
            (Full Size Small Big height width a
-> Full Size Big Big height width a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a -> General height width a
MatrixPriv.fromFull (Full Size Small Big height width a
 -> Full Size Big Big height width a)
-> (LowerUpperFlex Filled Filled Size Small Big height width a
    -> Full Size Small Big height width a)
-> LowerUpperFlex Filled Filled Size Small Big height width a
-> Full Size Big Big height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex Filled Filled Size Small Big height width a
-> Full Size Small Big height width a
forall meas horiz height width a lower upper.
(Measure meas, C horiz, C height, C width, Eq height, Eq width,
 Floating a) =>
LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
wideToMatrix) (Either
   (LowerUpperFlex Filled Filled Size Big Small height width a)
   (LowerUpperFlex Filled Filled Size Small Big height width a)
 -> Full Size Big Big height width a)
-> (LowerUpperFlex lower upper Size Big Big height width a
    -> Either
         (LowerUpperFlex Filled Filled Size Big Small height width a)
         (LowerUpperFlex Filled Filled Size Small Big height width a))
-> LowerUpperFlex lower upper Size Big Big height width a
-> Full Size Big Big height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         LowerUpperFlex lower upper Size Big Big height width a
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height width a)
     (LowerUpperFlex Filled Filled Size Small Big height width a)
forall meas vert horiz height width lower upper a.
(Measure meas, C vert, C horiz, C height, C width) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Either (Tall height width a) (Wide height width a)
caseTallWide)

newtype ToMatrix lower upper height width a meas vert horiz =
   ToMatrix {
      ToMatrix lower upper height width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
getToMatrix ::
         LowerUpperFlex lower upper meas vert horiz height width a ->
         Full meas vert horiz height width a
   }

tallToMatrix ::
   (Extent.Measure meas, Extent.C vert,
    Shape.C height, Shape.C width, Eq height, Eq width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert Extent.Small height width a ->
   Full meas vert Extent.Small height width a
tallToMatrix :: LowerUpperFlex lower upper meas vert Small height width a
-> Full meas vert Small height width a
tallToMatrix LowerUpperFlex lower upper meas vert Small height width a
a =
   Inversion
-> LowerUpperFlex lower upper meas vert Small height width a
-> Full meas vert Small height width a
-> Full meas vert Small height width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
NonInverted LowerUpperFlex lower upper meas vert Small height width a
a (Full meas vert Small height width a
 -> Full meas vert Small height width a)
-> Full meas vert Small height width a
-> Full meas vert Small height width a
forall a b. (a -> b) -> a -> b
$ Full meas Small vert width height a
-> Full meas vert Small height width a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose (Full meas Small vert width height a
 -> Full meas vert Small height width a)
-> Full meas Small vert width height a
-> Full meas vert Small height width a
forall a b. (a -> b) -> a -> b
$
   Transposition
-> LowerUpperFlex lower upper meas vert Small height width a
-> Full meas Small vert width height a
-> Full meas Small vert width height a
forall measA vertA meas vert horiz height heightA widthB a lower
       upper.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
Transposed LowerUpperFlex lower upper meas vert Small height width a
a (Full meas Small vert width height a
 -> Full meas Small vert width height a)
-> Full meas Small vert width height a
-> Full meas Small vert width height a
forall a b. (a -> b) -> a -> b
$ Full meas vert Small height width a
-> Full meas Small vert width height a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose (Full meas vert Small height width a
 -> Full meas Small vert width height a)
-> Full meas vert Small height width a
-> Full meas Small vert width height a
forall a b. (a -> b) -> a -> b
$ LowerUpperFlex lower upper meas vert Small height width a
-> Full meas vert Small height width a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractL LowerUpperFlex lower upper meas vert Small height width a
a

wideToMatrix ::
   (Extent.Measure meas, Extent.C horiz,
    Shape.C height, Shape.C width, Eq height, Eq width, Class.Floating a) =>
   LowerUpperFlex lower upper meas Extent.Small horiz height width a ->
   Full meas Extent.Small horiz height width a
wideToMatrix :: LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
wideToMatrix LowerUpperFlex lower upper meas Small horiz height width a
a =
   Inversion
-> LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
-> Full meas Small horiz height width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
NonInverted LowerUpperFlex lower upper meas Small horiz height width a
a (Full meas Small horiz height width a
 -> Full meas Small horiz height width a)
-> Full meas Small horiz height width a
-> Full meas Small horiz height width a
forall a b. (a -> b) -> a -> b
$ Transposition
-> LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
-> Full meas Small horiz height width a
forall measA horizA meas vert horiz height widthA widthB a lower
       upper.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
NonTransposed LowerUpperFlex lower upper meas Small horiz height width a
a (Full meas Small horiz height width a
 -> Full meas Small horiz height width a)
-> Full meas Small horiz height width a
-> Full meas Small horiz height width a
forall a b. (a -> b) -> a -> b
$ LowerUpperFlex lower upper meas Small horiz height width a
-> Full meas Small horiz height width a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractU LowerUpperFlex lower upper meas Small horiz height width a
a


multiplyFull ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Shape.C fuse, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height fuse a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
multiplyFull :: LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
multiplyFull LowerUpperFlex lower upper meas vert horiz height fuse a
a =
   case LowerUpperFlex lower upper meas vert horiz height fuse a
-> Extent meas vert horiz height fuse
forall typ meas vert horiz xl xu lower upper height width a.
(Box typ, Measure meas, C vert, C horiz) =>
Matrix typ xl xu lower upper meas vert horiz height width a
-> Extent meas vert horiz height width
Matrix.extent LowerUpperFlex lower upper meas vert horiz height fuse a
a of
      ExtentPriv.Square height
_ -> LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, Eq height, C width,
 C fuse, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
multiplyFullAux LowerUpperFlex lower upper meas vert horiz height fuse a
a
      ExtentPriv.Separate height
_ fuse
_ ->
         (Unchecked height -> height)
-> Full Size vert horiz (Unchecked height) width a
-> Full Size vert horiz height width a
forall vert horiz heightA heightB width a.
(C vert, C horiz) =>
(heightA -> heightB)
-> Full Size vert horiz heightA width a
-> Full Size vert horiz heightB width a
Basic.mapHeight Unchecked height -> height
forall sh. Unchecked sh -> sh
deconsUnchecked (Full Size vert horiz (Unchecked height) width a
 -> Full Size vert horiz height width a)
-> (Full Size vert horiz fuse width a
    -> Full Size vert horiz (Unchecked height) width a)
-> Full Size vert horiz fuse width a
-> Full Size vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         LowerUpperFlex
  lower upper Size vert horiz (Unchecked height) fuse a
-> Full Size vert horiz fuse width a
-> Full Size vert horiz (Unchecked height) width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, Eq height, C width,
 C fuse, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
multiplyFullAux ((height -> Unchecked height)
-> LowerUpperFlex lower upper Size vert horiz height fuse a
-> LowerUpperFlex
     lower upper Size vert horiz (Unchecked height) fuse a
forall vert horiz heightA heightB lower upper width a.
(C vert, C horiz) =>
(heightA -> heightB)
-> LowerUpperFlex lower upper Size vert horiz heightA width a
-> LowerUpperFlex lower upper Size vert horiz heightB width a
mapHeight height -> Unchecked height
forall sh. sh -> Unchecked sh
Unchecked LowerUpperFlex lower upper meas vert horiz height fuse a
LowerUpperFlex lower upper Size vert horiz height fuse a
a)

multiplyFullAux ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, Shape.C width, Shape.C fuse, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height fuse a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
multiplyFullAux :: LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
multiplyFullAux =
   MultiplyFullRight lower upper height fuse width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall lower upper height fuse width a meas vert horiz.
MultiplyFullRight lower upper height fuse width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
getMultiplyFullRight (MultiplyFullRight lower upper height fuse width a meas vert horiz
 -> LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
   MultiplyFullRight lower upper height fuse width a Shape Small Small
-> MultiplyFullRight
     lower upper height fuse width a Size Small Small
-> MultiplyFullRight lower upper height fuse width a Size Small Big
-> MultiplyFullRight lower upper height fuse width a Size Big Small
-> MultiplyFullRight lower upper height fuse width a Size Big Big
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
forall meas vert horiz (f :: * -> * -> * -> *).
(Measure meas, C vert, C horiz) =>
f Shape Small Small
-> f Size Small Small
-> f Size Small Big
-> f Size Big Small
-> f Size Big Big
-> f meas vert horiz
ExtentPriv.switchTagTriple
      {-
      We cannot simply use squareFull here,
      because this requires height~width.
      -}
      ((LowerUpperFlex lower upper Shape Small Small height fuse a
 -> Full Shape Small Small fuse width a
 -> Full Shape Small Small height width a)
-> MultiplyFullRight
     lower upper height fuse width a Shape Small Small
forall lower upper height fuse width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
MultiplyFullRight LowerUpperFlex lower upper Shape Small Small height fuse a
-> Full Shape Small Small fuse width a
-> Full Shape Small Small height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideMultiplyFullRight)
      ((LowerUpperFlex lower upper Size Small Small height fuse a
 -> Full Size Small Small fuse width a
 -> Full Size Small Small height width a)
-> MultiplyFullRight
     lower upper height fuse width a Size Small Small
forall lower upper height fuse width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
MultiplyFullRight LowerUpperFlex lower upper Size Small Small height fuse a
-> Full Size Small Small fuse width a
-> Full Size Small Small height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideMultiplyFullRight)
      ((LowerUpperFlex lower upper Size Small Big height fuse a
 -> Full Size Small Big fuse width a
 -> Full Size Small Big height width a)
-> MultiplyFullRight lower upper height fuse width a Size Small Big
forall lower upper height fuse width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
MultiplyFullRight LowerUpperFlex lower upper Size Small Big height fuse a
-> Full Size Small Big fuse width a
-> Full Size Small Big height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideMultiplyFullRight)
      ((LowerUpperFlex lower upper Size Big Small height fuse a
 -> Full Size Big Small fuse width a
 -> Full Size Big Small height width a)
-> MultiplyFullRight lower upper height fuse width a Size Big Small
forall lower upper height fuse width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
MultiplyFullRight LowerUpperFlex lower upper Size Big Small height fuse a
-> Full Size Big Small fuse width a
-> Full Size Big Small height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
tallMultiplyFullRight)
      ((LowerUpperFlex lower upper Size Big Big height fuse a
 -> Full Size Big Big fuse width a
 -> Full Size Big Big height width a)
-> MultiplyFullRight lower upper height fuse width a Size Big Big
forall lower upper height fuse width a meas vert horiz.
(LowerUpperFlex lower upper meas vert horiz height fuse a
 -> Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> MultiplyFullRight
     lower upper height fuse width a meas vert horiz
MultiplyFullRight ((LowerUpperFlex lower upper Size Big Big height fuse a
  -> Full Size Big Big fuse width a
  -> Full Size Big Big height width a)
 -> MultiplyFullRight lower upper height fuse width a Size Big Big)
-> (LowerUpperFlex lower upper Size Big Big height fuse a
    -> Full Size Big Big fuse width a
    -> Full Size Big Big height width a)
-> MultiplyFullRight lower upper height fuse width a Size Big Big
forall a b. (a -> b) -> a -> b
$
         (LowerUpperFlex Filled Filled Size Big Small height fuse a
 -> Full Size Big Big fuse width a
 -> Full Size Big Big height width a)
-> (LowerUpperFlex Filled Filled Size Small Big height fuse a
    -> Full Size Big Big fuse width a
    -> Full Size Big Big height width a)
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height fuse a)
     (LowerUpperFlex Filled Filled Size Small Big height fuse a)
-> Full Size Big Big fuse width a
-> Full Size Big Big height width a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either LowerUpperFlex Filled Filled Size Big Small height fuse a
-> Full Size Big Big fuse width a
-> Full Size Big Big height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
tallMultiplyFullRight LowerUpperFlex Filled Filled Size Small Big height fuse a
-> Full Size Big Big fuse width a
-> Full Size Big Big height width a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideMultiplyFullRight (Either
   (LowerUpperFlex Filled Filled Size Big Small height fuse a)
   (LowerUpperFlex Filled Filled Size Small Big height fuse a)
 -> Full Size Big Big fuse width a
 -> Full Size Big Big height width a)
-> (LowerUpperFlex lower upper Size Big Big height fuse a
    -> Either
         (LowerUpperFlex Filled Filled Size Big Small height fuse a)
         (LowerUpperFlex Filled Filled Size Small Big height fuse a))
-> LowerUpperFlex lower upper Size Big Big height fuse a
-> Full Size Big Big fuse width a
-> Full Size Big Big height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper Size Big Big height fuse a
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height fuse a)
     (LowerUpperFlex Filled Filled Size Small Big height fuse a)
forall meas vert horiz height width lower upper a.
(Measure meas, C vert, C horiz, C height, C width) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Either (Tall height width a) (Wide height width a)
caseTallWide)

newtype MultiplyFullRight lower upper height fuse width a meas vert horiz =
   MultiplyFullRight {
      MultiplyFullRight lower upper height fuse width a meas vert horiz
-> LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
getMultiplyFullRight ::
         LowerUpperFlex lower upper meas vert horiz height fuse a ->
         Full meas vert horiz fuse width a ->
         Full meas vert horiz height width a
   }

tallMultiplyFullRight ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Shape.C fuse, Eq height, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas vert Extent.Small height fuse a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
tallMultiplyFullRight :: LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
tallMultiplyFullRight LowerUpperFlex lower upper meas vert Small height fuse a
a =
   Inversion
-> LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
NonInverted LowerUpperFlex lower upper meas vert Small height fuse a
a (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall meas vert horiz height fuse width a.
(Measure meas, C vert, C horiz, C height, C fuse, Eq fuse, C width,
 Floating a) =>
Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
Basic.multiply (Full meas vert Small height fuse a
-> Full meas vert horiz height fuse a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert Small height width a
-> Full meas vert horiz height width a
MatrixPriv.weakenTall (LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert Small height fuse a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractL LowerUpperFlex lower upper meas vert Small height fuse a
a)) (Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz fuse width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Transposition
-> LowerUpperFlex lower upper meas vert Small height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz fuse width a
forall measA vertA meas vert horiz height heightA widthB a lower
       upper.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
NonTransposed LowerUpperFlex lower upper meas vert Small height fuse a
a

wideMultiplyFullRight ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Shape.C fuse, Eq height, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas Extent.Small horiz height fuse a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
wideMultiplyFullRight :: LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideMultiplyFullRight LowerUpperFlex lower upper meas Small horiz height fuse a
a =
   Inversion
-> LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
NonInverted LowerUpperFlex lower upper meas Small horiz height fuse a
a (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Transposition
-> LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA horizA meas vert horiz height widthA widthB a lower
       upper.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
NonTransposed LowerUpperFlex lower upper meas Small horiz height fuse a
a (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall meas vert horiz height fuse width a.
(Measure meas, C vert, C horiz, C height, C fuse, Eq fuse, C width,
 Floating a) =>
Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
Basic.multiply (Full meas Small horiz height fuse a
-> Full meas vert horiz height fuse a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas Small horiz height width a
-> Full meas vert horiz height width a
MatrixPriv.weakenWide (LowerUpperFlex lower upper meas Small horiz height fuse a
-> Full meas Small horiz height fuse a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractU LowerUpperFlex lower upper meas Small horiz height fuse a
a))


transMultiplyVector ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width,
    Eq height, Eq width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Vector height a -> Vector width a
transMultiplyVector :: LowerUpperFlex lower upper meas vert horiz height width a
-> Vector height a -> Vector width a
transMultiplyVector =
   Order
-> (General height () a -> General width () a)
-> Vector height a
-> Vector width a
forall height0 a height1 b.
Order
-> (General height0 () a -> General height1 () b)
-> Vector height0 a
-> Vector height1 b
Basic.unliftColumn Order
Layout.ColumnMajor ((General height () a -> General width () a)
 -> Vector height a -> Vector width a)
-> (LowerUpperFlex lower upper meas vert horiz height width a
    -> General height () a -> General width () a)
-> LowerUpperFlex lower upper meas vert horiz height width a
-> Vector height a
-> Vector width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   (LowerUpperFlex Filled Filled Size Big Small height width a
 -> General height () a -> General width () a)
-> (LowerUpperFlex Filled Filled Size Small Big height width a
    -> General height () a -> General width () a)
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height width a)
     (LowerUpperFlex Filled Filled Size Small Big height width a)
-> General height () a
-> General width () a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either LowerUpperFlex Filled Filled Size Big Small height width a
-> General height () a -> General width () a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas horiz Small fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
tallTransMultiplyFullRight LowerUpperFlex Filled Filled Size Small Big height width a
-> General height () a -> General width () a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse,
 Eq height, Eq fuse, Floating a) =>
LowerUpperFlex lower upper meas Small vert fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideTransMultiplyFullRight (Either
   (LowerUpperFlex Filled Filled Size Big Small height width a)
   (LowerUpperFlex Filled Filled Size Small Big height width a)
 -> General height () a -> General width () a)
-> (LowerUpperFlex lower upper meas vert horiz height width a
    -> Either
         (LowerUpperFlex Filled Filled Size Big Small height width a)
         (LowerUpperFlex Filled Filled Size Small Big height width a))
-> LowerUpperFlex lower upper meas vert horiz height width a
-> General height () a
-> General width () a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowerUpperFlex lower upper meas vert horiz height width a
-> Either
     (LowerUpperFlex Filled Filled Size Big Small height width a)
     (LowerUpperFlex Filled Filled Size Small Big height width a)
forall meas vert horiz height width lower upper a.
(Measure meas, C vert, C horiz, C height, C width) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Either (Tall height width a) (Wide height width a)
caseTallWide

tallTransMultiplyFullRight ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Shape.C fuse, Eq height, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas horiz Extent.Small fuse height a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
tallTransMultiplyFullRight :: LowerUpperFlex lower upper meas horiz Small fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
tallTransMultiplyFullRight LowerUpperFlex lower upper meas horiz Small fuse height a
a =
   Transposition
-> LowerUpperFlex lower upper meas horiz Small fuse height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA vertA meas vert horiz height heightA widthB a lower
       upper.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
Transposed LowerUpperFlex lower upper meas horiz Small fuse height a
a (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall meas vert horiz height fuse width a.
(Measure meas, C vert, C horiz, C height, C fuse, Eq fuse, C width,
 Floating a) =>
Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
Basic.multiply (Full meas horiz vert fuse height a
-> Full meas vert horiz height fuse a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose (Full meas horiz vert fuse height a
 -> Full meas vert horiz height fuse a)
-> Full meas horiz vert fuse height a
-> Full meas vert horiz height fuse a
forall a b. (a -> b) -> a -> b
$ Full meas horiz Small fuse height a
-> Full meas horiz vert fuse height a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert Small height width a
-> Full meas vert horiz height width a
MatrixPriv.weakenTall (Full meas horiz Small fuse height a
 -> Full meas horiz vert fuse height a)
-> Full meas horiz Small fuse height a
-> Full meas horiz vert fuse height a
forall a b. (a -> b) -> a -> b
$ LowerUpperFlex lower upper meas horiz Small fuse height a
-> Full meas horiz Small fuse height a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractL LowerUpperFlex lower upper meas horiz Small fuse height a
a) (Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz fuse width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Inversion
-> LowerUpperFlex lower upper meas horiz Small fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz fuse width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
Inverted LowerUpperFlex lower upper meas horiz Small fuse height a
a

wideTransMultiplyFullRight ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Shape.C fuse, Eq height, Eq fuse,
    Class.Floating a) =>
   LowerUpperFlex lower upper meas Extent.Small vert fuse height a ->
   Full meas vert horiz fuse width a ->
   Full meas vert horiz height width a
wideTransMultiplyFullRight :: LowerUpperFlex lower upper meas Small vert fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
wideTransMultiplyFullRight LowerUpperFlex lower upper meas Small vert fuse height a
a =
   Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall meas vert horiz height fuse width a.
(Measure meas, C vert, C horiz, C height, C fuse, Eq fuse, C width,
 Floating a) =>
Full meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
Basic.multiply (Full meas horiz vert fuse height a
-> Full meas vert horiz height fuse a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose (Full meas horiz vert fuse height a
 -> Full meas vert horiz height fuse a)
-> Full meas horiz vert fuse height a
-> Full meas vert horiz height fuse a
forall a b. (a -> b) -> a -> b
$ Full meas Small vert fuse height a
-> Full meas horiz vert fuse height a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas Small horiz height width a
-> Full meas vert horiz height width a
MatrixPriv.weakenWide (Full meas Small vert fuse height a
 -> Full meas horiz vert fuse height a)
-> Full meas Small vert fuse height a
-> Full meas horiz vert fuse height a
forall a b. (a -> b) -> a -> b
$ LowerUpperFlex lower upper meas Small vert fuse height a
-> Full meas Small vert fuse height a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
extractU LowerUpperFlex lower upper meas Small vert fuse height a
a) (Full meas vert horiz fuse width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz fuse width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Transposition
-> LowerUpperFlex lower upper meas Small vert fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz fuse width a
forall measA horizA meas vert horiz height widthA widthB a lower
       upper.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
Transposed LowerUpperFlex lower upper meas Small vert fuse height a
a (Full meas vert horiz fuse width a
 -> Full meas vert horiz fuse width a)
-> (Full meas vert horiz fuse width a
    -> Full meas vert horiz fuse width a)
-> Full meas vert horiz fuse width a
-> Full meas vert horiz fuse width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Inversion
-> LowerUpperFlex lower upper meas Small vert fuse height a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz fuse width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
Inverted LowerUpperFlex lower upper meas Small vert fuse height a
a


caseTallWide ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   Either (Tall height width a) (Wide height width a)
caseTallWide :: LowerUpperFlex lower upper meas vert horiz height width a
-> Either (Tall height width a) (Wide height width a)
caseTallWide (LowerUpper ipiv (Array shape a)) =
   let consLU :: Array (Banded U0 U0 meas vert horiz height width) (Element height)
-> ForeignPtr a
-> Split Triangle meas vert horiz height width
-> LowerUpperFlex lower upper meas vert horiz height width a
consLU Array (Banded U0 U0 meas vert horiz height width) (Element height)
ipivb ForeignPtr a
b Split Triangle meas vert horiz height width
newShape =
         RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper
            ((Banded U0 U0 meas vert horiz height width
 -> Banded U0 U0 meas vert horiz height width)
-> Array
     (Banded U0 U0 meas vert horiz height width) (Element height)
-> RectangularDiagonal
     meas vert horiz height width (Element height)
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape
               (\Banded U0 U0 meas vert horiz height width
bandShape ->
                  Banded U0 U0 meas vert horiz height width
bandShape{bandedExtent :: Extent meas vert horiz height width
Layout.bandedExtent = Split Triangle meas vert horiz height width
-> Extent meas vert horiz height width
forall lower meas vert horiz height width.
Split lower meas vert horiz height width
-> Extent meas vert horiz height width
Layout.splitExtent Split Triangle meas vert horiz height width
newShape})
               Array (Banded U0 U0 meas vert horiz height width) (Element height)
ipivb)
            (Split Triangle meas vert horiz height width
-> ForeignPtr a -> SplitArray meas vert horiz height width a
forall sh a. sh -> ForeignPtr a -> Array sh a
Array Split Triangle meas vert horiz height width
newShape ForeignPtr a
b)
   in (Split Triangle Size Big Small height width
 -> Either (Tall height width a) (Wide height width a))
-> (Split Triangle Size Small Big height width
    -> Either (Tall height width a) (Wide height width a))
-> Either
     (Split Triangle Size Big Small height width)
     (Split Triangle Size Small Big height width)
-> Either (Tall height width a) (Wide height width a)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Tall height width a
-> Either (Tall height width a) (Wide height width a)
forall a b. a -> Either a b
Left (Tall height width a
 -> Either (Tall height width a) (Wide height width a))
-> (Split Triangle Size Big Small height width
    -> Tall height width a)
-> Split Triangle Size Big Small height width
-> Either (Tall height width a) (Wide height width a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array (Banded U0 U0 meas vert horiz height width) (Element height)
-> ForeignPtr a
-> Split Triangle Size Big Small height width
-> Tall height width a
forall meas vert horiz height width height a meas vert horiz width
       lower upper.
Array (Banded U0 U0 meas vert horiz height width) (Element height)
-> ForeignPtr a
-> Split Triangle meas vert horiz height width
-> LowerUpperFlex lower upper meas vert horiz height width a
consLU Array (Banded U0 U0 meas vert horiz height width) (Element height)
ipiv ForeignPtr a
a) (Wide height width a
-> Either (Tall height width a) (Wide height width a)
forall a b. b -> Either a b
Right (Wide height width a
 -> Either (Tall height width a) (Wide height width a))
-> (Split Triangle Size Small Big height width
    -> Wide height width a)
-> Split Triangle Size Small Big height width
-> Either (Tall height width a) (Wide height width a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array (Banded U0 U0 meas vert horiz height width) (Element height)
-> ForeignPtr a
-> Split Triangle Size Small Big height width
-> Wide height width a
forall meas vert horiz height width height a meas vert horiz width
       lower upper.
Array (Banded U0 U0 meas vert horiz height width) (Element height)
-> ForeignPtr a
-> Split Triangle meas vert horiz height width
-> LowerUpperFlex lower upper meas vert horiz height width a
consLU Array (Banded U0 U0 meas vert horiz height width) (Element height)
ipiv ForeignPtr a
a) (Either
   (Split Triangle Size Big Small height width)
   (Split Triangle Size Small Big height width)
 -> Either (Tall height width a) (Wide height width a))
-> Either
     (Split Triangle Size Big Small height width)
     (Split Triangle Size Small Big height width)
-> Either (Tall height width a) (Wide height width a)
forall a b. (a -> b) -> a -> b
$
      Split Triangle meas vert horiz height width
-> Either
     (Split Triangle Size Big Small height width)
     (Split Triangle Size Small Big height width)
forall meas vert horiz height width lower.
(Measure meas, C vert, C horiz, C height, C width) =>
Split lower meas vert horiz height width
-> Either
     (Split lower Size Big Small height width)
     (Split lower Size Small Big height width)
Layout.caseTallWideSplit Split Triangle meas vert horiz height width
shape


_toRowMajor ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Eq height, Shape.C height, Shape.C width, Class.Floating a) =>
   LowerUpperFlex lower upper meas vert horiz height width a ->
   LowerUpperFlex lower upper meas vert horiz height width a
_toRowMajor :: LowerUpperFlex lower upper meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
_toRowMajor
   (LowerUpper ipiv
      arr@(Array (Layout.Split Layout.Triangle order extent) a)) =
   RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper RectangularDiagonal meas vert horiz height width (Element height)
ipiv (SplitArray meas vert horiz height width a
 -> LowerUpperFlex lower upper meas vert horiz height width a)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
   case Order
order of
      Order
RowMajor -> SplitArray meas vert horiz height width a
arr
      Order
ColumnMajor ->
         Split Triangle meas vert horiz height width
-> (Ptr a -> IO ()) -> SplitArray meas vert horiz height width a
forall sh a.
(C sh, Storable a) =>
sh -> (Ptr a -> IO ()) -> Array sh a
Array.unsafeCreate
            (Triangle
-> Order
-> Extent meas vert horiz height width
-> Split Triangle meas vert horiz height width
forall lower meas vert horiz height width.
lower
-> Order
-> Extent meas vert horiz height width
-> Split lower meas vert horiz height width
Layout.Split Triangle
Layout.Triangle Order
RowMajor Extent meas vert horiz height width
extent) ((Ptr a -> IO ()) -> SplitArray meas vert horiz height width a)
-> (Ptr a -> IO ()) -> SplitArray meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ \Ptr a
bPtr ->
         ForeignPtr a -> (Ptr a -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a ((Ptr a -> IO ()) -> IO ()) -> (Ptr a -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr a
aPtr -> do
            let (height
height, width
width) = Extent meas vert horiz height width -> (height, width)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> (height, width)
Extent.dimensions Extent meas vert horiz height width
extent
            let n :: Int
n = width -> Int
forall sh. C sh => sh -> Int
Shape.size width
width
            let m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
height
            Int -> Int -> Ptr a -> Int -> Ptr a -> IO ()
forall a.
Floating a =>
Int -> Int -> Ptr a -> Int -> Ptr a -> IO ()
copyTransposed Int
n Int
m Ptr a
aPtr Int
n Ptr a
bPtr


instance Matrix.Box LU where
   extent :: Matrix LU xl xu lower upper meas vert horiz height width a
-> Extent meas vert horiz height width
extent = Split Triangle meas vert horiz height width
-> Extent meas vert horiz height width
forall lower meas vert horiz height width.
Split lower meas vert horiz height width
-> Extent meas vert horiz height width
Layout.splitExtent (Split Triangle meas vert horiz height width
 -> Extent meas vert horiz height width)
-> (Matrix LU xl xu lower upper meas vert horiz height width a
    -> Split Triangle meas vert horiz height width)
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> Extent meas vert horiz height width
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array (Split Triangle meas vert horiz height width) a
-> Split Triangle meas vert horiz height width
forall sh a. Array sh a -> sh
Array.shape (Array (Split Triangle meas vert horiz height width) a
 -> Split Triangle meas vert horiz height width)
-> (Matrix LU xl xu lower upper meas vert horiz height width a
    -> Array (Split Triangle meas vert horiz height width) a)
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> Split Triangle meas vert horiz height width
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix LU xl xu lower upper meas vert horiz height width a
-> Array (Split Triangle meas vert horiz height width) a
forall xl xu lower upper meas vert horiz height width a.
Matrix LU xl xu lower upper meas vert horiz height width a
-> SplitArray meas vert horiz height width a
split_

instance Matrix.ToQuadratic LU where
   heightToQuadratic :: QuadraticMeas LU xl xu lower upper meas height width a
-> Quadratic LU xl xu lower upper height a
heightToQuadratic (LowerUpper pivot split) =
      RectangularDiagonal
  Shape Small Small height height (Element height)
-> SplitArray Shape Small Small height height a
-> LowerUpperFlex lower upper Shape Small Small height height a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper
         ((Banded U0 U0 meas Small Small height width -> Diagonal height)
-> Array
     (Banded U0 U0 meas Small Small height width) (Element height)
-> RectangularDiagonal
     Shape Small Small height height (Element height)
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape (height -> Diagonal height
forall sh. sh -> Diagonal sh
layoutPivotSquare (height -> Diagonal height)
-> (Banded U0 U0 meas Small Small height width -> height)
-> Banded U0 U0 meas Small Small height width
-> Diagonal height
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Banded U0 U0 meas Small Small height width -> height
forall meas vert horiz sub super height width.
(Measure meas, C vert, C horiz) =>
Banded sub super meas vert horiz height width -> height
Layout.bandedHeight) Array (Banded U0 U0 meas Small Small height width) (Element height)
pivot)
         (Split Triangle meas Small Small height width a
-> SplitArray Shape Small Small height height a
forall meas lower height width a.
Measure meas =>
Split lower meas Small Small height width a
-> Square lower height a
Split.heightToQuadratic Split Triangle meas Small Small height width a
split)
   widthToQuadratic :: QuadraticMeas LU xl xu lower upper meas height width a
-> Quadratic LU xl xu lower upper width a
widthToQuadratic (LowerUpper pivot split) =
      RectangularDiagonal Shape Small Small width width (Element width)
-> SplitArray Shape Small Small width width a
-> LowerUpperFlex lower upper Shape Small Small width width a
forall meas vert horiz height width a lower upper.
RectangularDiagonal meas vert horiz height width (Element height)
-> SplitArray meas vert horiz height width a
-> LowerUpperFlex lower upper meas vert horiz height width a
LowerUpper
         ((height -> width)
-> Vector (Diagonal width) (Element height)
-> RectangularDiagonal
     Shape Small Small width width (Element width)
forall sh0 sh1 shape.
(sh0 -> sh1)
-> Vector shape (Element sh0) -> Vector shape (Element sh1)
mapPivotHeight (width -> height -> width
forall a b. a -> b -> a
const (width -> height -> width) -> width -> height -> width
forall a b. (a -> b) -> a -> b
$ Banded U0 U0 meas Small Small height width -> width
forall meas vert horiz sub super height width.
(Measure meas, C vert, C horiz) =>
Banded sub super meas vert horiz height width -> width
Layout.bandedWidth (Banded U0 U0 meas Small Small height width -> width)
-> Banded U0 U0 meas Small Small height width -> width
forall a b. (a -> b) -> a -> b
$ Array (Banded U0 U0 meas Small Small height width) (Element height)
-> Banded U0 U0 meas Small Small height width
forall sh a. Array sh a -> sh
Array.shape Array (Banded U0 U0 meas Small Small height width) (Element height)
pivot) (Vector (Diagonal width) (Element height)
 -> RectangularDiagonal
      Shape Small Small width width (Element width))
-> Vector (Diagonal width) (Element height)
-> RectangularDiagonal
     Shape Small Small width width (Element width)
forall a b. (a -> b) -> a -> b
$
          (Banded U0 U0 meas Small Small height width -> Diagonal width)
-> Array
     (Banded U0 U0 meas Small Small height width) (Element height)
-> Vector (Diagonal width) (Element height)
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape (width -> Diagonal width
forall sh. sh -> Diagonal sh
layoutPivotSquare (width -> Diagonal width)
-> (Banded U0 U0 meas Small Small height width -> width)
-> Banded U0 U0 meas Small Small height width
-> Diagonal width
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Banded U0 U0 meas Small Small height width -> width
forall meas vert horiz sub super height width.
(Measure meas, C vert, C horiz) =>
Banded sub super meas vert horiz height width -> width
Layout.bandedWidth) Array (Banded U0 U0 meas Small Small height width) (Element height)
pivot)
         (Split Triangle meas Small Small height width a
-> SplitArray Shape Small Small width width a
forall meas lower height width a.
Measure meas =>
Split lower meas Small Small height width a -> Square lower width a
Split.widthToQuadratic Split Triangle meas Small Small height width a
split)

layoutPivotSquare :: sh -> Layout.Diagonal sh
layoutPivotSquare :: sh -> Diagonal sh
layoutPivotSquare = Order -> sh -> Diagonal sh
forall size. Order -> size -> Diagonal size
LayoutPub.diagonal Order
Layout.ColumnMajor

instance (xl ~ (), xu ~ ()) => Matrix.MapExtent LU xl xu lower upper where
   mapExtent :: Map measA vertA horizA measB vertB horizB height width
-> Matrix LU xl xu lower upper measA vertA horizA height width a
-> Matrix LU xl xu lower upper measB vertB horizB height width a
mapExtent = Map measA vertA horizA measB vertB horizB height width
-> Matrix LU xl xu lower upper measA vertA horizA height width a
-> Matrix LU xl xu lower upper measB vertB horizB height width a
forall vertA horizA vertB horizB measA measB height width lower
       upper a.
(C vertA, C horizA, C vertB, C horizB) =>
Map measA vertA horizA measB vertB horizB height width
-> LowerUpperFlex lower upper measA vertA horizA height width a
-> LowerUpperFlex lower upper measB vertB horizB height width a
mapExtent

instance (xl ~ (), xu ~ ()) => Multiply.MultiplyVector LU xl xu where
   matrixVector :: Matrix LU xl xu lower upper meas vert horiz height width a
-> Vector width a -> Vector height a
matrixVector Matrix LU xl xu lower upper meas vert horiz height width a
lu =
      Order
-> (General width () a -> General height () a)
-> Vector width a
-> Vector height a
forall height0 a height1 b.
Order
-> (General height0 () a -> General height1 () b)
-> Vector height0 a
-> Vector height1 b
Basic.unliftColumn Order
Layout.ColumnMajor
         (LowerUpperFlex lower upper Size Big Big height width a
-> General width () a -> General height () a
forall meas vert horiz height width fuse a lower upper.
(Measure meas, C vert, C horiz, C height, C width, C fuse, Eq fuse,
 Floating a) =>
LowerUpperFlex lower upper meas vert horiz height fuse a
-> Full meas vert horiz fuse width a
-> Full meas vert horiz height width a
multiplyFull (Map meas vert horiz Size Big Big height width
-> LowerUpperFlex lower upper meas vert horiz height width a
-> LowerUpperFlex lower upper Size Big Big height width a
forall vertA horizA vertB horizB measA measB height width lower
       upper a.
(C vertA, C horizA, C vertB, C horizB) =>
Map measA vertA horizA measB vertB horizB height width
-> LowerUpperFlex lower upper measA vertA horizA height width a
-> LowerUpperFlex lower upper measB vertB horizB height width a
mapExtent Map meas vert horiz Size Big Big height width
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Map meas vert horiz Size Big Big height width
Extent.toGeneral Matrix LU xl xu lower upper meas vert horiz height width a
LowerUpperFlex lower upper meas vert horiz height width a
lu))
   vectorMatrix :: Vector height a
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> Vector width a
vectorMatrix = (Matrix LU xl xu lower upper meas vert horiz height width a
 -> Vector height a -> Vector width a)
-> Vector height a
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> Vector width a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Matrix LU xl xu lower upper meas vert horiz height width a
  -> Vector height a -> Vector width a)
 -> Vector height a
 -> Matrix LU xl xu lower upper meas vert horiz height width a
 -> Vector width a)
-> (Matrix LU xl xu lower upper meas vert horiz height width a
    -> Vector height a -> Vector width a)
-> Vector height a
-> Matrix LU xl xu lower upper meas vert horiz height width a
-> Vector width a
forall a b. (a -> b) -> a -> b
$ \Matrix LU xl xu lower upper meas vert horiz height width a
lu ->
      case Matrix LU xl xu lower upper meas vert horiz height width a
-> Extent meas vert horiz height width
forall typ meas vert horiz xl xu lower upper height width a.
(Box typ, Measure meas, C vert, C horiz) =>
Matrix typ xl xu lower upper meas vert horiz height width a
-> Extent meas vert horiz height width
Matrix.extent Matrix LU xl xu lower upper meas vert horiz height width a
lu of
         ExtentPriv.Square height
_ -> LowerUpperFlex lower upper meas vert horiz height width a
-> Vector height a -> Vector width a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Eq height,
 Eq width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Vector height a -> Vector width a
transMultiplyVector Matrix LU xl xu lower upper meas vert horiz height width a
LowerUpperFlex lower upper meas vert horiz height width a
lu
         ExtentPriv.Separate height
_ width
_ ->
            (Unchecked width -> width)
-> Array (Unchecked width) a -> Vector width a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Unchecked width -> width
forall sh. Unchecked sh -> sh
deconsUnchecked (Array (Unchecked width) a -> Vector width a)
-> (Vector height a -> Array (Unchecked width) a)
-> Vector height a
-> Vector width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            LowerUpperFlex
  lower upper Size vert horiz height (Unchecked width) a
-> Vector height a -> Array (Unchecked width) a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, C height, C width, Eq height,
 Eq width, Floating a) =>
LowerUpperFlex lower upper meas vert horiz height width a
-> Vector height a -> Vector width a
transMultiplyVector ((width -> Unchecked width)
-> LowerUpperFlex lower upper Size vert horiz height width a
-> LowerUpperFlex
     lower upper Size vert horiz height (Unchecked width) a
forall vert horiz widthA widthB lower upper height a.
(C vert, C horiz) =>
(widthA -> widthB)
-> LowerUpperFlex lower upper Size vert horiz height widthA a
-> LowerUpperFlex lower upper Size vert horiz height widthB a
mapWidth width -> Unchecked width
forall sh. sh -> Unchecked sh
Unchecked Matrix LU xl xu lower upper meas vert horiz height width a
LowerUpperFlex lower upper Size vert horiz height width a
lu)

instance (xl ~ (), xu ~ ()) => Multiply.MultiplySquare LU xl xu where
   squareFull :: Quadratic LU xl xu lower upper height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
squareFull Quadratic LU xl xu lower upper height a
lu =
      (PlainArray
   Unpacked Arbitrary Filled Filled meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      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.lift1 ((PlainArray
    Unpacked Arbitrary Filled Filled meas vert horiz height width a
  -> PlainArray
       Unpacked Arbitrary Filled Filled meas vert horiz height width a)
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a
    -> PlainArray
         Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
         Inversion
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
NonInverted Quadratic LU xl xu lower upper height a
LowerUpperFlex lower upper Shape Small Small height height a
lu (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz height width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA horizA meas vert horiz height widthA widthB a lower
       upper.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
NonTransposed Quadratic LU xl xu lower upper height a
LowerUpperFlex lower upper Shape Small Small height height a
lu (Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz height width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall measA vertA meas vert horiz height heightA widthB a lower
       upper.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
NonTransposed Quadratic LU xl xu lower upper height a
LowerUpperFlex lower upper Shape Small Small height height a
lu

   fullSquare :: Full meas vert horiz height width a
-> Quadratic LU xl xu lower upper width a
-> Full meas vert horiz height width a
fullSquare = (LowerUpperFlex lower upper Shape Small Small width width a
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> Full meas vert horiz height width a
-> LowerUpperFlex lower upper Shape Small Small width width a
-> Full meas vert horiz height width a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((LowerUpperFlex lower upper Shape Small Small width width a
  -> Full meas vert horiz height width a
  -> Full meas vert horiz height width a)
 -> Full meas vert horiz height width a
 -> LowerUpperFlex lower upper Shape Small Small width width a
 -> Full meas vert horiz height width a)
-> (LowerUpperFlex lower upper Shape Small Small width width a
    -> Full meas vert horiz height width a
    -> Full meas vert horiz height width a)
-> Full meas vert horiz height width a
-> LowerUpperFlex lower upper Shape Small Small width width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ \LowerUpperFlex lower upper Shape Small Small width width a
lu ->
      (PlainArray
   Unpacked Arbitrary Filled Filled meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      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.lift1 ((PlainArray
    Unpacked Arbitrary Filled Filled meas vert horiz height width a
  -> PlainArray
       Unpacked Arbitrary Filled Filled meas vert horiz height width a)
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a
    -> PlainArray
         Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
         Full meas horiz vert width height a
-> Full meas vert horiz height width a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose (Full meas horiz vert width height a
 -> Full meas vert horiz height width a)
-> (Full meas vert horiz height width a
    -> Full meas horiz vert width height a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Transposition
-> LowerUpperFlex lower upper Shape Small Small width width a
-> Full meas horiz vert width height a
-> Full meas horiz vert width height a
forall measA vertA meas vert horiz height heightA widthB a lower
       upper.
(Measure measA, C vertA, Measure meas, C vert, C horiz, C height,
 Eq height, C heightA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
tallMultiplyU Transposition
Transposed LowerUpperFlex lower upper Shape Small Small width width a
lu (Full meas horiz vert width height a
 -> Full meas horiz vert width height a)
-> (Full meas vert horiz height width a
    -> Full meas horiz vert width height a)
-> Full meas vert horiz height width a
-> Full meas horiz vert width height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Transposition
-> LowerUpperFlex lower upper Shape Small Small width width a
-> Full meas horiz vert width height a
-> Full meas horiz vert width height a
forall measA horizA meas vert horiz height widthA widthB a lower
       upper.
(Measure measA, C horizA, Measure meas, C vert, C horiz, C height,
 Eq height, C widthA, C widthB, Floating a) =>
Transposition
-> LowerUpperFlex lower upper measA Small horizA height widthA a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
wideMultiplyL Transposition
Transposed LowerUpperFlex lower upper Shape Small Small width width a
lu (Full meas horiz vert width height a
 -> Full meas horiz vert width height a)
-> (Full meas vert horiz height width a
    -> Full meas horiz vert width height a)
-> Full meas vert horiz height width a
-> Full meas horiz vert width height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Inversion
-> LowerUpperFlex lower upper Shape Small Small width width a
-> Full meas horiz vert width height a
-> Full meas horiz vert width height a
forall measA vertA horizA measB vertB horizB height widthA widthB a
       lower upper.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, Eq height, C height, C widthA, C widthB, Floating a) =>
Inversion
-> LowerUpperFlex lower upper measA vertA horizA height widthA a
-> Full measB vertB horizB height widthB a
-> Full measB vertB horizB height widthB a
multiplyP Inversion
Inverted LowerUpperFlex lower upper Shape Small Small width width a
lu (Full meas horiz vert width height a
 -> Full meas horiz vert width height a)
-> (Full meas vert horiz height width a
    -> Full meas horiz vert width height a)
-> Full meas vert horiz height width a
-> Full meas horiz vert width height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
         Full meas vert horiz height width a
-> Full meas horiz vert width height a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas horiz vert width height a
Basic.transpose

instance (xl ~ (), xu ~ ()) => Divide.Determinant LU xl xu where
   determinant :: Quadratic LU xl xu lower upper sh a -> a
determinant = Quadratic LU xl xu lower upper sh a -> a
forall meas height width a lower upper.
(Measure meas, C height, C width, Floating a) =>
LowerUpperFlex lower upper meas Small Small height width a -> a
determinant

instance (xl ~ (), xu ~ ()) => Divide.Solve LU xl xu where
   solve :: Transposition
-> Quadratic LU xl xu lower upper height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solve Transposition
trans = (Array (Full meas vert horiz height width) a
 -> Array (Full meas vert horiz height width) a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      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.lift1 ((Array (Full meas vert horiz height width) a
  -> Array (Full meas vert horiz height width) a)
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (LowerUpperFlex lower upper Shape Small Small height height a
    -> Array (Full meas vert horiz height width) a
    -> Array (Full meas vert horiz height width) a)
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Array (Full meas vert horiz height width) a
-> Array (Full meas vert horiz height width) a
forall meas vert horiz height width a lower upper.
(Measure meas, C vert, C horiz, Eq height, C height, C width,
 Floating a) =>
Transposition
-> LowerUpperFlex lower upper Shape Small Small height height a
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
solveTrans Transposition
trans