From 858aa3653fd2e4ae8573f472cf3f0d698072c185 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Sun, 21 Feb 2021 16:58:05 -0500 Subject: [PATCH] eja: factor out a separate class used by cartesian_product(). --- mjo/eja/all.py | 1 + mjo/eja/eja_algebra.py | 47 +++++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/mjo/eja/all.py b/mjo/eja/all.py index a3b524b..051bd48 100644 --- a/mjo/eja/all.py +++ b/mjo/eja/all.py @@ -3,6 +3,7 @@ All imports from mjo.eja modules. """ from mjo.eja.eja_algebra import (BilinearFormEJA, + CartesianProductEJA, ComplexHermitianEJA, HadamardEJA, JordanSpinEJA, diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 55b8207..1302ca1 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -2742,9 +2742,7 @@ class CartesianProductEJA(CombinatorialFreeModule_CartesianProduct, """ def __init__(self, modules, **kwargs): - CombinatorialFreeModule_CartesianProduct.__init__(self, - modules, - **kwargs) + CombinatorialFreeModule_CartesianProduct.__init__(self, modules) field = modules[0].base_ring() if not all( J.base_ring() == field for J in modules ): raise ValueError("all factors must share the same base field") @@ -2766,33 +2764,16 @@ class CartesianProductEJA(CombinatorialFreeModule_CartesianProduct, # some join of the EJA and Cartesian product # categories. There's no need to check the field since it # already came from an EJA. Likewise the axioms are guaranteed - # to be satisfied. We can't orthonormalize by default because - # there's no way to pass "orthonormalize=False" to - # cartesian_product(...) when the base ring is QQ and - # orthonormalizing would give us irrational entries. - # - # TODO: create a separate constructor that is capable of - # orthonormalizing and is only used by the cartesian_product() - # thingy. + # to be satisfied. FiniteDimensionalEJA.__init__(self, basis, jordan_product, inner_product, field=field, - orthonormalize=False, check_field=False, check_axioms=False, - category=self.category()) - # TODO: - # - # Initialize the FDEJA class, too. Does this override the - # initialization that we did for the - # CombinatorialFreeModule_CartesianProduct class? If not, we - # will probably have to duplicate some of the work (i.e. one - # of the constructors). Since the CartesianProduct one is - # smaller, that makes the most sense to copy/paste if it comes - # down to that. - # + category=self.category(), + **kwargs) self.rank.set_cache(sum(J.rank() for J in modules)) @@ -3059,5 +3040,23 @@ class CartesianProductEJA(CombinatorialFreeModule_CartesianProduct, Element = FiniteDimensionalEJAElement -FiniteDimensionalEJA.CartesianProduct = CartesianProductEJA +class FiniteDimensionalEJA_CartesianProduct(CartesianProductEJA): + r""" + A wrapper around the :class:`CartesianProductEJA` class that gets + used by the ``cartesian_product`` functor. Its one job is to set + ``orthonormalize=False``, since ``cartesian_product()`` can't be + made to pass that option through. And if we try to orthonormalize + over the rationals, we get conversion errors. If you want a non- + standard Jordan product or inner product, or if you want to + orthonormalize the basis, use :class:`CartesianProductEJA` + directly. + """ + def __init__(self, modules, **options): + CombinatorialFreeModule_CartesianProduct.__init__(self, + modules, + **options) + CartesianProductEJA.__init__(self, modules, orthonormalize=False) + + +FiniteDimensionalEJA.CartesianProduct = FiniteDimensionalEJA_CartesianProduct random_eja = ConcreteEJA.random_instance -- 2.43.2