Changes in 1.4.x¶
Python 3.9 is officially supported.
New algorithms for the multivector inverse
Inverting a non-blade multivector in algebras where \(p = q \le 5\) now falls back on the approach described in [HS17] instead of using a linear algebra approach. This algorithm can be used directly via
clifford.taylor_expansionsmodule for Taylor series of various multivector functions, starting with common trigonometric functions. These functions are additionally exposed via methods on
Random functions now accept an
rngkeyword argument that accepts the object returned by
numpy.random.default_rng(), for deterministic randomness.
Some JIT-ed code is now cached when
cliffordis imported for the very first time, speeding up subsequent imports.
Improved citations in the documentation.
This will be the last release to support Python 3.5 and 3.6, as the former reached its end-of-life during our last release cycle, and the latter is expected to before our next release.
Transparently treating a
MultiVectoras a flat array of coefficients is deprecated, and so
DeprecationWarnings. If the underlying storage order is of interest, use
len(mv)respectively. To obtain the scalar part of a
Changes in 1.3.x¶
Python 3.8 is officially supported. 1.2.0 was pinned to a bad numba version that was incompatible with 3.8.
clifford.transformationsmodule for linear transformations.
Improvements throughout the documentation:
Better overall structure, visible in the docs sidebar.
New tutorials for Conformal Geometric Algebra on visualization and applications.
New tutorial on Working with custom algebras.
New tutorial on Linear transformations.
New links at the top of each notebook tutorial, to run examples from the browser.
Faster algebra construction.
Cl(3)is now 100× faster, and
Cl(6)is 20× faster. This is achieved by deferring product JIT compilation until the product is used for the first time.
Additional testing and assorted improvements for
MultiVector.meet()no longer produces zero erroneously.
mv[e1 + e12]now raises
ValueError, rather than being interpreted as
ip()(the inner product) no longer performs the outer product.
Layout.parse_multivector()supports basis vector names which do not start with e.
val_midpoint_between_lines()now handles the case that the two lines are touching.
val_fit_circle()now correctly selects the first and second eigenvalue regardless of order.
sphere_beyond_plane()now tested and correct.
sphere_behind_plane()now tested and correct.
val_unsign_sphere()is now jitted, as it should have been from the start.
get_nearest_plane_point()correctly returns the conformal point rather than the 3D point.
clifford.grades_presentis deprecated in favor of
MultiVector.grades(), the latter of which now takes an
del mv[i]is no longer legal, the equivalent
mv[i] = 0should be used instead.
Layout.dict_to_multivectorhas been removed. It was accidentally broken in 1.0.5, so there is little point deprecating it.
Layout.basis_names()now returns a
str, rather than a numpy array of
bytes. The result now matches the construction order, rather than being sorted alphabetically. The order of
Layout.metric()has been adjusted for consistency.
Layoutobjects have been removed, as these were an unnecessary intermediate computation that had no need to be public.
Some functions in
clifford.tools.g3chave been renamed:
While this release is compatible with
numbaversion 0.49.0, it is recommended to use 0.48.0 which does not emit as many warnings. See the Installation instructions for how to follow this guidance.
1.3.1: Added compatibility with
Changes in 1.2.x¶
layout.eo, which were added in 1.0.4, have been removed. The first can now be spelt
isinstance(layout, clifford.ConformalLayout), and the other properties now exist only on
clifford.tools.classifymodule has been added for classifying blades.
Layoutobjects print slightly more cleanly in Jupyter notebooks.
Layout.scalaris now integral rather than floating point
Changes in 1.1.x¶
Layout.lcmt. A few releases ago, these existed but were dense. For memory reasons, they were then removed entirely. They have now been reinstated as
sparse.COOmatrix objects, which behave much the same as the original dense arrays.
MultiVectors preserve their data type in addition, subtraction, and products. This means that integers remain integers until combined with floats. Note that this means in principle integer overflow is possible, so working with floats is still recommended. This also adds support for floating point types of other precision, such as
setup.pyis now configured such that
pip2 install cliffordwill not attempt to download this version, since it does not work at all on python 2.
Documentation now includes examples of
mv[(i, j)]would sometimes fail if the indices were not in canonical order.
mv == Noneand
layout == Nonewould crash rather than return
layout.blades_of_grade(0)would not return the list it claimed to return.
Enable code coverage.
Split into smaller files.
Remove python 2 compatibility code, which already no longer worked.
Added a real license.
Convert to NumPy instead of Numeric.
meet()actually work now, but have numerical accuracy problems
changed all of the instances of creating a new MultiVector to create an instance of
self.__class__for proper inheritance
fixed bug in laInv()
fixed the massive confusion about how dot() works
fixed embarrassing bug in gmt generation
fixed dumb bug in
elements()that limited it to 4 dimensions
Konrad Hinsen fixed a few bugs in the conversion to numpy and adding some unit tests.