module Data.Vector.Dense.Class.Operations (
getConjVector,
getScaledVector,
getShiftedVector,
getAddVector,
getSubVector,
getMulVector,
getDivVector,
addVector,
subVector,
axpyVector,
mulVector,
divVector,
unsafeGetAddVector,
unsafeGetSubVector,
unsafeGetMulVector,
unsafeGetDivVector,
unsafeAddVector,
unsafeSubVector,
unsafeAxpyVector,
unsafeMulVector,
unsafeDivVector,
) where
import BLAS.Elem( BLAS1 )
import BLAS.Internal( checkBinaryOp )
import BLAS.Tensor( BaseTensor(..) )
import Data.Vector.Dense.Class.Internal
getConjVector :: (ReadVector x m, WriteVector y m, BLAS1 e) =>
x n e -> m (y n e)
getConjVector = getUnaryOp doConjVector
getScaledVector :: (ReadVector x m, WriteVector y m, BLAS1 e) =>
e -> x n e -> m (y n e)
getScaledVector e = getUnaryOp (scaleByVector e)
getShiftedVector :: (ReadVector x m, WriteVector y m, BLAS1 e) =>
e -> x n e -> m (y n e)
getShiftedVector e = getUnaryOp (shiftByVector e)
getAddVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
getAddVector = checkTensorOp2 unsafeGetAddVector
unsafeGetAddVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
unsafeGetAddVector = unsafeGetBinaryOp unsafeAddVector
getSubVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
getSubVector = checkTensorOp2 unsafeGetSubVector
unsafeGetSubVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
unsafeGetSubVector = unsafeGetBinaryOp unsafeSubVector
getMulVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
getMulVector = checkTensorOp2 unsafeGetMulVector
unsafeGetMulVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
unsafeGetMulVector = unsafeGetBinaryOp unsafeMulVector
getDivVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
getDivVector = checkTensorOp2 unsafeGetDivVector
unsafeGetDivVector ::
(ReadVector x m, ReadVector y m, WriteVector z m, BLAS1 e) =>
x n e -> y n e -> m (z n e)
unsafeGetDivVector = unsafeGetBinaryOp unsafeDivVector
axpyVector :: (ReadVector x m, WriteVector y m, BLAS1 e) =>
e -> x n e -> y n e -> m ()
axpyVector alpha x y =
checkBinaryOp (shape x) (shape y) $ unsafeAxpyVector alpha x y
addVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
addVector y x = checkBinaryOp (dim y) (dim x) $ unsafeAddVector y x
unsafeAddVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
unsafeAddVector y x = unsafeAxpyVector 1 x y
subVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
subVector y x = checkBinaryOp (dim y) (dim x) $ unsafeSubVector y x
unsafeSubVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
unsafeSubVector y x = unsafeAxpyVector (1) x y
mulVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
mulVector y x =
checkBinaryOp (shape y) (shape x) $ unsafeMulVector y x
divVector :: (WriteVector y m, ReadVector x m, BLAS1 e) =>
y n e -> x n e -> m ()
divVector y x =
checkBinaryOp (shape y) (shape x) $ unsafeDivVector y x
checkTensorOp2 :: (BaseTensor x i, BaseTensor y i) =>
(x n e -> y n e -> a) ->
x n e -> y n e -> a
checkTensorOp2 f x y =
checkBinaryOp (shape x) (shape y) $ f x y
getUnaryOp :: (ReadVector x m, WriteVector y m, BLAS1 e) =>
(y n e -> m ()) -> x n e -> m (y n e)
getUnaryOp f x = do
y <- newCopyVector x
f y
return y
unsafeGetBinaryOp ::
(WriteVector z m, ReadVector x m, ReadVector y m, BLAS1 e) =>
(z n e -> y n e -> m ()) ->
x n e -> y n e -> m (z n e)
unsafeGetBinaryOp f x y = do
z <- newCopyVector x
f z y
return z