module MathSpec (spec) where import Foreign import Foreign.C.Types import Test.Hspec import Torch.FFI.TH.Random import qualified Torch.FFI.TH.Double.Tensor as D import qualified Torch.FFI.TH.Double.TensorMath as D import qualified Torch.FFI.TH.Double.TensorRandom as D import qualified Torch.FFI.TH.Float.Tensor as F import qualified Torch.FFI.TH.Float.TensorMath as F import qualified Torch.FFI.TH.Float.TensorRandom as F import qualified Torch.FFI.TH.Int.Tensor as I import qualified Torch.FFI.TH.Int.TensorMath as I import qualified Torch.FFI.TH.Int.TensorRandom as I main :: IO () main = hspec spec spec :: Spec spec = describe "Math" $ do it "Can initialize values with the fill method" $ do t1 <- D.c_newWithSize2d nullPtr 2 2 D.c_fill nullPtr t1 3.1 r <- D.c_get2d nullPtr t1 0 0 r `shouldBe` (3.1 :: CDouble) D.c_free nullPtr t1 it "Can invert double values with cinv" $ do t1 <- D.c_newWithSize2d nullPtr 3 2 D.c_fill nullPtr t1 2.0 result <- D.c_newWithSize2d nullPtr 3 2 D.c_cinv nullPtr result t1 r <- D.c_get2d nullPtr result 0 0 r `shouldBe` (0.5 :: CDouble) r <- D.c_get2d nullPtr t1 0 0 r `shouldBe` (2.0 :: CDouble) D.c_free nullPtr t1 D.c_free nullPtr result -- cinv doesn't seem to be excluded by the preprocessor, yet is not implemented -- for Int -- it "Can invert int values with cinv (?)" $ do -- t1 <- c_THIntTensor_newWithSize2d 3 2 -- c_THIntTensor_fill t1 2 -- result <- c_THIntTensor_newWithSize2d 3 2 -- c_THIntTensor_cinv result t1 -- c_THIntTensor_get2d result 0 0 `shouldBe` (0 :: CInt) -- c_THIntTensor_get2d t1 0 0 `shouldBe` (2 :: CInt) -- c_THIntTensor_free t1 -- c_THIntTensor_free result