- :support:`83` This is the last release to support Python 2.7.
- :feature:`195` Deprecate confusing parts of the public API:
* :meth:`galgebra.ga.Ga.mv_I`, which was a bad way to spell :meth:`galgebra.ga.Ga.E`.
* :meth:`galgebra.ga.Ga.mv_x`, which was a bad way to create a vector with a weird name.
* ``Pdop(None)``, which is better spelt ``Pdop({})``, the latter of which has always worked (:issue:`187`).
* :meth:`galgebra.ga.Ga.Pdop_identity`, which is better spelt ``ga.pdop({})`` (:issue:`194`).
* :meth:`galgebra.ga.Ga.Pdiffs`, which is better spelt ``ga.pdop(x)`` (:issue:`194`).
* :meth:`galgebra.ga.Ga.sPds`, which is better spelt ``ga.sdop(x)`` (:issue:`194`).
- :bug:`188` :meth:`~galgebra.ga.Ga.pdop` and :meth:`~galgebra.ga.Ga.sdop` are now transparent aliases to :class:`~galgebra.mv.Pdop` and :class:`~galgebra.mv.Sdop`, respectively.
Previously, they would crash.
- :bug:`188` Passing a ``ga`` keyword-argument to :meth:`~galgebra.ga.Ga.sm`, :meth:`~galgebra.ga.Ga.mv`, and :meth:`~galgebra.ga.Ga.lt` is now an error, previously it was silently ignored.
- :bug:`187` ``Sdop(x)`` now functions as intended as an alias of ``Sdop([(S(1), Pdop({x: 1}))])``, which previously crashed.
- :bug:`187` :class:`~galgebra.mv.Pdop` no longer silently accepts extra arguments.
- :bug:`183` ``op1 == op2`` now works correctly for :class:`~galgebra.mv.Sdop` and :class:`~galgebra.mv.Dop` instances.
- :bug:`157` Adding an :class:`~galgebra.mv.Sdop` instance to a scalar now works as intended, rather than crashing.
- :bug:`151` ``Dop([], ga=ga)`` and ``Sdop([], ga=ga)`` now evaluate to multiplication by zero, not by one.
Multiplication by one can as always be spelt ``Dop([(S(1), Pdop({}, ga=ga}))], ga=ga)``.
- :bug:`177` :class:`~galgebra.mv.Dop` objects that evaluate to ``0`` no longer raise cryptic ``ValueError``\ s when operated on.
- :feature:`172` :data:`galgebra.__version__` has been added, which contains the version string.
- :feature:`164` (and :issue:`169`, :issue:`170`) Sympy 1.5 is officially supported and tested.
- :support:`167` Python 3.4 is no longer supported.
- :bug:`165` :func:`galgebra.metric.linear_expand` no longer accepts a mode argument, as this did not work properly.
For the old behavior of ``linear_expand(x, mode=True)``, use ``linear_expand_terms(x)`` instead.
- :bug:`151` (also :issue:`150`) :class:`~galgebra.mv.Dop`, :class:`~galgebra.mv.Sdop`, and :class:`~galgebra.mv.Pdop` no longer have mutating methods.
This fixed issues where not only would the laplacian be sometimes calculated incorrectly, but its correctness would vary depending on whether it had been printed!
- :bug:`134` :attr:`~galgebra.ga.Ga.dot_table_dict` now contains correct values (zero) for scalar keys
- :bug:`90` :attr:`galgebra.ga.Ga.blades`, :attr:`galgebra.ga.Ga.bases`, and :attr:`galgebra.ga.Ga.indices` now reference the scalar ``S(0)`` as the single grade-0 object. Previously they listed no grade 0 objects.
- :bug:`81` (also :issue:`180`) Passing coefficients as ``Mv(coefs, 'odd', ga=ga)`` is forbidden.
- :bug:`80` (also :issue:`57`, :issue:`58`, :issue:`97`) The :class:`galgebra.mv.Mv` constructor no longer silently accepts illegal arguments, and produces better error messages.
- :feature:`78` :meth:`~galgebra.ga.Ga.grads` now raises a better error when it fails, and is faster.
- :support:`72` Other internal cleanup.
- :feature:`66` Remove unused or unusable code in the public API:
* ``Ga.mul_table``, ``Ga.wedge_table``, ``Ga.dot_table``, ``Ga.left_contract_table``,
and ``Ga.right_contract_table``, all of which were the empty list, ``[]``.
* ``galgebra.mv.modules``, a string which served no purpose (:issue:`71`).
* ``__add_ab__``, ``__sub_ab__``, ``__mul_ab__``, and ``__div_ab__``, none of are real magic method names (:issue:`67`).
No code should be calling these directly anyway.
* ``Dop.flatten_one_level`` which is better spelt ``itertools.chain.from_iterable`` (:issue:`175`).
* ``Dop.basic``, which was a non-working version of :meth:`~galgebra.ga.Ga.grads()` (:issue:`185`).
* ``Pdop.setGa``, ``Sdop.setGa``, ``Dop.setGa``, all of which rely on dangerous global state - use the ``ga`` keyword argument of the constructors of these types instead (:issue:`163`).
- :feature:`66` The :attr:`~galgebra.ga.Ga.mul_table_dict` table, and the equivalent tables for the other products, are now computed lazily when indexed. These are now all documented too.
- :bug:`61` Make contraction and Hestenes dot products thread-safe.
Previously these relied on the :attr:`~galgebra.ga.Ga.dot_mode` setting not being changed mid-operation.
The :meth:`~galgebra.ga.Ga.dot` method still respects this setting, but is no longer used internally.
- :bug:`60` (also :issue:`141`) Make the following operations on :class:`galgebra.mv.Mv` non-mutating:
* :meth:`~galgebra.mv.Mv.blade_rep`
* :meth:`~galgebra.mv.Mv.base_rep`
* :meth:`~galgebra.mv.Mv.diff`
* :meth:`~galgebra.mv.Mv.simplify`
* :meth:`~galgebra.mv.Mv.expand`
* :meth:`~galgebra.mv.Mv.collect`
* ``print(mv)``
Any code relying on this behavior will need to change from ``x.method()`` to ``x = x.method()``.
Note that the latter syntax was always supported even before this change.
- :support:`59` (also :issue:`65`) Make internal attributes and helper functions private.
All of the following have been made private by being renamed:
* ``Mv.make_grad`` (:issue:`59`).
* ``Mv.make_scalar`` (:issue:`59`).
* ``Mv.make_vector`` (:issue:`59`).
* ``Mv.make_bivector`` (:issue:`59`).
* ``Mv.make_pseudo_scalar`` (:issue:`59`).
* ``Mv.make_multivector`` (:issue:`59`).
* ``Mv.make_spinor`` (:issue:`59`).
* ``Mv.make_odd`` (:issue:`59`).
* ``Ga.build_bases()`` (:issue:`65`).
* ``Ga.basis_product_tables()`` (:issue:`65`).
* ``Ga.build_reciprocal_basis()`` (:issue:`65`).
* ``Ga.build_connection()`` (:issue:`65`).
* ``Ga.non_orthogonal_mul_table()`` (:issue:`65`).
* ``Ga.base_blade_conversions()`` (:issue:`65`).
* ``Ga.init_connect_flg()`` (:issue:`65`).
* ``Ga.derivatives_of_basis()`` (:issue:`65`).
* ``Ga.lt_flg`` (:issue:`65`).
* ``Ga.agrads`` (:issue:`65`).
* ``Ga.dbases`` (:issue:`65`).
* ``Ga.XOX`` (:issue:`195`).
- :support:`55` Rename ``*kargs`` to ``*args`` internally, to match convention.
This has no effect on callers, but makes the docs and source easier to read.
- :feature:`50` (also :issue:`51`, :issue:`56`) Improve documentation formatting:
* LaTeX and code samples are now appropriately formatted
* Attributes of classes now have permalinks
- :support:`46` (also :issue:`69`) Remove unnecessary executable bit from importable python files, and the corresponding no-op code that would be run.