SETUP::
- sage: from mjo.eja.eja_algebra import (CartesianProductEJA,
+ sage: from mjo.eja.eja_algebra import (random_eja,
+ ....: CartesianProductEJA,
....: HadamardEJA,
....: JordanSpinEJA,
....: RealSymmetricEJA)
...
ValueError: all factors must share the same base field
+ The "cached" Jordan and inner products are the componentwise
+ ones::
+
+ sage: set_random_seed()
+ sage: J1 = random_eja()
+ sage: J2 = random_eja()
+ sage: J = cartesian_product([J1,J2])
+ sage: x,y = J.random_elements(2)
+ sage: x*y == J.cartesian_jordan_product(x,y)
+ True
+ sage: x.inner_product(y) == J.cartesian_inner_product(x,y)
+ True
+
"""
def __init__(self, modules, **kwargs):
CombinatorialFreeModule_CartesianProduct.__init__(self,
# Use whatever category the superclass came up with. Usually
# 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.
+ # already came from an EJA.
#
- # TODO: create a separate constructor that is capable of
- # orthonormalizing and is only used by the cartesian_product()
- # thingy.
+ # If you want the basis to be orthonormalized, orthonormalize
+ # the factors.
FiniteDimensionalEJA.__init__(self,
basis,
jordan_product,
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.
- #
self.rank.set_cache(sum(J.rank() for J in modules))
"""
Ji = self.cartesian_factors()[i]
- # Requires the fix on Trac 31421/31422 to work!
- Pi = super().cartesian_projection(i)
+
+ # Required until https://trac.sagemath.org/ticket/31421 is fixed.
+ Pi = self.module_morphism(lambda j_t: Ji.monomial(j_t[1])
+ if i == j_t[0] else Ji.zero(),
+ codomain=Ji)
return FiniteDimensionalEJAOperator(self,Ji,Pi.matrix())
@cached_method
"""
Ji = self.cartesian_factors()[i]
- # Requires the fix on Trac 31421/31422 to work!
- Ei = super().cartesian_embedding(i)
+ # Required until https://trac.sagemath.org/ticket/31421 is fixed.
+ Ei = Ji.module_morphism(lambda t: self.monomial((i, t)),
+ codomain=self)
return FiniteDimensionalEJAOperator(Ji,self,Ei.matrix())