module Numeric.LAPACK.ComfortArray.Example where

import qualified Numeric.LAPACK.FFI.Real as Lapack
import qualified Numeric.Netlib.Class as Class
import qualified Numeric.Netlib.ComfortArray.Utility as Call
import Numeric.Netlib.ComfortArray.Utility (ZeroInt)

import qualified Data.Array.Comfort.Storable.Mutable as MutArray
import qualified Data.Array.Comfort.Storable as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Storable.Mutable (IOArray)
import Data.Array.Comfort.Storable (Array)

import qualified Foreign.C.Types as C
import Foreign.Storable (peek)
import Foreign.Ptr (Ptr, FunPtr)

import Control.Monad.Trans.Cont (evalContT)
import Control.Monad.IO.Class (liftIO)
import Control.Applicative (pure, (<*>))



choleskyDecompose ::
   (Class.Real a) => Char -> Int -> IOArray (ZeroInt,ZeroInt) a -> IO ()
choleskyDecompose :: Char -> Int -> IOArray (ZeroInt, ZeroInt) a -> IO ()
choleskyDecompose Char
uplo Int
kd IOArray (ZeroInt, ZeroInt) a
ab = do
   let (ZeroInt
n,ZeroInt
ldab) = IOArray (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall (m :: * -> *) sh a. Array m sh a -> sh
MutArray.shape IOArray (ZeroInt, ZeroInt) a
ab
   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
$
      String -> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall r a.
String -> FortranIO r (Ptr CInt -> IO a) -> FortranIO r a
Call.runChecked String
"Banded.choleskyDecompose" (FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ())
-> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
         (Ptr CChar
 -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT
     ()
     IO
     (Ptr CChar
      -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
-> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ()
forall a.
Real a =>
Ptr CChar
-> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ()
Lapack.pbtrf
          ContT
  ()
  IO
  (Ptr CChar
   -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CChar)
-> ContT
     ()
     IO
     (Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> ContT () IO (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
uplo
          ContT
  ()
  IO
  (Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
n
          ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT () IO (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
kd
          ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr a)
-> ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT () IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
ab
          ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt) -> FortranIO () (Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
ldab

choleskySolve ::
   (Class.Real a) =>
   Char -> Int ->
   Array (ZeroInt,ZeroInt) a -> IOArray (ZeroInt,ZeroInt) a -> IO ()
choleskySolve :: Char
-> Int
-> Array (ZeroInt, ZeroInt) a
-> IOArray (ZeroInt, ZeroInt) a
-> IO ()
choleskySolve Char
uplo Int
kd Array (ZeroInt, ZeroInt) a
ab IOArray (ZeroInt, ZeroInt) a
b = do
   let (ZeroInt
n,ZeroInt
ldab) = Array (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall sh a. Array sh a -> sh
Array.shape Array (ZeroInt, ZeroInt) a
ab
   let (ZeroInt
nrhs,ZeroInt
ldb) = IOArray (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall (m :: * -> *) sh a. Array m sh a -> sh
MutArray.shape IOArray (ZeroInt, ZeroInt) a
b
   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
$
      String -> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall r a.
String -> FortranIO r (Ptr CInt -> IO a) -> FortranIO r a
Call.runChecked String
"Banded.choleskySolve" (FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ())
-> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
         (Ptr CChar
 -> Ptr CInt
 -> Ptr CInt
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr CInt
 -> IO ())
-> ContT
     ()
     IO
     (Ptr CChar
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
forall a.
Real a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
Lapack.pbtrs
          ContT
  ()
  IO
  (Ptr CChar
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CChar)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> ContT () IO (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
uplo
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
n
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT () IO (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
kd
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     () IO (Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
nrhs
          ContT
  () IO (Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr a)
-> ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Array (ZeroInt, ZeroInt) a -> ContT () IO (Ptr a)
forall a i r. Storable a => Array i a -> FortranIO r (Ptr a)
Call.array Array (ZeroInt, ZeroInt) a
ab
          ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
ldab
          ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr a)
-> ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT () IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
b
          ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt) -> FortranIO () (Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
ldb


leastSquares ::
   (Class.Real a) =>
   Char -> Int ->
   IOArray (ZeroInt,ZeroInt) a -> IOArray (ZeroInt,ZeroInt) a -> Int -> IO ()
leastSquares :: Char
-> Int
-> IOArray (ZeroInt, ZeroInt) a
-> IOArray (ZeroInt, ZeroInt) a
-> Int
-> IO ()
leastSquares Char
trans Int
m IOArray (ZeroInt, ZeroInt) a
a IOArray (ZeroInt, ZeroInt) a
b Int
lwork = do
   let (ZeroInt
n,ZeroInt
lda) = IOArray (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall (m :: * -> *) sh a. Array m sh a -> sh
MutArray.shape IOArray (ZeroInt, ZeroInt) a
a
   let (ZeroInt
nrhs,ZeroInt
ldb) = IOArray (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall (m :: * -> *) sh a. Array m sh a -> sh
MutArray.shape IOArray (ZeroInt, ZeroInt) a
b
   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
$
      String -> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall r a.
String -> FortranIO r (Ptr CInt -> IO a) -> FortranIO r a
Call.runChecked String
"Dense.leastSquares" (FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ())
-> FortranIO () (Ptr CInt -> IO ()) -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$
         (Ptr CChar
 -> Ptr CInt
 -> Ptr CInt
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr CInt
 -> IO ())
-> ContT
     ()
     IO
     (Ptr CChar
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
forall a.
Real a =>
Ptr CChar
-> Ptr CInt
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> IO ()
Lapack.gels
          ContT
  ()
  IO
  (Ptr CChar
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CChar)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> ContT () IO (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
trans
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT () IO (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
m
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
n
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     ()
     IO
     (Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
nrhs
          ContT
  ()
  IO
  (Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> IO ())
-> ContT () IO (Ptr a)
-> ContT
     ()
     IO
     (Ptr CInt
      -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT () IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
a
          ContT
  ()
  IO
  (Ptr CInt
   -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT
     () IO (Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
lda
          ContT
  () IO (Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr a)
-> ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT () IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
b
          ContT () IO (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt)
-> ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> ContT () IO (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
ldb
          ContT () IO (Ptr a -> Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr a)
-> ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT () IO (Ptr a)
forall a r. Storable a => Int -> FortranIO r (Ptr a)
Call.allocaArray Int
lwork
          ContT () IO (Ptr CInt -> Ptr CInt -> IO ())
-> ContT () IO (Ptr CInt) -> FortranIO () (Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT () IO (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
lwork


eigenvalues ::
   Class.Real a =>
   Char -> Char -> FunPtr (Ptr a -> Ptr a -> IO Bool) ->
   IOArray (ZeroInt,ZeroInt) a -> ZeroInt -> Int ->
   IO (C.CInt, Array ZeroInt a, Array ZeroInt a, Array (ZeroInt,ZeroInt) a)
eigenvalues :: Char
-> Char
-> FunPtr (Ptr a -> Ptr a -> IO Bool)
-> IOArray (ZeroInt, ZeroInt) a
-> ZeroInt
-> Int
-> IO
     (CInt, Array ZeroInt a, Array ZeroInt a,
      Array (ZeroInt, ZeroInt) a)
eigenvalues Char
jobvs Char
sort FunPtr (Ptr a -> Ptr a -> IO Bool)
select IOArray (ZeroInt, ZeroInt) a
a ZeroInt
ldvs Int
lwork = do
   let (ZeroInt
n,ZeroInt
lda) = IOArray (ZeroInt, ZeroInt) a -> (ZeroInt, ZeroInt)
forall (m :: * -> *) sh a. Array m sh a -> sh
MutArray.shape IOArray (ZeroInt, ZeroInt) a
a
   IOArray ZeroInt a
wr <- ZeroInt -> IO (IOArray ZeroInt a)
forall sh e. (C sh, Storable e) => sh -> IO (IOArray sh e)
Call.newArray ZeroInt
n
   IOArray ZeroInt a
wi <- ZeroInt -> IO (IOArray ZeroInt a)
forall sh e. (C sh, Storable e) => sh -> IO (IOArray sh e)
Call.newArray ZeroInt
n
   IOArray (ZeroInt, ZeroInt) a
vs <- (ZeroInt, ZeroInt) -> IO (IOArray (ZeroInt, ZeroInt) a)
forall sh e. (C sh, Storable e) => sh -> IO (IOArray sh e)
Call.newArray (ZeroInt
n,ZeroInt
ldvs)
   CInt
sdim <- ContT CInt IO CInt -> IO CInt
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT CInt IO CInt -> IO CInt) -> ContT CInt IO CInt -> IO CInt
forall a b. (a -> b) -> a -> b
$ do
      Ptr CInt
sdimPtr <- FortranIO CInt (Ptr CInt)
forall a r. Storable a => FortranIO r (Ptr a)
Call.alloca
      String -> FortranIO CInt (Ptr CInt -> IO ()) -> FortranIO CInt ()
forall r a.
String -> FortranIO r (Ptr CInt -> IO a) -> FortranIO r a
Call.runChecked String
"Dense.eigenvalues" (FortranIO CInt (Ptr CInt -> IO ()) -> FortranIO CInt ())
-> FortranIO CInt (Ptr CInt -> IO ()) -> FortranIO CInt ()
forall a b. (a -> b) -> a -> b
$
         (Ptr CChar
 -> Ptr CChar
 -> FunPtr (Ptr a -> Ptr a -> IO Bool)
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr CInt
 -> Ptr a
 -> Ptr a
 -> Ptr a
 -> Ptr CInt
 -> Ptr a
 -> Ptr CInt
 -> Ptr Bool
 -> Ptr CInt
 -> IO ())
-> ContT
     CInt
     IO
     (Ptr CChar
      -> Ptr CChar
      -> FunPtr (Ptr a -> Ptr a -> IO Bool)
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
-> Ptr CChar
-> FunPtr (Ptr a -> Ptr a -> IO Bool)
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr Bool
-> Ptr CInt
-> IO ()
forall a.
Real a =>
Ptr CChar
-> Ptr CChar
-> FunPtr (Ptr a -> Ptr a -> IO Bool)
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr CInt
-> Ptr a
-> Ptr a
-> Ptr a
-> Ptr CInt
-> Ptr a
-> Ptr CInt
-> Ptr Bool
-> Ptr CInt
-> IO ()
Lapack.gees
          ContT
  CInt
  IO
  (Ptr CChar
   -> Ptr CChar
   -> FunPtr (Ptr a -> Ptr a -> IO Bool)
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (Ptr CChar)
-> ContT
     CInt
     IO
     (Ptr CChar
      -> FunPtr (Ptr a -> Ptr a -> IO Bool)
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> ContT CInt IO (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
jobvs
          ContT
  CInt
  IO
  (Ptr CChar
   -> FunPtr (Ptr a -> Ptr a -> IO Bool)
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (Ptr CChar)
-> ContT
     CInt
     IO
     (FunPtr (Ptr a -> Ptr a -> IO Bool)
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> ContT CInt IO (Ptr CChar)
forall r. Char -> FortranIO r (Ptr CChar)
Call.char Char
sort
          ContT
  CInt
  IO
  (FunPtr (Ptr a -> Ptr a -> IO Bool)
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (FunPtr (Ptr a -> Ptr a -> IO Bool))
-> ContT
     CInt
     IO
     (Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FunPtr (Ptr a -> Ptr a -> IO Bool)
-> ContT CInt IO (FunPtr (Ptr a -> Ptr a -> IO Bool))
forall (f :: * -> *) a. Applicative f => a -> f a
pure FunPtr (Ptr a -> Ptr a -> IO Bool)
select
          ContT
  CInt
  IO
  (Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> FortranIO CInt (Ptr CInt)
-> ContT
     CInt
     IO
     (Ptr a
      -> Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> FortranIO CInt (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
n
          ContT
  CInt
  IO
  (Ptr a
   -> Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (Ptr a)
-> ContT
     CInt
     IO
     (Ptr CInt
      -> Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT CInt IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
a
          ContT
  CInt
  IO
  (Ptr CInt
   -> Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> FortranIO CInt (Ptr CInt)
-> ContT
     CInt
     IO
     (Ptr CInt
      -> Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> FortranIO CInt (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
lda
          ContT
  CInt
  IO
  (Ptr CInt
   -> Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> FortranIO CInt (Ptr CInt)
-> ContT
     CInt
     IO
     (Ptr a
      -> Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CInt -> FortranIO CInt (Ptr CInt)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CInt
sdimPtr
          ContT
  CInt
  IO
  (Ptr a
   -> Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (Ptr a)
-> ContT
     CInt
     IO
     (Ptr a
      -> Ptr a
      -> Ptr CInt
      -> Ptr a
      -> Ptr CInt
      -> Ptr Bool
      -> Ptr CInt
      -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray ZeroInt a -> ContT CInt IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray ZeroInt a
wr
          ContT
  CInt
  IO
  (Ptr a
   -> Ptr a
   -> Ptr CInt
   -> Ptr a
   -> Ptr CInt
   -> Ptr Bool
   -> Ptr CInt
   -> IO ())
-> ContT CInt IO (Ptr a)
-> ContT
     CInt
     IO
     (Ptr a
      -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray ZeroInt a -> ContT CInt IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray ZeroInt a
wi
          ContT
  CInt
  IO
  (Ptr a
   -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
-> ContT CInt IO (Ptr a)
-> ContT
     CInt
     IO
     (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> ContT CInt IO (Ptr a)
forall a i r. Storable a => IOArray i a -> FortranIO r (Ptr a)
Call.ioarray IOArray (ZeroInt, ZeroInt) a
vs
          ContT
  CInt
  IO
  (Ptr CInt -> Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
-> FortranIO CInt (Ptr CInt)
-> ContT
     CInt IO (Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZeroInt -> FortranIO CInt (Ptr CInt)
forall sh r. C sh => sh -> FortranIO r (Ptr CInt)
Call.shapeSize ZeroInt
ldvs
          ContT CInt IO (Ptr a -> Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
-> ContT CInt IO (Ptr a)
-> ContT CInt IO (Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT CInt IO (Ptr a)
forall a r. Storable a => Int -> FortranIO r (Ptr a)
Call.allocaArray Int
lwork
          ContT CInt IO (Ptr CInt -> Ptr Bool -> Ptr CInt -> IO ())
-> FortranIO CInt (Ptr CInt)
-> ContT CInt IO (Ptr Bool -> Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> FortranIO CInt (Ptr CInt)
forall r. Int -> FortranIO r (Ptr CInt)
Call.cint Int
lwork
          ContT CInt IO (Ptr Bool -> Ptr CInt -> IO ())
-> ContT CInt IO (Ptr Bool) -> FortranIO CInt (Ptr CInt -> IO ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ContT CInt IO (Ptr Bool)
forall a r. Storable a => Int -> FortranIO r (Ptr a)
Call.allocaArray (ZeroInt -> Int
forall sh. C sh => sh -> Int
Shape.size ZeroInt
n)
      IO CInt -> ContT CInt IO CInt
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO CInt -> ContT CInt IO CInt) -> IO CInt -> ContT CInt IO CInt
forall a b. (a -> b) -> a -> b
$ Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek Ptr CInt
sdimPtr
   (CInt
 -> Array ZeroInt a
 -> Array ZeroInt a
 -> Array (ZeroInt, ZeroInt) a
 -> (CInt, Array ZeroInt a, Array ZeroInt a,
     Array (ZeroInt, ZeroInt) a))
-> IO
     (CInt
      -> Array ZeroInt a
      -> Array ZeroInt a
      -> Array (ZeroInt, ZeroInt) a
      -> (CInt, Array ZeroInt a, Array ZeroInt a,
          Array (ZeroInt, ZeroInt) a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (,,,)
      IO
  (CInt
   -> Array ZeroInt a
   -> Array ZeroInt a
   -> Array (ZeroInt, ZeroInt) a
   -> (CInt, Array ZeroInt a, Array ZeroInt a,
       Array (ZeroInt, ZeroInt) a))
-> IO CInt
-> IO
     (Array ZeroInt a
      -> Array ZeroInt a
      -> Array (ZeroInt, ZeroInt) a
      -> (CInt, Array ZeroInt a, Array ZeroInt a,
          Array (ZeroInt, ZeroInt) a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CInt -> IO CInt
forall (f :: * -> *) a. Applicative f => a -> f a
pure CInt
sdim
      IO
  (Array ZeroInt a
   -> Array ZeroInt a
   -> Array (ZeroInt, ZeroInt) a
   -> (CInt, Array ZeroInt a, Array ZeroInt a,
       Array (ZeroInt, ZeroInt) a))
-> IO (Array ZeroInt a)
-> IO
     (Array ZeroInt a
      -> Array (ZeroInt, ZeroInt) a
      -> (CInt, Array ZeroInt a, Array ZeroInt a,
          Array (ZeroInt, ZeroInt) a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray ZeroInt a -> IO (Array ZeroInt a)
forall sh e. (C sh, Storable e) => IOArray sh e -> IO (Array sh e)
Call.freezeArray IOArray ZeroInt a
wr
      IO
  (Array ZeroInt a
   -> Array (ZeroInt, ZeroInt) a
   -> (CInt, Array ZeroInt a, Array ZeroInt a,
       Array (ZeroInt, ZeroInt) a))
-> IO (Array ZeroInt a)
-> IO
     (Array (ZeroInt, ZeroInt) a
      -> (CInt, Array ZeroInt a, Array ZeroInt a,
          Array (ZeroInt, ZeroInt) a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray ZeroInt a -> IO (Array ZeroInt a)
forall sh e. (C sh, Storable e) => IOArray sh e -> IO (Array sh e)
Call.freezeArray IOArray ZeroInt a
wi
      IO
  (Array (ZeroInt, ZeroInt) a
   -> (CInt, Array ZeroInt a, Array ZeroInt a,
       Array (ZeroInt, ZeroInt) a))
-> IO (Array (ZeroInt, ZeroInt) a)
-> IO
     (CInt, Array ZeroInt a, Array ZeroInt a,
      Array (ZeroInt, ZeroInt) a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IOArray (ZeroInt, ZeroInt) a -> IO (Array (ZeroInt, ZeroInt) a)
forall sh e. (C sh, Storable e) => IOArray sh e -> IO (Array sh e)
Call.freezeArray IOArray (ZeroInt, ZeroInt) a
vs