r"""
-Proper implementation of unital clans (real, finite dimensional
-"compact" left-symmetric algebras with a unit element).
+Proper implementation of clans (real, finite dimensional
+"compact" left-symmetric algebras). These are in one-to-one
+correspondence with homogeneous convex domains, and the unital clans
+correspond to the homogeneous convex cones.
"""
from sage.categories.magmatic_algebras import MagmaticAlgebras
from mjo.clan.clan_element import (ClanElement,
NormalDecompositionElement)
-class UnitalClan(CombinatorialFreeModule):
+class Clan(CombinatorialFreeModule):
+ r"""
+ Base class for clans.
+
+ These correspond to homogeneous convex domains, and vice-versa.
+ This is needed to fill out the type hierarchy, but isn't very
+ useful on its own because all we care about are cones (which
+ correspond to unital clans).
+ """
Element = ClanElement
def __init__(self,
basis = vector_space.basis()
category = MagmaticAlgebras(scalar_field).or_subcategory(category)
- category = category.FiniteDimensional().WithBasis().Unital()
+ category = category.FiniteDimensional().WithBasis()
# Compute the multiplication table.
self._mt = { i: { j : clan_product(basis[i], basis[j])
return self._mt[i][j]
+class UnitalClan(Clan):
+ r"""
+ A clan with a unit element.
+
+ These correspond to homogeneous convex cones, and vice-versa.
+ Not much here except a constructor that ensures we are using
+ a ``Unital()`` category.
+ """
+ def __init__(self,
+ vector_space,
+ clan_product,
+ inner_product,
+ scalar_field=QQ,
+ category=None,
+ prefix=None,
+ bracket=False):
+
+ category = MagmaticAlgebras(scalar_field).or_subcategory(category)
+ category = category.FiniteDimensional().WithBasis().Unital()
+
+ # Use the vector_space basis keys so we can convert
+ # easily between them.
+ super().__init__(vector_space,
+ clan_product,
+ inner_product,
+ scalar_field=scalar_field,
+ category=category,
+ prefix=prefix,
+ bracket=bracket)
+
+
+
class NormalDecomposition(UnitalClan):
r"""
"""
return self._rank
+
class MatrixClan(NormalDecomposition):
r"""
A clan arising from a T-algebra of Hermitian matrices.
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES:
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES:
SETUP::
- sage: from mjo.clan.unital_clan import VinbergClan
+ sage: from mjo.clan.clan import VinbergClan
EXAMPLES::
SETUP::
- sage: from mjo.clan.unital_clan import VinbergClan
+ sage: from mjo.clan.clan import VinbergClan
EXAMPLES::
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES::
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES::
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES::
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES:
SETUP::
- sage: from mjo.clan.unital_clan import SnClan, VinbergClan
+ sage: from mjo.clan.clan import SnClan, VinbergClan
EXAMPLES:
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES:
r"""
An operator between two clans.
- Defined for *unital* clans at the moment, because that's all we
- have.
-
SETUP::
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
sage: from mjo.clan.clan_operator import ClanOperator
EXAMPLES:
- The domain and codomain must be unital clans; if either is not,
+ The domain and codomain must be clans; if either is not,
then an error is raised::
sage: J = SnClan(2)
sage: ClanOperator(V,J,M)
Traceback (most recent call last):
...
- TypeError: domain must be a unital clan
+ TypeError: domain must be a clan
sage: ClanOperator(J,V,M)
Traceback (most recent call last):
...
- TypeError: codomain must be a unital clan
+ TypeError: codomain must be a clan
"""
def __init__(self, domain, codomain, mat):
- from mjo.clan.unital_clan import UnitalClan
+ from mjo.clan.clan import Clan
- if not isinstance(domain, UnitalClan):
- raise TypeError('domain must be a unital clan')
- if not isinstance(codomain, UnitalClan):
- raise TypeError('codomain must be a unital clan')
+ if not isinstance(domain, Clan):
+ raise TypeError('domain must be a clan')
+ if not isinstance(codomain, Clan):
+ raise TypeError('codomain must be a clan')
F = domain.base_ring()
if not (F == codomain.base_ring()):
SETUP::
sage: from mjo.clan.clan_operator import ClanOperator
- sage: from mjo.clan.unital_clan import VinbergClan
+ sage: from mjo.clan.clan import VinbergClan
EXAMPLES::
SETUP::
sage: from mjo.clan.clan_operator import ClanOperator
- sage: from mjo.clan.unital_clan import HnClan
+ sage: from mjo.clan.clan import HnClan
EXAMPLES::
SETUP::
sage: from mjo.clan.clan_operator import ClanOperator
- sage: from mjo.clan.unital_clan import SnClan
+ sage: from mjo.clan.clan import SnClan
EXAMPLES::