{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Split where

import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import qualified Numeric.LAPACK.Matrix.Mosaic.Private as Mos
import qualified Numeric.LAPACK.Matrix.Triangular.Basic as Tri
import qualified Numeric.LAPACK.Matrix.Private as Matrix
import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent
import qualified Numeric.LAPACK.Private as Private
import Numeric.LAPACK.Matrix.Mosaic.Private (diagonalPointers)
import Numeric.LAPACK.Matrix.Triangular.Basic (Lower, Upper)
import Numeric.LAPACK.Matrix.Layout.Private
         (Order(RowMajor, ColumnMajor), transposeFromOrder,
          swapOnRowMajor, sideSwapFromOrder,
          Triangle, uploFromOrder, flipOrder)
import Numeric.LAPACK.Matrix.Extent.Private (Extent)
import Numeric.BLAS.Matrix.Modifier
         (Transposition, transposeOrder,
          Conjugation(NonConjugated, Conjugated))
import Numeric.LAPACK.Matrix.Private (Full)
import Numeric.LAPACK.Linear.Private (solver, withInfo)
import Numeric.LAPACK.Scalar (zero, one)
import Numeric.LAPACK.Shape.Private (Unchecked(Unchecked))
import Numeric.LAPACK.Private (copyBlock, conjugateToTemp)

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 as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Storable.Unchecked (Array(Array))

import System.IO.Unsafe (unsafePerformIO)

import Foreign.C.Types (CInt, CChar)
import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
import Foreign.Ptr (Ptr)
import Foreign.Storable (poke)

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


type Split lower meas vert horiz height width =
      Array (Layout.Split lower meas vert horiz height width)

type Square lower sh = Split lower Extent.Shape Extent.Small Extent.Small sh sh


mapExtent ::
   (Extent.Measure measA, Extent.C vertA, Extent.C horizA) =>
   (Extent.Measure measB, Extent.C vertB, Extent.C horizB) =>
   Extent.Map measA vertA horizA measB vertB horizB height width ->
   Split lower measA vertA horizA height width a ->
   Split lower measB vertB horizB height width a
mapExtent :: forall measA vertA horizA measB vertB horizB height width lower a.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB) =>
Map measA vertA horizA measB vertB horizB height width
-> Split lower measA vertA horizA height width a
-> Split lower measB vertB horizB height width a
mapExtent = (Split lower measA vertA horizA height width
 -> Split lower measB vertB horizB height width)
-> Array (Split lower measA vertA horizA height width) a
-> Array (Split lower measB vertB horizB height width) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((Split lower measA vertA horizA height width
  -> Split lower measB vertB horizB height width)
 -> Array (Split lower measA vertA horizA height width) a
 -> Array (Split lower measB vertB horizB height width) a)
-> (Map measA vertA horizA measB vertB horizB height width
    -> Split lower measA vertA horizA height width
    -> Split lower measB vertB horizB height width)
-> Map measA vertA horizA measB vertB horizB height width
-> Array (Split lower measA vertA horizA height width) a
-> Array (Split lower measB vertB horizB height width) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map measA vertA horizA measB vertB horizB height width
-> Split lower measA vertA horizA height width
-> Split lower 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

mapExtentSizes ::
   (Extent measA vertA horizA heightA widthA ->
    Extent measB vertB horizB heightB widthB) ->
   Split lower measA vertA horizA heightA widthA a ->
   Split lower measB vertB horizB heightB widthB a
mapExtentSizes :: forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB lower a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Split lower measA vertA horizA heightA widthA a
-> Split lower measB vertB horizB heightB widthB a
mapExtentSizes Extent measA vertA horizA heightA widthA
-> Extent measB vertB horizB heightB widthB
f =
   (Split lower measA vertA horizA heightA widthA
 -> Split lower measB vertB horizB heightB widthB)
-> Array (Split lower measA vertA horizA heightA widthA) a
-> Array (Split lower measB vertB horizB heightB widthB) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape
      (\(Layout.Split lower
lowerPart Order
order Extent measA vertA horizA heightA widthA
extent) ->
         lower
-> Order
-> Extent measB vertB horizB heightB widthB
-> Split lower measB vertB horizB heightB widthB
forall lower meas vert horiz height width.
lower
-> Order
-> Extent meas vert horiz height width
-> Split lower meas vert horiz height width
Layout.Split lower
lowerPart Order
order (Extent measB vertB horizB heightB widthB
 -> Split lower measB vertB horizB heightB widthB)
-> Extent measB vertB horizB heightB widthB
-> Split lower measB vertB horizB heightB widthB
forall a b. (a -> b) -> a -> b
$ Extent measA vertA horizA heightA widthA
-> Extent measB vertB horizB heightB widthB
f Extent measA vertA horizA heightA widthA
extent)

