dimensions alternatives and similar packages
Based on the "Geometry" category
Do you think we are missing an alternative of dimensions or a related project?
Easytensor: many-dimensional type-safe numeric ops
The project consists of two parts:
dimensionsis a library to support type-level operations on lists of dimensions;
easytensorwraps low-level operations on primitive byte arrays in a type-safe data type indexed over an element type and a list of dimensions.
Data.Type.Lits provide type-level operations on lists,
Numeric.TypedList is the core module providing a typelist-indexed type that is, in fact, just a newtype wrapper on a plain haskell list.
TypedList (f :: k -> Type) (xs :: [k]) represents a lot of things; by changing type parameter
f, I use
TypedList as a flexible (yet typesafe) tuple, a finite dimensions list, or an index over such a list.
- promoted type
XNat = N Nat | XNsimilar to type
XNatis used for type variables when some of dimensions in a type-level list are not known at compile time;
- data type
Dims (ds :: [k]), where
XNat, together with class
Dimensions dsit allows lots of type-level operations on type-level dimensionality;
- data type
Idxs (ds :: [k])is used to index over many-dimensional space defined by
This library aims at providing fast, simple, and useful geometry types for use in computer graphics and low-dimensional physics modelling.
All geometry types implement standard
Prelude numerical classes, such as
favouring element-wise operations:
/ are all element-wise.
Common matrix and vector operations are provided separately.
DataFrame is presented in two versions:
DataFrame t (ds :: [Nat])- dimensionality of a dataframe is totally known at compile time.
DataFrame t (ds :: [XNat]- some dimensions may be known at runtime only.
t of a DataFrame can be arbitrary type that has an instance of
PrimBytes typeclass can be automatically derived using
This mechanics allows creating interleaved arrays, e.g.
DataFrame (Double, Float, Float) ds.
t of a
DataFrame can also be a list of
DataFrame consists of several "columns" or "variables" of different types and same dimensionality.
Behind the scenes all data types are implemented as primitive values or primitive byte arrays, aiming at maximum performance.
Tricky layers of newtypes and closed type families (which are not exposed to a user) allow some kind of ad-hoc polymorphism:
Vector t n implemented as
ByteArray# is overloaded by a specialized
FloatX2 Float# Float# in case of
Vector Float 2.
Supported GHC versions
The packages are tested on GHC 8.4+.
dimensions may work on GHC 8.2, but the corresponding tests were dropped.
easytensor on GHC 8.2 was dropped due to:
What have changed since version 1
Everything! In general, v2 of
easytensor is meant to show an expectable behavior:
Readinstances look like automatically-generated instances for algebraic data types.
- 0-based indexing instead of 1-based indexing makes conversion between offsets, indices, and
- Order of dimensions in
Dimslist is reversed (the first dimension is "the most significant"), thus making
Idxscoincide with conventional Haskell lexicographic ordering. The implication of this is the next two points.
Ordinstances are now proper total lexicographic ordering.
DataFramelayout now is row-first instead of column-first. Therefore, to keep low-level SIMD optimizations of 3D geometry possible, I've had to transpose all matrices in
Datainstances that make these datatypes look like ordinary algebraic data types.
- More obvious ways to construct
DataFrames from pieces.
- Removed all declarations and modules that may look controversial or do not belong here.
- Just added more tests and focused on the core functionality and correctness :)