Copyright | (c) 2016 Jiasen Wu |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Jiasen Wu <jiasenwu@hotmail.com> |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
This module supplies a backend for the neural-network-base package. This backend is implemented on top of the blas-hs package and optimised with SIMD.
- newtype DenseVector a = DenseVector (IOVector a)
- data DenseMatrix a = DenseMatrix !Int !Int !(IOVector a)
- data DenseMatrixArray a = DenseMatrixArray !Int !Int !Int !(IOVector a)
- newDenseVector :: Storable a => Int -> IO (DenseVector a)
- newDenseVectorCopy :: Storable a => DenseVector a -> IO (DenseVector a)
- newDenseVectorConst :: Storable a => Int -> a -> IO (DenseVector a)
- newDenseVectorByGen :: Storable a => IO a -> Int -> IO (DenseVector a)
- newDenseMatrix :: Storable a => Int -> Int -> IO (DenseMatrix a)
- newDenseMatrixConst :: Storable a => Int -> Int -> a -> IO (DenseMatrix a)
- newDenseMatrixCopy :: Storable a => DenseMatrix a -> IO (DenseMatrix a)
- newDenseMatrixArray :: Storable a => Int -> Int -> Int -> IO (DenseMatrixArray a)
- class Size a where
- type Dim a
- denseVectorToVector :: Storable a => DenseVector a -> IO (Vector a)
- denseVectorConcat :: Storable a => Vector (DenseVector a) -> IO (DenseVector a)
- denseVectorSplit :: Storable a => Int -> Int -> DenseVector a -> Vector (DenseVector a)
- denseMatrixArrayAt :: Storable a => DenseMatrixArray a -> Int -> DenseMatrix a
- denseMatrixArrayToVector :: Storable a => DenseMatrixArray a -> Vector (DenseMatrix a)
- denseMatrixArrayFromVector :: Storable a => Vector (DenseMatrix a) -> IO (DenseMatrixArray a)
- v2m :: Int -> Int -> DenseVector a -> DenseMatrix a
- m2v :: DenseMatrix a -> DenseVector a
- v2ma :: Storable a => Int -> Int -> Int -> DenseVector a -> DenseMatrixArray a
- ma2v :: DenseMatrixArray a -> DenseVector a
- data Op :: (* -> *) -> * -> * where
- (:<#) :: DenseVector a -> DenseMatrix a -> Op DenseVector a
- (:#>) :: DenseMatrix a -> DenseVector a -> Op DenseVector a
- (:<>) :: DenseMatrix a -> DenseMatrix a -> Op DenseMatrix a
- (:##) :: DenseVector a -> DenseVector a -> Op DenseMatrix a
- (:.*) :: c a -> c a -> Op c a
- (:.+) :: c a -> c a -> Op c a
- Scale :: a -> Op c a
- Apply :: (SIMDPACK a -> SIMDPACK a) -> Op c a
- ZipWith :: (SIMDPACK a -> SIMDPACK a -> SIMDPACK a) -> c a -> c a -> Op c a
- Scale' :: a -> Op c a -> Op c a
- UnsafeM2MA :: Op DenseMatrix a -> Op DenseMatrixArray a
- class AssignTo c a where
- sumElements :: (Storable a, Num a) => DenseMatrix a -> IO a
- corr2 :: (Storable a, Numeric a) => Int -> Vector (DenseMatrix a) -> DenseMatrix a -> (Op DenseMatrixArray a -> IO b) -> IO b
- conv2 :: (Storable a, Numeric a) => Int -> Vector (DenseMatrix a) -> DenseMatrix a -> (Op DenseMatrixArray a -> IO b) -> IO b
- pool :: Int -> DenseMatrix Float -> IO (DenseVector Int, DenseMatrix Float)
- unpool :: Int -> DenseVector Int -> DenseMatrix Float -> IO (DenseMatrix Float)
- transpose :: Storable a => Vector (DenseMatrixArray a) -> IO (Vector (Vector (DenseMatrix a)))
- data ByBLASHS = ByBLASHS
- data ErrCode = ErrMismatch
- cost' :: SIMDPACK Float -> SIMDPACK Float -> SIMDPACK Float
Documentation
newtype DenseVector a Source #
mutable vector type
DenseVector (IOVector a) |
(Numeric a, Storable a, SIMDable a) => AssignTo DenseVector a Source # | |
Storable a => Size (DenseVector a) Source # | |
type Dim (DenseVector a) Source # | |
data DenseMatrix a Source #
mutable matrix type (row-major)
DenseMatrix !Int !Int !(IOVector a) |
(Numeric a, Storable a, SIMDable a) => AssignTo DenseMatrix a Source # | |
Storable a => Size (DenseMatrix a) Source # | |
type Dim (DenseMatrix a) Source # | |
data DenseMatrixArray a Source #
array of DenseMatrix, which are identical in size.
DenseMatrixArray !Int !Int !Int !(IOVector a) |
(Numeric a, Storable a, SIMDable a) => AssignTo DenseMatrixArray a Source # | |
Storable a => Size (DenseMatrixArray a) Source # | |
type Dim (DenseMatrixArray a) Source # | |
newDenseVector :: Storable a => Int -> IO (DenseVector a) Source #
create a new DenseVector
newDenseVectorCopy :: Storable a => DenseVector a -> IO (DenseVector a) Source #
create a copy DenseVector
from another
newDenseVectorConst :: Storable a => Int -> a -> IO (DenseVector a) Source #
create a new DenseVector
of some constant
newDenseVectorByGen :: Storable a => IO a -> Int -> IO (DenseVector a) Source #
create a new DenseVector
by a random generator
:: Storable a | |
=> Int | number of rows |
-> Int | number of columns |
-> IO (DenseMatrix a) |
create a new DenseMatrix
newDenseMatrixConst :: Storable a => Int -> Int -> a -> IO (DenseMatrix a) Source #
create a new DenseMatrix
of some constant
newDenseMatrixCopy :: Storable a => DenseMatrix a -> IO (DenseMatrix a) Source #
create a copy DenseMatrix
from another
:: Storable a | |
=> Int | number of DenseMatrix |
-> Int | number of rows |
-> Int | number of columns |
-> IO (DenseMatrixArray a) |
create a new DenseMatrixArray
The Size class provides a interface to tell the dimension of a dense-vector, dense-matrix, or dense-matrix-array.
Storable a => Size (DenseMatrixArray a) Source # | |
Storable a => Size (DenseMatrix a) Source # | |
Storable a => Size (DenseVector a) Source # | |
denseVectorToVector :: Storable a => DenseVector a -> IO (Vector a) Source #
convert a DenseVector
to a vector of elements
denseVectorConcat :: Storable a => Vector (DenseVector a) -> IO (DenseVector a) Source #
concatenate a vector of DenseVector
s.
If all the dense-vectors are orignally placed consecutively in storage, the result
is simply a type-cast. Otherwise, a new storage is obtained, and dense-vectors are
copied.
denseVectorSplit :: Storable a => Int -> Int -> DenseVector a -> Vector (DenseVector a) Source #
split a DenseVector
into a vector of DenseVector
s.
denseMatrixArrayAt :: Storable a => DenseMatrixArray a -> Int -> DenseMatrix a Source #
get the DenseMatrix
from DenseMatrixArray
at some position
denseMatrixArrayToVector :: Storable a => DenseMatrixArray a -> Vector (DenseMatrix a) Source #
convert DenseMatrixArray
to a vector of DenseMatrix
(no copy)
denseMatrixArrayFromVector :: Storable a => Vector (DenseMatrix a) -> IO (DenseMatrixArray a) Source #
convert a vector of DenseMatrix
to DenseMatrixArray
If all the matrices are orignally placed consecutively in storage, the result
is simply a type-cast. Otherwise, a new storage is obtained, and matrices are
copied.
v2m :: Int -> Int -> DenseVector a -> DenseMatrix a Source #
type cast from DenseVector
to DenseMatrix
m2v :: DenseMatrix a -> DenseVector a Source #
type cast from DenseMatrix
to DenseVector
v2ma :: Storable a => Int -> Int -> Int -> DenseVector a -> DenseMatrixArray a Source #
type cast from DenseVector
to DenseMatrixArray
ma2v :: DenseMatrixArray a -> DenseVector a Source #
type cast from DenseMatrixArray
to DenseVector
data Op :: (* -> *) -> * -> * where Source #
Operations that abstract the low-level details of blas-hs
(:<#) :: DenseVector a -> DenseMatrix a -> Op DenseVector a infix 4 | vector (as-row) and matrix production |
(:#>) :: DenseMatrix a -> DenseVector a -> Op DenseVector a infix 4 | matrix and vector (as-column) product |
(:<>) :: DenseMatrix a -> DenseMatrix a -> Op DenseMatrix a infix 4 | matrix and matrix product. This is a specially customized matrix matrix product, for the sake of quick convolution. The 1st matrix is transposed before multiplication, and the result matrix is stored in column-major mode. |
(:##) :: DenseVector a -> DenseVector a -> Op DenseMatrix a infix 4 | vector and vector outer-product |
(:.*) :: c a -> c a -> Op c a infix 4 | pairwise product of vector or matrix |
(:.+) :: c a -> c a -> Op c a infix 4 | pairwise sum of vector or matrix |
Scale :: a -> Op c a | scale of vector or matrix |
Apply :: (SIMDPACK a -> SIMDPACK a) -> Op c a | apply a SIMD-enabled function |
ZipWith :: (SIMDPACK a -> SIMDPACK a -> SIMDPACK a) -> c a -> c a -> Op c a | zip with a SIMD-enabled function |
Scale' :: a -> Op c a -> Op c a | scale the result of some op. It is possible to combine scale and many other operations in a single BLAS call. |
UnsafeM2MA :: Op DenseMatrix a -> Op DenseMatrixArray a | interpret an op to matrix as an op to matrixarray, where each row becomes a matrix. This Op is only used internally inside this module |
class AssignTo c a where Source #
Perform an operation
sumElements :: (Storable a, Num a) => DenseMatrix a -> IO a Source #
sum up all elements in the DenseMatrix
:: (Storable a, Numeric a) | |
=> Int | number of 0s padded around |
-> Vector (DenseMatrix a) | vector of kernels |
-> DenseMatrix a | matrix to be operated |
-> (Op DenseMatrixArray a -> IO b) | how to perform the final operation |
-> IO b |
2D correlation. Apply a vector of kernels to a dense-matrix with some zero-padding.
:: (Storable a, Numeric a) | |
=> Int | number of 0s padded around |
-> Vector (DenseMatrix a) | vector of kernels |
-> DenseMatrix a | matrix to be operated |
-> (Op DenseMatrixArray a -> IO b) | how to perform the final operation |
-> IO b |
2D convolution. Apply a vector of kernels to a dense-matrix with some zero-padding.
pool :: Int -> DenseMatrix Float -> IO (DenseVector Int, DenseMatrix Float) Source #
max-pooling, picking out the maximum element in each stride x stride sub-matrices. Assuming that the original matrix row and column size are both multiple of stride.
unpool :: Int -> DenseVector Int -> DenseMatrix Float -> IO (DenseMatrix Float) Source #
The reverse of max-pooling.
transpose :: Storable a => Vector (DenseMatrixArray a) -> IO (Vector (Vector (DenseMatrix a))) Source #
transpose a vector of DenseMatrixArray
The result is vector of vector of DenseMatrix
, because the matrices are
no longer placed consecutively in storage.
The backend data type