mapHeight ::
   (Extent.C vert, Extent.C horiz) =>
   (heightA -> heightB) ->
   Split lower Extent.Size vert horiz heightA width a ->
   Split lower Extent.Size vert horiz heightB width a
mapHeight :: 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
mapHeight = (Extent Size vert horiz heightA width
 -> Extent Size vert horiz heightB width)
-> Split lower Size vert horiz heightA width a
-> Split lower Size vert horiz heightB width a
forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB lower a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Split lower measA vertA horizA heightA widthA a
-> Split lower measB vertB horizB heightB widthB a
mapExtentSizes ((Extent Size vert horiz heightA width
  -> Extent Size vert horiz heightB width)
 -> Split lower Size vert horiz heightA width a
 -> Split lower Size vert horiz heightB width a)
-> ((heightA -> heightB)
    -> Extent Size vert horiz heightA width
    -> Extent Size vert horiz heightB width)
-> (heightA -> heightB)
-> Split lower Size vert horiz heightA width a
-> Split lower Size vert horiz heightB width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (heightA -> heightB)
-> Extent Size vert horiz heightA width
-> Extent Size vert horiz heightB width
forall vert horiz heightA heightB width.
(C vert, C horiz) =>
(heightA -> heightB)
-> Extent Size vert horiz heightA width
-> Extent Size vert horiz heightB width
Extent.mapHeight

mapWidth ::
   (Extent.C vert, Extent.C horiz) =>
   (widthA -> widthB) ->
   Split lower Extent.Size vert horiz height widthA a ->
   Split lower Extent.Size vert horiz height widthB a
mapWidth :: 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
mapWidth = (Extent Size vert horiz height widthA
 -> Extent Size vert horiz height widthB)
-> Split lower Size vert horiz height widthA a
-> Split lower Size vert horiz height widthB a
forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB lower a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Split lower measA vertA horizA heightA widthA a
-> Split lower measB vertB horizB heightB widthB a
mapExtentSizes ((Extent Size vert horiz height widthA
  -> Extent Size vert horiz height widthB)
 -> Split lower Size vert horiz height widthA a
 -> Split lower Size vert horiz height widthB a)
-> ((widthA -> widthB)
    -> Extent Size vert horiz height widthA
    -> Extent Size vert horiz height widthB)
-> (widthA -> widthB)
-> Split lower Size vert horiz height widthA a
-> Split lower Size vert horiz height widthB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (widthA -> widthB)
-> Extent Size vert horiz height widthA
-> Extent Size vert horiz height widthB
forall vert horiz widthA widthB height.
(C vert, C horiz) =>
(widthA -> widthB)
-> Extent Size vert horiz height widthA
-> Extent Size vert horiz height widthB
Extent.mapWidth

uncheck ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
   Split lower meas vert horiz height width a ->
   Split lower meas vert horiz (Unchecked height) (Unchecked width) a
uncheck :: forall meas vert horiz lower height width a.
(Measure meas, C vert, C horiz) =>
Split lower meas vert horiz height width a
-> Split
     lower meas vert horiz (Unchecked height) (Unchecked width) a
uncheck = (Extent meas vert horiz height width
 -> Extent meas vert horiz (Unchecked height) (Unchecked width))
-> Split lower meas vert horiz height width a
-> Split
     lower meas vert horiz (Unchecked height) (Unchecked width) a
forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB lower a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Split lower measA vertA horizA heightA widthA a
-> Split lower measB vertB horizB heightB widthB a
mapExtentSizes ((Extent meas vert horiz height width
  -> Extent meas vert horiz (Unchecked height) (Unchecked width))
 -> Split lower meas vert horiz height width a
 -> Split
      lower meas vert horiz (Unchecked height) (Unchecked width) a)
-> (Extent meas vert horiz height width
    -> Extent meas vert horiz (Unchecked height) (Unchecked width))
-> Split lower meas vert horiz height width a
-> Split
     lower meas vert horiz (Unchecked height) (Unchecked width) a
forall a b. (a -> b) -> a -> b
$ (height -> Unchecked height)
-> (width -> Unchecked width)
-> Extent meas vert horiz height width
-> Extent meas vert horiz (Unchecked height) (Unchecked width)
forall meas vert horiz height (f :: * -> *) width.
(Measure meas, C vert, C horiz) =>
(height -> f height)
-> (width -> f width)
-> Extent meas vert horiz height width
-> Extent meas vert horiz (f height) (f width)
Extent.mapWrap height -> Unchecked height
forall sh. sh -> Unchecked sh
Unchecked width -> Unchecked width
forall sh. sh -> Unchecked sh
Unchecked

