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.