hasktorch-indef-0.0.1.0: src/Torch/Indef/Dynamic/Tensor/Math/Pointwise/Floating.hs
-------------------------------------------------------------------------------
-- |
-- Module : Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating
-- Copyright : (c) Sam Stites 2017
-- License : BSD3
-- Maintainer: sam@stites.io
-- Stability : experimental
-- Portability: non-portable
-------------------------------------------------------------------------------
{-# OPTIONS_GHC -fno-cse #-}
module Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating
( cinv_ , cinv
, sigmoid_ , sigmoid
, log_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.log
, lgamma_ , lgamma
, log1p_ , log1p
, exp_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.exp
, cos_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.cos
, acos_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.acos
, cosh_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.cosh
, sin_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.sin
, asin_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.asin
, sinh_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.sinh
, tan_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.tan
, atan_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.atan
, tanh_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.tanh
, erf_ , erf
, erfinv_ , erfinv
, pow_ , pow
, tpow_ , tpow
, sqrt_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.sqrt
, rsqrt_ , rsqrt
, ceil_ , ceil
, floor_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.floor
, round_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.round
, trunc_ , trunc
, frac_ , frac
, lerp_ , lerp
, atan2_ , Torch.Indef.Dynamic.Tensor.Math.Pointwise.Floating.atan2
) where
import GHC.Int
import System.IO.Unsafe
import Torch.Indef.Dynamic.Tensor
import qualified Torch.Sig.Tensor.Math.Pointwise.Floating as Sig
import Torch.Indef.Types
-- | Return a new tensor applying @1.0 / x@ to all elements.
cinv :: Dynamic -> Dynamic
cinv t = unsafeDupablePerformIO $ let r = empty in _cinv r t >> pure r
{-# NOINLINE cinv #-}
-- | Inplace version of 'cinv', mutating the first tensor argument.
cinv_ :: Dynamic -> IO ()
cinv_ t = _cinv t t
-- | Returns a new Tensor with the sigmoid of the elements of x.
sigmoid :: Dynamic -> Dynamic
sigmoid t = unsafeDupablePerformIO $ let r = empty in _sigmoid r t >> pure r
{-# NOINLINE sigmoid #-}
-- | Inplace version of 'sigmoid', mutating the first tensor argument.
sigmoid_ :: Dynamic -> IO ()
sigmoid_ t = _sigmoid t t
-- | Returns a new tensor with the natural logarithm of the elements of x.
log :: Dynamic -> Dynamic
log t = unsafeDupablePerformIO $ let r = empty in _log r t >> pure r
{-# NOINLINE log #-}
-- | Inplace version of 'log', mutating the first tensor argument.
log_ :: Dynamic -> IO ()
log_ t = _log t t
-- | Returns a new tensor with the natural logarithm of the absolute value of the gamma function of the elements of x.
lgamma :: Dynamic -> Dynamic
lgamma t = unsafeDupablePerformIO $ let r = empty in _lgamma r t >> pure r
{-# NOINLINE lgamma #-}
-- | Inplace version of 'lgamma', mutating the first tensor argument.
lgamma_ :: Dynamic -> IO ()
lgamma_ t = _lgamma t t
-- | Returns a new tensor with the natural logarithm of the elements of x + 1.
--
-- This function is more accurate than log for small values of x.
log1p :: Dynamic -> Dynamic
log1p t = unsafeDupablePerformIO $ let r = empty in _log1p r t >> pure r
{-# NOINLINE log1p #-}
-- | Inplace version of 'log1p', mutating the first tensor argument.
log1p_ :: Dynamic -> IO ()
log1p_ t = _log1p t t
-- | Returns, for each element in x, e (Neper number, the base of
-- natural logarithms) raised to the power of the element in x.
exp :: Dynamic -> Dynamic
exp t = unsafeDupablePerformIO $ let r = empty in _exp r t >> pure r
{-# NOINLINE exp #-}
-- | Inplace version of 'exp', mutating the first tensor argument.
exp_ :: Dynamic -> IO ()
exp_ t = _exp t t
-- | Returns a new tensor with the cosine of the elements of x.
cos :: Dynamic -> Dynamic
cos t = unsafeDupablePerformIO $ let r = empty in _cos r t >> pure r
{-# NOINLINE cos #-}
-- | Inplace version of 'cos', mutating the first tensor argument.
cos_ :: Dynamic -> IO ()
cos_ t = _cos t t
-- | Returns a new tensor with the arcosine of the elements of x.
acos :: Dynamic -> Dynamic
acos t = unsafeDupablePerformIO $ let r = empty in _acos r t >> pure r
{-# NOINLINE acos #-}
-- | Inplace version of 'acos', mutating the first tensor argument.
acos_ :: Dynamic -> IO ()
acos_ t = _acos t t
-- | Returns a new tensor with the hyberbolic cosine of the elements of x.
cosh :: Dynamic -> Dynamic
cosh t = unsafeDupablePerformIO $ let r = empty in _cosh r t >> pure r
{-# NOINLINE cosh #-}
-- | Inplace version of 'cosh', mutating the first tensor argument.
cosh_ :: Dynamic -> IO ()
cosh_ t = _cosh t t
-- | Returns a new tensor with the sine of the elements of x.
sin :: Dynamic -> Dynamic
sin t = unsafeDupablePerformIO $ let r = empty in _sin r t >> pure r
{-# NOINLINE sin #-}
-- | Inplace version of 'sin', mutating the first tensor argument.
sin_ :: Dynamic -> IO ()
sin_ t = _sin t t
-- | Returns a new tensor with the arcsine of the elements of x.
asin :: Dynamic -> Dynamic
asin t = unsafeDupablePerformIO $ let r = empty in _asin r t >> pure r
{-# NOINLINE asin #-}
-- | Inplace version of 'asin', mutating the first tensor argument.
asin_ :: Dynamic -> IO ()
asin_ t = _asin t t
-- | Returns a new tensor with the hyperbolic sine of the elements of x.
sinh :: Dynamic -> Dynamic
sinh t = unsafeDupablePerformIO $ let r = empty in _sinh r t >> pure r
{-# NOINLINE sinh #-}
-- | Inplace version of 'sinh', mutating the first tensor argument.
sinh_ :: Dynamic -> IO ()
sinh_ t = _sinh t t
-- | Returns a new tensor with the tangent of the elements of x.
tan :: Dynamic -> Dynamic
tan t = unsafeDupablePerformIO $ let r = empty in _tan r t >> pure r
{-# NOINLINE tan #-}
-- | Inplace version of 'tan', mutating the first tensor argument.
tan_ :: Dynamic -> IO ()
tan_ t = _tan t t
-- | Returns a new tensor with the arctangent of the elements of x.
atan :: Dynamic -> Dynamic
atan t = unsafeDupablePerformIO $ let r = empty in _atan r t >> pure r
{-# NOINLINE atan #-}
-- | Inplace version of 'atan', mutating the first tensor argument.
atan_ :: Dynamic -> IO ()
atan_ t = _atan t t
-- | Returns a new tensor with the hyperbolic tangent of the elements of x.
tanh :: Dynamic -> Dynamic
tanh t = unsafeDupablePerformIO $ let r = empty in _tanh r t >> pure r
{-# NOINLINE tanh #-}
-- | Inplace version of 'tanh', mutating the first tensor argument.
tanh_ :: Dynamic -> IO ()
tanh_ t = _tanh t t
-- | Returns a new tensor with the gauss error function applied to the elements of x.
--
-- The error function comes from https://en.wikipedia.org/wiki/Error_function
erf :: Dynamic -> Dynamic
erf t = unsafeDupablePerformIO $ let r = empty in _erf r t >> pure r
{-# NOINLINE erf #-}
-- | Inplace version of 'erf', mutating the first tensor argument.
erf_ :: Dynamic -> IO ()
erf_ t = _erf t t
-- | Returns a new tensor with the inverse gauss error function applied to the elements of x.
--
-- See https://en.wikipedia.org/wiki/Error_function for the gauss error function. This is its inverse.
erfinv :: Dynamic -> Dynamic
erfinv t = unsafeDupablePerformIO $ let r = empty in _erfinv r t >> pure r
{-# NOINLINE erfinv #-}
-- | Inplace version of 'erfinv', mutating the first tensor argument.
erfinv_ :: Dynamic -> IO ()
erfinv_ t = _erfinv t t
-- | Returns a new tensor with the elements of @x@ to the power of @n@.
pow :: Dynamic -> HsReal -> Dynamic
pow t v = unsafeDupablePerformIO $ let r = empty in _pow r t v >> pure r
{-# NOINLINE pow #-}
-- | Inplace version of 'pow', mutating the first tensor argument.
pow_ :: Dynamic -> HsReal -> IO ()
pow_ t v = _pow t t v
-- | Returns a new tensor with the scalar @n@, raised to the power of each element in the tensor @x@.
tpow
:: HsReal -- ^ base scalar @n@
-> Dynamic -- ^ tensor @x@ of powers to raise @n@ by.
-> Dynamic
tpow v t = unsafeDupablePerformIO $ let r = empty in _tpow r v t >> pure r
{-# NOINLINE tpow #-}
-- | Inplace version of 'tpow', mutating the first tensor argument.
tpow_ :: HsReal -> Dynamic -> IO ()
tpow_ v t = _tpow t v t
-- | Returns a new tensor with the square root of the elements of x.
sqrt :: Dynamic -> Dynamic
sqrt t = unsafeDupablePerformIO $ let r = empty in _sqrt r t >> pure r
{-# NOINLINE sqrt #-}
-- | Inplace version of 'sqrt', mutating the first tensor argument.
sqrt_ :: Dynamic -> IO ()
sqrt_ t = _sqrt t t
-- | Returns a new tensor with the reciprocal of the square root of the elements of x.
rsqrt :: Dynamic -> Dynamic
rsqrt t = unsafeDupablePerformIO $ let r = empty in _rsqrt r t >> pure r
{-# NOINLINE rsqrt #-}
-- | Inplace version of 'rsqrt', mutating the first tensor argument.
rsqrt_ :: Dynamic -> IO ()
rsqrt_ t = _rsqrt t t
-- | Returns a new tensor with the values of the elements of x
-- rounded up to the nearest integers.
ceil :: Dynamic -> Dynamic
ceil t = unsafeDupablePerformIO $ let r = empty in _ceil r t >> pure r
{-# NOINLINE ceil #-}
-- | Inplace version of 'ceil', mutating the first tensor argument.
ceil_ :: Dynamic -> IO ()
ceil_ t = _ceil t t
-- | Returns a new Tensor with the values of the elements of x
-- rounded down to the nearest integers.
floor :: Dynamic -> Dynamic
floor t = unsafeDupablePerformIO $ let r = empty in _floor r t >> pure r
{-# NOINLINE floor #-}
-- | Inplace version of 'floor', mutating the first tensor argument.
floor_ :: Dynamic -> IO ()
floor_ t = _floor t t
-- | Returns a new tensor with the values of the elements of x
-- rounded to the nearest integers.
--
-- FIXME: The lua docs don't state how this rounding works. Someone
-- should read the source code and document this.
round :: Dynamic -> Dynamic
round t = unsafeDupablePerformIO $ let r = empty in _round r t >> pure r
{-# NOINLINE round #-}
-- | Inplace version of 'round', mutating the first tensor argument.
round_ :: Dynamic -> IO ()
round_ t = _round t t
-- | Returns a new tensor with the truncated integer values of the
-- elements of x.
--
-- FIXME: The lua docs don't state how this truncation works. Someone
-- should read the source code, document this, and explain how this
-- differs from 'floor'.
trunc :: Dynamic -> Dynamic
trunc t = unsafeDupablePerformIO $ let r = empty in _trunc r t >> pure r
{-# NOINLINE trunc #-}
-- | Inplace version of 'trunc', mutating the first tensor argument.
trunc_ :: Dynamic -> IO ()
trunc_ t = _trunc t t
-- | Returns a new tensor with the fractional portion of the elements
-- of x.
frac :: Dynamic -> Dynamic
frac t = unsafeDupablePerformIO $ let r = empty in _frac r t >> pure r
{-# NOINLINE frac #-}
-- | Inplace version of 'frac', mutating the first tensor argument.
frac_ :: Dynamic -> IO ()
frac_ t = _frac t t
-- | Linear interpolation of two scalars or tensors based on a weight:
--
-- @
-- res = a + weight * (b - a)
-- @
lerp :: Dynamic -> Dynamic -> HsReal -> Dynamic
lerp a b v = unsafeDupablePerformIO $ let r = empty in _lerp r a b v >> pure r
{-# NOINLINE lerp #-}
-- | Inplace version of 'lerp', mutating the first tensor argument.
lerp_ :: Dynamic -> Dynamic -> HsReal -> IO ()
lerp_ a b v = _lerp a a b v
-- | Returns a new tensor with the arctangent of the elements
-- of x and y. Note that the arctangent of the elements x and y
-- refers to the signed angle in radians between the rays ending
-- at origin where the first one starts at (1, 0) and the second
-- at (y, x).
atan2 :: Dynamic -> Dynamic -> Dynamic
atan2 a b = unsafeDupablePerformIO $ let r = empty in _atan2 r a b >> pure r
{-# NOINLINE atan2 #-}
-- | Inplace version of 'atan2', mutating the first tensor argument.
atan2_ :: Dynamic -> Dynamic -> IO ()
atan2_ a b = _atan2 a a b
-- class CPUTensorMathPointwiseFloating t where
-- histc_ :: Dynamic -> Dynamic -> Int64 -> HsReal -> HsReal -> IO ()
-- bhistc_ :: Dynamic -> Dynamic -> Int64 -> HsReal -> HsReal -> IO ()
-- ========================================================================= --
-- C-style functions
_cinv, _sigmoid, _log, _lgamma, _log1p, _exp, _cos, _acos, _sinh
:: Dynamic -> Dynamic -> IO ()
_cinv a b = with2DynamicState a b Sig.c_cinv
_sigmoid a b = with2DynamicState a b Sig.c_sigmoid
_log a b = with2DynamicState a b Sig.c_log
_lgamma a b = with2DynamicState a b Sig.c_lgamma
_log1p a b = with2DynamicState a b Sig.c_log1p
_exp a b = with2DynamicState a b Sig.c_exp
_cos a b = with2DynamicState a b Sig.c_cos
_acos a b = with2DynamicState a b Sig.c_acos
_sinh a b = with2DynamicState a b Sig.c_sinh
_asin, _cosh, _sin, _tan, _atan, _tanh, _erf, _erfinv, _sqrt
:: Dynamic -> Dynamic -> IO ()
_asin a b = with2DynamicState a b Sig.c_asin
_cosh a b = with2DynamicState a b Sig.c_cosh
_sin a b = with2DynamicState a b Sig.c_sin
_tan a b = with2DynamicState a b Sig.c_tan
_atan a b = with2DynamicState a b Sig.c_atan
_tanh a b = with2DynamicState a b Sig.c_tanh
_erf a b = with2DynamicState a b Sig.c_erf
_erfinv a b = with2DynamicState a b Sig.c_erfinv
_sqrt a b = with2DynamicState a b Sig.c_sqrt
_rsqrt, _ceil, _floor, _round, _trunc, _frac
:: Dynamic -> Dynamic -> IO ()
_rsqrt a b = with2DynamicState a b Sig.c_rsqrt
_ceil a b = with2DynamicState a b Sig.c_ceil
_floor a b = with2DynamicState a b Sig.c_floor
_round a b = with2DynamicState a b Sig.c_round
_trunc a b = with2DynamicState a b Sig.c_trunc
_frac a b = with2DynamicState a b Sig.c_frac
_atan2 :: Dynamic -> Dynamic -> Dynamic -> IO ()
_atan2 a b c = with3DynamicState a b c Sig.c_atan2
_pow :: Dynamic -> Dynamic -> HsReal -> IO ()
_pow a b v = withLift $ Sig.c_pow
<$> managedState
<*> managedTensor a
<*> managedTensor b
<*> pure (hs2cReal v)
_tpow :: Dynamic -> HsReal -> Dynamic -> IO ()
_tpow a v b = with2DynamicState a b $ \s' a' b' -> Sig.c_tpow s' a' (hs2cReal v) b'
_lerp :: Dynamic -> Dynamic -> Dynamic -> HsReal -> IO ()
_lerp a b c v = with3DynamicState a b c $ \s' a' b' c' -> Sig.c_lerp s' a' b' c' (hs2cReal v)