recheck ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
   Split lower meas vert horiz (Unchecked height) (Unchecked width) a ->
   Split lower meas vert horiz height width a
recheck :: forall meas vert horiz lower height width a.
(Measure meas, C vert, C horiz) =>
Split lower meas vert horiz (Unchecked height) (Unchecked width) a
-> Split lower meas vert horiz height width a
recheck = (Extent meas vert horiz (Unchecked height) (Unchecked width)
 -> Extent meas vert horiz height width)
-> Split
     lower meas vert horiz (Unchecked height) (Unchecked width) a
-> Split lower meas vert horiz height width a
forall measA vertA horizA heightA widthA measB vertB horizB heightB
       widthB lower a.
(Extent measA vertA horizA heightA widthA
 -> Extent measB vertB horizB heightB widthB)
-> Split lower measA vertA horizA heightA widthA a
-> Split lower measB vertB horizB heightB widthB a
mapExtentSizes Extent meas vert horiz (Unchecked height) (Unchecked width)
-> Extent meas vert horiz height width
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz (Unchecked height) (Unchecked width)
-> Extent meas vert horiz height width
Extent.recheck


heightToQuadratic ::
   (Extent.Measure meas) =>
   Split lower meas Extent.Small Extent.Small height width a ->
   Square lower height a
heightToQuadratic :: forall meas lower height width a.
Measure meas =>
Split lower meas Small Small height width a
-> Square lower height a
heightToQuadratic =
   (Split lower meas Small Small height width
 -> Split lower Shape Small Small height height)
-> Array (Split lower meas Small Small height width) a
-> Array (Split lower Shape Small Small height height) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((Split lower meas Small Small height width
  -> Split lower Shape Small Small height height)
 -> Array (Split lower meas Small Small height width) a
 -> Array (Split lower Shape Small Small height height) a)
-> (Split lower meas Small Small height width
    -> Split lower Shape Small Small height height)
-> Array (Split lower meas Small Small height width) a
-> Array (Split lower Shape Small Small height height) a
forall a b. (a -> b) -> a -> b
$
      \(Layout.Split lower
part Order
order_ Extent meas Small Small height width
extent_) ->
         lower
-> Order
-> Extent Shape Small Small height height
-> Split lower Shape Small Small height height
forall lower meas vert horiz height width.
lower
-> Order
-> Extent meas vert horiz height width
-> Split lower meas vert horiz height width
Layout.Split lower
part Order
order_ (Extent Shape Small Small height height
 -> Split lower Shape Small Small height height)
-> Extent Shape Small Small height height
-> Split lower Shape Small Small height height
forall a b. (a -> b) -> a -> b
$
         height -> Extent Shape Small Small height height
forall sh. sh -> Square sh
Extent.square (height -> Extent Shape Small Small height height)
-> height -> Extent Shape Small Small height height
forall a b. (a -> b) -> a -> b
$ Extent meas Small Small height width -> height
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> height
Extent.height Extent meas Small Small height width
extent_

widthToQuadratic ::
   (Extent.Measure meas) =>
   Split lower meas Extent.Small Extent.Small height width a ->
   Square lower width a
widthToQuadratic :: forall meas lower height width a.
Measure meas =>
Split lower meas Small Small height width a -> Square lower width a
widthToQuadratic =
   (Split lower meas Small Small height width
 -> Split lower Shape Small Small width width)
-> Array (Split lower meas Small Small height width) a
-> Array (Split lower Shape Small Small width width) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((Split lower meas Small Small height width
  -> Split lower Shape Small Small width width)
 -> Array (Split lower meas Small Small height width) a
 -> Array (Split lower Shape Small Small width width) a)
-> (Split lower meas Small Small height width
    -> Split lower Shape Small Small width width)
-> Array (Split lower meas Small Small height width) a
-> Array (Split lower Shape Small Small width width) a
forall a b. (a -> b) -> a -> b
$
      \(Layout.Split lower
part Order
order_ Extent meas Small Small height width
extent_) ->
         lower
-> Order
-> Extent Shape Small Small width width
-> Split lower Shape Small Small width 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 lower
part Order
order_ (Extent Shape Small Small width width
 -> Split lower Shape Small Small width width)
-> Extent Shape Small Small width width
-> Split lower Shape Small Small width width
forall a b. (a -> b) -> a -> b
$
         width -> Extent Shape Small Small width width
