Arrays from the basic array
package are already very powerful
compared with arrays in other languages.
They may have any number of dimensions, are type safe
and defined in a uniform way using the Ix class
with free choice of the lower bounds (0, 1, or whatever you like).
This package goes one step further:
The shape and the index type are different,
but the index type is a type function of the shape type.
This offers much more flexibility and type safety.
Some Shape
example types are:
Range
:
Allow dynamic choice of lower and upper array bounds
such as in the Array
s from the array
package.
You can combine it with other shapes in other dimensions.
It allows you to describe the bounds of each dimension individually.
Shifted
:
Describe array bounds by start index and length.
It is sometimes more natural to use these parameters.
E.g. a non-negative index type like Word
cannot represent -1
and thus cannot encode an empty range starting with index 0
.
ZeroBased, OneBased
:
Arrays with fixed lower bound, either 0 or 1, respectively.
Cyclic
:
Indices with wrap-around semantics.
Zero, ()
:
Arrays with fixed size 0 or 1, respectively.
Enumeration
:
Arrays with indices like LT
, EQ
, GT
and a shape of fixed size.
NestedTuple
:
Arrays with shapes that are compatible to nested tuples
like (a,(a,a))
and indices like fst
and fst.snd
.
(::+)
:
The Append type constructor allows to respresent block arrays,
e.g. block matrices.
It also allows to represent non-empty arrays via ()::+sh
.
Set
: Use an arbitrary ordered set as index set.
Map
: Concatenate a set of shapes.
In a higher dimensional array it can be used for block matrices
with a dynamic number of blocks but block sizes of the same shape type.
Triangular
:
A 2D array with the shape of a lower or upper triangular matrix.
Simplex
:
Simplices of any dimension, where the dimension is encoded in the type.
An index is a tuple of monotonic ordered sub-indices.
Square
: A 2D array where both dimensions always have equal size.
Cube
: A 3D array where all three dimensions always have equal size.
Tagged
: Statically distinguish shapes and indices that are isomorphic.
With our Array
type you can perform
Fast Linear Algebra using the packages comfort-blas
and lapack
.
The lapack
package defines even more fancy shapes
like tall rectangular matrices, triangular matrices and banded matrices.
Fast Fourier Transforms using the package comfort-fftw
Fast Linear Programming using the packages
comfort-glpk
, coinor-clp
, highs-lp
Efficient Array Processing via LLVM Just-In-Time code generation
using the package knead
.
See also comfort-graph
for a Graph data structure,
with non-Int node identifiers and flexible edge types.