# Tensor for F#

A *tensor* is an n-dimensional array of an arbitrary data type (for example `single`

or `double`

).
Tensors of data type `'T`

are implemented by the Tensor<'T> type.

A tensor can be either stored in host memory or in the memory of a GPU computing device. Currently only nVidia cards implementing the CUDA API are supported. The API for host and GPU stored tensors is mostly equal, thus a program can make use of GPU accelerated operations without porting effort.

The tensor library provides functionality similar to Numpy's Ndarray and MATLAB arrays, including vector-wise operations, reshaping, slicing, broadcasting, masked assignment, reduction operations and BLAS operations.

This open source library is written in F# and targets the .NET Standard 2.0 platform with Linux, MacOS and Microsoft Windows as supported operating systems.

### Features provided by the core Tensor library

- Core features
- n-dimensional arrays (tensors) in host memory or on CUDA GPUs
- element-wise operations (addition, multiplication, absolute value, etc.)
- basic linear algebra operations (dot product, SVD decomposition, matrix inverse, etc.)
- reduction operations (sum, product, average, maximum, arg max, etc.)
- logic operations (comparison, and, or, etc.)
- views, slicing, reshaping, broadcasting (similar to NumPy)
- scatter and gather by indices
- standard functional operations (map, fold, etc.)

- Data exchange
- read/write support for HDF5 (.h5)
- interop with standard F# types (Seq, List, Array, Array2D, Array3D, etc.)

- Performance
- host: SIMD and Intel MKL accelerated operations
- CUDA GPU: all operations performed locally on GPU and cuBLAS used for matrix operations

### Additional features provided by Tensor.Algorithm

- Matrix algebra (integer, rational)
- Row echelon form
- Smith normal form
- Kernel, co-kernel and (pseudo-)inverse

- Matrix decomposition (floating point)
- Principal component analysis (PCA)
- ZCA whitening

- Misc
- Bezout's identity
- Loading of NumPy's .npy and .npz files.

## News

**2018/05/07**. Packages are now available on public NuGet. Tensor NuGet package and Tensor.Algorithm NuGet package.**2018/05/05**. The CUDA SDK is no longer required for using GPU acceleration. An up-to-date nVidia GPU driver must be installed, however.**2018/05/02**. Initial benchmarks are available.

## Documentation

To get an overview of available functions by category, see Tensor at a glance. We also provide full reference documentation.

To start using the library, follow the installation guide and the getting started guide.

## Example

Check out our example project that demonstrates essential features of the library at https://github.com/DeepMLNet/Tensor.Sample.

## Authors

Sebastian Urban

Marcus Basalla

Johannes Langer

Wiebke Köpp