# sparse-tensor

typesafe tensor algebra library

 Version on this page: 0.2.1.4 LTS Haskell 18.28: 0.2.1.5 Stackage Nightly 2021-12-24: 0.2.1.5 Latest on Hackage: 0.2.1.5

See all snapshots `sparse-tensor` appears in

This version can be pinned in stack with:`sparse-tensor-0.2.1.4@sha256:4ed2a3dc04040e72914f8b9251e63389e01288ec8a2f39f145dfd5d7071bfaee,3258`

#### Module documentation for 0.2.1.4

• Math
Depends on 12 packages(full list with versions):

# The `sparse-tensor` Package   `sparse-tensor` is a Haskell tensor algebra library. It defines the usual tensor algebra functions such as

``````result = t1 &+ t2
``````
• scalar multiplication
``````result = s &. t
``````
• tensor product
``````result = t1 &* t2
``````
• or symmetrizations
``````result = symTens (0,1) t -- symmetrization in first two indices
``````

## The `Tensor` type

Tensor types can be defined with any value type and index types. For example, a tensor type with `n` contravariant and `m` covariant 4-d spacetime indices ranging from 0 to 3 and `Rational` values can be defined as

``````type MyTensor n m  = AbsTensor2 n m Ind3 (SField Rational)
``````

The operations on tensors are type-safe, for example it is not possible to add two tensors of different rank,

``````>>> :set -XDataKinds
>>> (undefined :: MyTensor 0 1) &+ (undefined :: MyTensor 0 2)
``````
``````<interactive>:3:33: error:
• Couldn't match type ‘2’ with ‘1’
[...]
``````

as this causes a type error at compile time.

## Predefined tensors

The package comes with pre-defined tensor types. Basic tensors of these types for applications in mathematical physics are exported by `Math.Tensor.Examples.Gravity`:

``````>>> sequence_ \$ fmap print \$ toListT2' delta3  -- print assocs of spacetime delta
((,),SField (1 % 1))
((,),SField (1 % 1))
((,),SField (1 % 1))
((,),SField (1 % 1))

>>> sequence_ \$ fmap print \$ toListT2' eta     -- print assocs of Minkowski metric
(([],[0,0]),SField ((-1) % 1))
(([],[1,1]),SField (1 % 1))
(([],[2,2]),SField (1 % 1))
(([],[3,3]),SField (1 % 1))

>>> let t = invEta &* epsilon
>>> contrATens1 (0,0) \$ contrATens1 (1,1) t   -- contraction of inverse eta with epsilon
ZeroTensor
``````

It is of course possible to define further custom tensor types and tensors.

`Math.Tensor.LorentzGenerator` exports functionality to generate a basis for the space of Lorentz-invariant tensors of certain rank which obey certain symmetries.

## Automatic differentiation

`sparse-tensor` also supports tensors with functions as values. For such tensors, the package also provides the `partial` function for automatic differentiation. `Math.Tensor.Examples.Gravity.Schwarzschild` exports the Einstein tensor for a Schwarzschild spacetime, calculated from the Schwarzschild metric:

``````>>> let e = einstein 2.0 -- Einstein tensor for Schwarzschild metric with r_s = 2.0
>>> e `evalSec` [1.2, 3.1, 1.3, 2.2] -- evaluate at spacetime point
ZeroTensor
``````

## Symbolic calculations

The package can also handle symbolic tensor values. All manipulations, including differentiation, are then performed on strings which may be passed to a computer algebra engine. `sparse-tensor` itself cannot yet simplify these symbolic values. `Math.Tensor.Examples.Gravity.SchwarzschildSymbolic` exports the Schwarzschild metric with symbolic entries and methods to calculate derived geometric entities:

``````>>> let g  = schwarzschildS
>>> let g' = schwarzschildS'
>>> let gamma = christoffelS g g'
>>> let comps = toListT2 gamma     -- get assocs
>>> print \$ snd \$ comps !! 1       -- component gamma^t_tr
SSymbolic "(1 % 2)*((1/(1 - rs/r))*(diff(1 - rs / r, r)))"
``````

# Changelog

## [0.2.1] - 2019-08-22

• fixed haddock build for ghc 8.6
• fixed numerical instability in gaussian elimination algorithm

## [0.2] - 2019-08-21

• removed singletons from dependencies

• removed eigen from dependencies

• replaced eigen with hmatrix

• added implementation of gaussian elimination based on hmatrix