module Numeric.LAPACK.ComfortArray.Demo where

import qualified Numeric.LAPACK.ComfortArray.Float as Lapack
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 (Array)

import Control.Monad (liftM2)



gels ::
   Array (ZeroInt,ZeroInt) Float -> Array (ZeroInt,ZeroInt) Float ->
   IO (Array (ZeroInt,ZeroInt) Float, Array (ZeroInt,ZeroInt) Float)
gels :: Array (ZeroInt, ZeroInt) Float
-> Array (ZeroInt, ZeroInt) Float
-> IO
     (Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
gels Array (ZeroInt, ZeroInt) Float
a Array (ZeroInt, ZeroInt) Float
b = do
   Array IO (ZeroInt, ZeroInt) Float
ioa <- Array (ZeroInt, ZeroInt) Float
-> IO (Array IO (ZeroInt, ZeroInt) Float)
forall (m :: * -> *) sh a.
(PrimMonad m, C sh, Storable a) =>
Array sh a -> m (Array m sh a)
MutArray.thaw Array (ZeroInt, ZeroInt) Float
a
   Array IO (ZeroInt, ZeroInt) Float
iob <- Array (ZeroInt, ZeroInt) Float
-> IO (Array IO (ZeroInt, ZeroInt) Float)
forall (m :: * -> *) sh a.
(PrimMonad m, C sh, Storable a) =>
Array sh a -> m (Array m sh a)
MutArray.thaw Array (ZeroInt, ZeroInt) Float
b
   Int -> IO ()
forall a. Show a => a -> IO ()
print (Int -> IO ()) -> IO Int -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Char
-> Int
-> Array IO (ZeroInt, ZeroInt) Float
-> Array IO (ZeroInt, ZeroInt) Float
-> Int
-> IO Int
Lapack.gels Char
'N' Int
3 Array IO (ZeroInt, ZeroInt) Float
ioa Array IO (ZeroInt, ZeroInt) Float
iob Int
100
   (Array (ZeroInt, ZeroInt) Float
 -> Array (ZeroInt, ZeroInt) Float
 -> (Array (ZeroInt, ZeroInt) Float,
     Array (ZeroInt, ZeroInt) Float))
-> IO (Array (ZeroInt, ZeroInt) Float)
-> IO (Array (ZeroInt, ZeroInt) Float)
-> IO
     (Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (,)
      (Array IO (ZeroInt, ZeroInt) Float
-> IO (Array (ZeroInt, ZeroInt) Float)
forall (m :: * -> *) sh a.
(PrimMonad m, C sh, Storable a) =>
Array m sh a -> m (Array sh a)
MutArray.freeze Array IO (ZeroInt, ZeroInt) Float
ioa)
      (Array IO (ZeroInt, ZeroInt) Float
-> IO (Array (ZeroInt, ZeroInt) Float)
forall (m :: * -> *) sh a.
(PrimMonad m, C sh, Storable a) =>
Array m sh a -> m (Array sh a)
MutArray.freeze Array IO (ZeroInt, ZeroInt) Float
iob)

main :: IO ()
main :: IO ()
main =
   let z3 :: ZeroInt
z3 = Int -> ZeroInt
forall n. n -> ZeroBased n
Shape.ZeroBased Int
3
   in (Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
-> IO ()
forall a. Show a => a -> IO ()
print ((Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
 -> IO ())
-> IO
     (Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
-> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
      Array (ZeroInt, ZeroInt) Float
-> Array (ZeroInt, ZeroInt) Float
-> IO
     (Array (ZeroInt, ZeroInt) Float, Array (ZeroInt, ZeroInt) Float)
gels
         ((ZeroInt, ZeroInt) -> [Float] -> Array (ZeroInt, ZeroInt) Float
forall sh a. (C sh, Storable a) => sh -> [a] -> Array sh a
Array.fromList (ZeroInt
z3,ZeroInt
z3) [Float
1,Float
2,Float
3,Float
0,Float
1,Float
4,Float
0,Float
0,Float
1])
         ((ZeroInt, ZeroInt) -> [Float] -> Array (ZeroInt, ZeroInt) Float
forall sh a. (C sh, Storable a) => sh -> [a] -> Array sh a
Array.fromList (ZeroInt
z3,ZeroInt
z3) [Float
1,Float
0,Float
0,Float
0,Float
1,Float
0,Float
0,Float
0,Float
1])