forall sh. sh -> Square sh
Extent.square (width -> Extent Shape Small Small width width)
-> width -> Extent Shape Small Small width width
forall a b. (a -> b) -> a -> b
$ Extent meas Small Small height width -> width
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> width
Extent.width Extent meas Small Small height width
extent_


determinantR ::
   (Extent.Measure meas, Extent.C vert,
    Shape.C height, Shape.C width, Class.Floating a) =>
   Split lower meas vert Extent.Small height width a -> a
determinantR :: 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
determinantR (Array (Layout.Split lower
_ Order
order Extent meas vert Small height width
extent) ForeignPtr a
a) =
   let (height
height,width
width) = Extent meas vert Small 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 Small height width
extent
       m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
height
       n :: Int
n = width -> Int
forall sh. C sh => sh -> Int
Shape.size width
width
       k :: Int
k = case Order
order of Order
RowMajor -> Int
n; Order
ColumnMajor -> Int
m
   in IO a -> a
forall a. IO a -> a
unsafePerformIO (IO a -> a) -> IO a -> a
forall a b. (a -> b) -> a -> b
$
      ForeignPtr a -> (Ptr a -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a ((Ptr a -> IO a) -> IO a) -> (Ptr a -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \Ptr a
aPtr ->
      Int -> Ptr a -> Int -> IO a
forall a. Floating a => Int -> Ptr a -> Int -> IO a
Private.product (Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
m Int
n) Ptr a
aPtr (Int
kInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)


extractTriangle ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   Either lower Triangle ->
   Split lower meas vert horiz height width a ->
   Full meas vert horiz height width a
extractTriangle :: 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
extractTriangle Either lower Triangle
part (Array (Layout.Split lower
_ Order
order Extent meas vert horiz height width
extent) ForeignPtr a
qr) =

   Full meas vert horiz height width
-> (Ptr a -> IO ()) -> Array (Full meas vert horiz height width) a
forall sh a.
(C sh, Storable a) =>
sh -> (Ptr a -> IO ()) -> Array sh a
Array.unsafeCreate (Order
-> Extent meas vert horiz height width
-> Full meas vert horiz height width
forall meas vert horiz height width.
Order
-> Extent meas vert horiz height width
-> Full meas vert horiz height width
Layout.Full Order
order Extent meas vert horiz height width
extent) ((Ptr a -> IO ()) -> Array (Full meas vert horiz height width) a)
-> (Ptr a -> IO ()) -> Array (Full meas vert horiz height width) a
forall a b. (a -> b) -> a -> b
$ \Ptr a
rPtr -> 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 ((Char
loup,Int
m), (Char
uplo,Int
n)) =
         Order -> ((Char, Int), (Char, Int)) -> ((Char, Int), (Char, Int))
forall a. Order -> (a, a) -> (a, a)
swapOnRowMajor Order
order
            ((Char
'L', height -> Int
forall sh. C sh => sh -> Int
Shape.size height
height), (Char
'U', width -> Int
forall sh. C sh => sh -> Int
Shape.size width
width))
   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 CChar
loupPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
loup
      Ptr CChar
uploPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
uplo
      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
qrPtr <- ((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
qr
      Ptr CInt
ldqrPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
m
      Ptr CInt
ldrPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
m
      Ptr a
zeroPtr <- a -> ContT () IO (Ptr a)
forall a r. Floating a => a -> FortranIO r (Ptr a)
Call.number a
forall a. Floating a => a
zero
      Ptr a
onePtr <- a -> ContT () IO (Ptr a)
forall a r. Floating a => a -> FortranIO r (Ptr a)
Call.number a
forall a. Floating a => a
one
      IO () -> ContT () IO ()
forall a. IO a -> ContT () IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
         case Either lower Triangle
part of
            Left lower
_ -> do
               Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
LapackGen.lacpy Ptr CChar
loupPtr Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
qrPtr Ptr CInt
ldqrPtr Ptr a
rPtr Ptr CInt
ldrPtr
               Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> IO ()
LapackGen.laset Ptr CChar
uploPtr Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
zeroPtr Ptr a
onePtr Ptr a
rPtr Ptr CInt
ldrPtr
            Right Triangle
_ -> do
               Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> IO ()
LapackGen.laset Ptr CChar
loupPtr Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
zeroPtr Ptr a
zeroPtr Ptr a
rPtr Ptr CInt
ldrPtr
               Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
LapackGen.lacpy Ptr CChar
uploPtr Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
qrPtr Ptr CInt
ldqrPtr Ptr a
rPtr Ptr CInt
ldrPtr


wideExtractL ::
   (Extent.Measure meas, Extent.C horiz,
    Shape.C height, Shape.C width, Class.Floating a) =>
   Split lower meas Extent.Small horiz height width a -> Lower height a
wideExtractL :: 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
wideExtractL =
   (Order -> Int -> Ptr a -> IO ())
-> MirrorSingleton NoMirror
-> Full meas Small horiz height width a
-> MosaicLower NoMirror height a
forall meas horiz height width a mirror.
(Measure meas, C horiz, C height, C width, Floating a) =>
(Order -> Int -> Ptr a -> IO ())
-> MirrorSingleton mirror
-> Full meas Small horiz height width a
-> MosaicLower mirror height a
Mos.fromLowerPart
      (\Order
order Int
m Ptr a
lPtr -> (Ptr a -> IO ()) -> [Ptr a] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((Ptr a -> a -> IO ()) -> a -> Ptr a -> IO ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke a
forall a. Floating a => a
one) ([Ptr a] -> IO ()) -> [Ptr a] -> IO ()
forall a b. (a -> b) -> a -> b
$ Order -> Int -> Ptr a -> [Ptr a]
forall a. Storable a => Order -> Int -> Ptr a -> [Ptr a]
diagonalPointers Order
order Int
m Ptr a
lPtr)
      MirrorSingleton NoMirror
Layout.NoMirror
   (Full meas Small horiz height width a
 -> MosaicLower NoMirror height a)
-> (Split lower meas Small horiz height width a
    -> Full meas Small horiz height width a)
-> Split lower meas Small horiz height width a
-> MosaicLower NoMirror height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   Split lower meas Small horiz height width a
-> Full meas Small horiz height width a
forall lower meas vert horiz height width a.
Split lower meas vert horiz height width a
-> Full meas vert horiz height width a
toFull

tallExtractR ::
   (Extent.Measure meas, Extent.C vert,
    Shape.C height, Shape.C width, Class.Floating a) =>
   Split lower meas vert Extent.Small height width a -> Upper width a
tallExtractR :: 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
tallExtractR = Full meas vert Small height width a -> Upper width a
forall meas vert height width a.
(Measure meas, C vert, C height, C width, Floating a) =>
Full meas vert Small height width a -> Upper width a
Tri.takeUpper (Full meas vert Small height width a -> Upper width a)
-> (Split lower meas vert Small height width a
    -> Full meas vert Small height width a)
-> Split lower meas vert Small height width a
-> Upper width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Split lower meas vert Small height width a
-> Full meas vert Small height width a
forall lower meas vert horiz height width a.
Split lower meas vert horiz height width a
-> Full meas vert horiz height width a
toFull

toFull ::
   Split lower meas vert horiz height width a ->
   Full meas vert horiz height width a
toFull :: forall lower meas vert horiz height width a.
Split lower meas vert horiz height width a
-> Full meas vert horiz height width a
toFull =
   (Split lower meas vert horiz height width
 -> Full meas vert horiz height width)
-> Array (Split lower meas vert horiz height width) a
-> Array (Full meas vert horiz height width) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape
      (\(Layout.Split lower
_ Order
order Extent meas vert horiz height width
extent) -> Order
-> Extent meas vert horiz height width
-> Full meas vert horiz height width
forall meas vert horiz height width.
Order
-> Extent meas vert horiz height width
-> Full meas vert horiz height width
Layout.Full Order
order Extent meas vert horiz height width
extent)


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 ->
   Split Triangle measA Extent.Small horizA height widthA a ->
   Full meas vert horiz height widthB a ->
   Full meas vert horiz height widthB a
wideMultiplyL :: 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
wideMultiplyL Transposition
transposed Split Triangle measA Small horizA height widthA a
a Full meas vert horiz height widthB a
b =
   if Split Triangle measA Small horizA height widthA -> height
forall meas vert horiz lower height width.
(Measure meas, C vert, C horiz) =>
Split lower meas vert horiz height width -> height
Layout.splitHeight (Split Triangle measA Small horizA height widthA a
-> Split Triangle measA Small horizA height widthA
forall sh a. Array sh a -> sh
Array.shape Split Triangle measA Small horizA height widthA a
a) height -> height -> Bool
forall a. Eq a => a -> a -> Bool
== Full meas vert horiz height widthB a -> height
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a -> height
Matrix.height Full meas vert horiz height widthB a
b
      then (Char, Char)
-> Char
-> 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 vertA horizA measB vertB horizB heightA widthA heightB
       widthB a lower.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, C heightA, C widthA, C heightB, C widthB, Floating a) =>
(Char, Char)
-> Char
-> Transposition
-> Split lower measA vertA horizA heightA widthA a
-> Full measB vertB horizB heightB widthB a
-> Full measB vertB horizB heightB widthB a
multiplyTriangular (Char
'L',Char
'U') Char
'U' Transposition
transposed Split Triangle measA Small horizA height widthA a
a Full meas vert horiz height widthB a
b
      else [Char] -> Full meas vert horiz height widthB a
forall a. HasCallStack => [Char] -> a
error [Char]
"wideMultiplyL: height shapes mismatch"

tallMultiplyR ::
   (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 ->
   Split lower measA vertA Extent.Small heightA height a ->
   Full meas vert horiz height widthB a ->
   Full meas vert horiz height widthB a
tallMultiplyR :: 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
tallMultiplyR Transposition
transposed Split lower measA vertA Small heightA height a
a Full meas vert horiz height widthB a
b =
   if Split lower measA vertA Small heightA height -> height
forall meas vert horiz lower height width.
(Measure meas, C vert, C horiz) =>
Split lower meas vert horiz height width -> width
Layout.splitWidth (Split lower measA vertA Small heightA height a
-> Split lower measA vertA Small heightA height
forall sh a. Array sh a -> sh
Array.shape Split lower measA vertA Small heightA height a
a) height -> height -> Bool
forall a. Eq a => a -> a -> Bool
== Full meas vert horiz height widthB a -> height
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a -> height
Matrix.height Full meas vert horiz height widthB a
b
      then (Char, Char)
-> Char
-> Transposition
-> Split lower measA vertA Small heightA height a
-> Full meas vert horiz height widthB a
-> Full meas vert horiz height widthB a
forall measA vertA horizA measB vertB horizB heightA widthA heightB
       widthB a lower.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, C heightA, C widthA, C heightB, C widthB, Floating a) =>
(Char, Char)
-> Char
-> Transposition
-> Split lower measA vertA horizA heightA widthA a
-> Full measB vertB horizB heightB widthB a
-> Full measB vertB horizB heightB widthB a
multiplyTriangular (Char
'U',Char
'L') Char
'N' Transposition
transposed Split lower measA vertA Small heightA height a
a Full meas vert horiz height widthB a
b
      else [Char] -> Full meas vert horiz height widthB a
forall a. HasCallStack => [Char] -> a
error [Char]
"wideMultiplyR: height shapes mismatch"

multiplyTriangular ::
   (Extent.Measure measA, Extent.C vertA, Extent.C horizA,
    Extent.Measure measB, Extent.C vertB, Extent.C horizB,
    Shape.C heightA, Shape.C widthA, Shape.C heightB, Shape.C widthB,
    Class.Floating a) =>
   (Char,Char) -> Char -> Transposition ->
   Split lower measA vertA horizA heightA widthA a ->
   Full measB vertB horizB heightB widthB a ->
   Full measB vertB horizB heightB widthB a
multiplyTriangular :: forall measA vertA horizA measB vertB horizB heightA widthA heightB
       widthB a lower.
(Measure measA, C vertA, C horizA, Measure measB, C vertB,
 C horizB, C heightA, C widthA, C heightB, C widthB, Floating a) =>
(Char, Char)
-> Char
-> Transposition
-> Split lower measA vertA horizA heightA widthA a
-> Full measB vertB horizB heightB widthB a
-> Full measB vertB horizB heightB widthB a
multiplyTriangular (Char
normalPart,Char
transposedPart) Char
diag Transposition
transposed
   (Array (Layout.Split lower
_ Order
orderA Extent measA vertA horizA heightA widthA
extentA) ForeignPtr a
a)
   (Array (Layout.Full Order
orderB Extent measB vertB horizB heightB widthB
extentB) ForeignPtr a
b) =

   Full measB vertB horizB heightB widthB
-> (Ptr a -> IO ())
-> Array (Full measB vertB horizB heightB widthB) a
forall sh a.
(C sh, Storable a) =>
sh -> (Ptr a -> IO ()) -> Array sh a
Array.unsafeCreate (Order
-> Extent measB vertB horizB heightB widthB
-> Full measB vertB horizB heightB widthB
forall meas vert horiz height width.
Order
-> Extent meas vert horiz height width
-> Full meas vert horiz height width
Layout.Full Order
orderB Extent measB vertB horizB heightB widthB
extentB) ((Ptr a -> IO ())
 -> Array (Full measB vertB horizB heightB widthB) a)
-> (Ptr a -> IO ())
-> Array (Full measB vertB horizB heightB widthB) a
forall a b. (a -> b) -> a -> b
$ \Ptr a
cPtr -> do

   let (heightA
heightA,widthA
widthA) = Extent measA vertA horizA heightA widthA -> (heightA, widthA)
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> (height, width)
Extent.dimensions Extent measA vertA horizA heightA widthA
extentA
   let (heightB
heightB,widthB
widthB) = Extent measB vertB horizB heightB widthB -> (heightB, 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 heightB widthB
extentB
   let transOrderB :: Order
transOrderB = Transposition -> Order -> Order
transposeOrder Transposition
transposed Order
orderB
   let ((Char
uplo, Order
transa), Int
lda) =
         case Order
orderA of
            Order
RowMajor ->
               ((Char
transposedPart, Order -> Order
flipOrder Order
transOrderB), widthA -> Int
forall sh. C sh => sh -> Int
Shape.size widthA
widthA)
            Order
ColumnMajor ->
               ((Char
normalPart, Order
transOrderB), heightA -> Int
forall sh. C sh => sh -> Int
Shape.size heightA
heightA)
   let (Char
side,(Int
m,Int
n)) =
         Order -> (Int, Int) -> (Char, (Int, Int))
forall a. Order -> (a, a) -> (Char, (a, a))
sideSwapFromOrder Order
orderB (heightB -> Int
forall sh. C sh => sh -> Int
Shape.size heightB
heightB, widthB -> Int
forall sh. C sh => sh -> Int
Shape.size widthB
widthB)
   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 CChar
sidePtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
side
      Ptr CChar
uploPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
uplo
      Ptr CChar
transaPtr <- 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
$ Order -> Char
transposeFromOrder Order
transa
      Ptr CChar
diagPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
diag
      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
lda
      Ptr a
bPtr <- ((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
b
      Ptr CInt
ldcPtr <- Int -> FortranIO () (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim Int
m
      Ptr a
alphaPtr <- a -> ContT () IO (Ptr a)
forall a r. Floating a => a -> FortranIO r (Ptr a)
Call.number a
forall a. Floating a => a
one
      IO () -> ContT () IO ()
forall a. IO a -> ContT () IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ do
         Int -> Ptr a -> Ptr a -> IO ()
forall a. Floating a => Int -> Ptr a -> Ptr a -> IO ()
copyBlock (Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
n) Ptr a
bPtr Ptr a
cPtr
         Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> IO ()
BlasGen.trmm Ptr CChar
sidePtr Ptr CChar
uploPtr Ptr CChar
transaPtr Ptr CChar
diagPtr
            Ptr CInt
mPtr Ptr CInt
nPtr Ptr a
alphaPtr Ptr a
aPtr Ptr CInt
ldaPtr Ptr a
cPtr Ptr CInt
ldcPtr


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 ->
   Split Triangle measA Extent.Small horizA height width a ->
   Full meas vert horiz height nrhs a -> Full meas vert horiz height nrhs a
wideSolveL :: 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
wideSolveL Transposition
transposed Conjugation
conjugated
      (Array (Layout.Split Triangle
_ Order
orderA Extent measA Small horizA height width
extentA) ForeignPtr a
a) =
   let heightA :: height
heightA = Extent measA Small horizA height width -> height
forall meas vert horiz height width.
(Measure meas, C vert, C horiz) =>
Extent meas vert horiz height width -> height
Extent.height Extent measA Small horizA height width
extentA
   in [Char]
-> height
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz, C height, C width, Eq height,
 Floating a) =>
[Char]
-> 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 [Char]
"Split.wideSolveL" height
heightA ((Int
  -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
 -> Full meas vert horiz height nrhs a
 -> Full meas vert horiz height nrhs a)
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz height nrhs a
-> Full meas vert horiz height nrhs a
forall a b. (a -> b) -> a -> b
$ \Int
n Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr -> do

      Ptr CChar
uploPtr <- 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
$ Order -> Char
uploFromOrder (Order -> Char) -> Order -> Char
forall a b. (a -> b) -> a -> b
$ Order -> Order
flipOrder Order
orderA
      Ptr CChar
diagPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
'U'
      let m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
heightA
      Transposition
-> Conjugation
-> Order
-> Int
-> Int
-> ForeignPtr a
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> ContT () IO ()
forall a r.
Floating a =>
Transposition
-> Conjugation
-> Order
-> Int
-> Int
-> ForeignPtr a
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> ContT r IO ()
solveTriangular Transposition
transposed Conjugation
conjugated Order
orderA Int
m Int
n ForeignPtr a
a
         Ptr CChar
uploPtr Ptr CChar
diagPtr Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr

tallSolveR ::
   (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 ->
   Split lower measA vertA Extent.Small height width a ->
   Full meas vert horiz width nrhs a -> Full meas vert horiz width nrhs a
tallSolveR :: 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
tallSolveR Transposition
transposed Conjugation
conjugated
      (Array (Layout.Split lower
_ Order
orderA Extent measA vertA Small height width
extentA) ForeignPtr a
a) =
   let (height
heightA,width
widthA) = Extent measA vertA Small 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 measA vertA Small height width
extentA
   in [Char]
-> width
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz, C height, C width, Eq height,
 Floating a) =>
[Char]
-> 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 [Char]
"Split.tallSolveR" width
widthA ((Int
  -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
 -> Full meas vert horiz width nrhs a
 -> Full meas vert horiz width nrhs a)
-> (Int
    -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> ContT () IO ())
-> Full meas vert horiz width nrhs a
-> Full meas vert horiz width nrhs a
forall a b. (a -> b) -> a -> b
$ \Int
n Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr -> do

      Ptr CChar
uploPtr <- 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
$ Order -> Char
uploFromOrder Order
orderA
      Ptr CChar
diagPtr <- Char -> FortranIO () (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
'N'
      let m :: Int
m = height -> Int
forall sh. C sh => sh -> Int
Shape.size height
heightA
      Transposition
-> Conjugation
-> Order
-> Int
-> Int
-> ForeignPtr a
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> ContT () IO ()
forall a r.
Floating a =>
Transposition
-> Conjugation
-> Order
-> Int
-> Int
-> ForeignPtr a
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> ContT r IO ()
solveTriangular Transposition
transposed Conjugation
conjugated Order
orderA Int
m Int
n ForeignPtr a
a
         Ptr CChar
uploPtr Ptr CChar
diagPtr Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr

solveTriangular ::
   Class.Floating a =>
   Transposition -> Conjugation ->
   Order -> Int -> Int -> ForeignPtr a ->
   Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt ->
   Ptr a -> Ptr CInt -> ContT r IO ()
solveTriangular :: forall a r.
Floating a =>
Transposition
-> Conjugation
-> Order
-> Int
-> Int
-> ForeignPtr a
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> ContT r IO ()
solveTriangular Transposition
transposed Conjugation
conjugated Order
orderA Int
m Int
n ForeignPtr a
a
   Ptr CChar
uploPtr Ptr CChar
diagPtr Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
xPtr Ptr CInt
ldxPtr = do
      let (Char
trans, ContT r IO (Ptr a)
getA) =
            case (Transposition -> Order -> Order
transposeOrder Transposition
transposed Order
orderA, Conjugation
conjugated) of
               (Order
RowMajor, Conjugation
NonConjugated) -> (Char
'T', ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a))
-> ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO r) -> IO r
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a)
               (Order
RowMajor, Conjugation
Conjugated) -> (Char
'C', ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a))
-> ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO r) -> IO r
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a)
               (Order
ColumnMajor, Conjugation
NonConjugated) -> (Char
'N', ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a))
-> ((Ptr a -> IO r) -> IO r) -> ContT r IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ ForeignPtr a -> (Ptr a -> IO r) -> IO r
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr a
a)
               (Order
ColumnMajor, Conjugation
Conjugated) -> (Char
'N', Int -> ForeignPtr a -> ContT r IO (Ptr a)
forall a r. Floating a => Int -> ForeignPtr a -> ContT r IO (Ptr a)
conjugateToTemp (Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
n) ForeignPtr a
a)
      Ptr CChar
transPtr <- Char -> FortranIO r (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
trans
      Ptr a
aPtr <- ContT r IO (Ptr a)
getA
      Ptr CInt
ldaPtr <- Int -> FortranIO r (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.leadingDim (Int -> FortranIO r (Ptr CInt)) -> Int -> FortranIO r (Ptr CInt)
forall a b. (a -> b) -> a -> b
$ case Order
orderA of Order
ColumnMajor -> Int
m; Order
RowMajor -> Int
n
      IO () -> ContT r IO ()
forall a. IO a -> ContT r IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ContT r IO ()) -> IO () -> ContT r IO ()
forall a b. (a -> b) -> a -> b
$
         [Char] -> (Ptr CInt -> IO ()) -> IO ()
withInfo [Char]
"trtrs" ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
            Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
forall a.
Floating a =>
Ptr CChar
-> Ptr CChar
-> Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
LapackGen.trtrs Ptr CChar
uploPtr Ptr CChar
transPtr Ptr CChar
diagPtr
               Ptr CInt
nPtr Ptr CInt
nrhsPtr Ptr a
aPtr Ptr CInt
ldaPtr Ptr a
xPtr Ptr CInt
ldxPtr