]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
mjo/clan: refactor the type hierarchy
authorMichael Orlitzky <michael@orlitzky.com>
Tue, 17 Feb 2026 02:51:59 +0000 (21:51 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Tue, 17 Feb 2026 02:51:59 +0000 (21:51 -0500)
Put the clan stuff in a top-level Clan class, and make UnitalClan a
wrapper around that. This complicates everything a bit, but makes me
feel better.

mjo/clan/clan.py [moved from mjo/clan/unital_clan.py with 94% similarity]
mjo/clan/clan_element.py
mjo/clan/clan_operator.py

similarity index 94%
rename from mjo/clan/unital_clan.py
rename to mjo/clan/clan.py
index 3bc8b5d8fb4db2748ea10cf4200dad999ca869f4..9435f737d5a8c69630b9baeaea31e3abd97bc0d4 100644 (file)
@@ -1,6 +1,8 @@
 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
@@ -11,7 +13,15 @@ from sage.rings.rational_field import QQ
 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,
@@ -27,7 +37,7 @@ class UnitalClan(CombinatorialFreeModule):
         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])
@@ -92,6 +102,38 @@ class UnitalClan(CombinatorialFreeModule):
         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"""
@@ -183,6 +225,7 @@ class NormalDecomposition(UnitalClan):
         """
         return self._rank
 
+
 class MatrixClan(NormalDecomposition):
     r"""
     A clan arising from a T-algebra of Hermitian matrices.
index e550119ba9c4e00dd36e096fa943cf476132e725..f4869a208ac984cc8bd1ff7dd891cb283d7eb0ac 100644 (file)
@@ -24,7 +24,7 @@ class ClanElement(IndexedFreeModuleElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES:
 
@@ -54,7 +54,7 @@ class ClanElement(IndexedFreeModuleElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES:
 
@@ -81,7 +81,7 @@ class ClanElement(IndexedFreeModuleElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import VinbergClan
+            sage: from mjo.clan.clan import VinbergClan
 
         EXAMPLES::
 
@@ -106,7 +106,7 @@ class ClanElement(IndexedFreeModuleElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import VinbergClan
+            sage: from mjo.clan.clan import VinbergClan
 
         EXAMPLES::
 
@@ -155,7 +155,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES::
 
@@ -188,7 +188,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES::
 
@@ -233,7 +233,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES::
 
@@ -284,7 +284,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES:
 
@@ -351,7 +351,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan, VinbergClan
+            sage: from mjo.clan.clan import SnClan, VinbergClan
 
         EXAMPLES:
 
@@ -413,7 +413,7 @@ class NormalDecompositionElement(ClanElement):
 
         SETUP::
 
-            sage: from mjo.clan.unital_clan import SnClan
+            sage: from mjo.clan.clan import SnClan
 
         EXAMPLES:
 
index ed4d6b3d5cc6c9a562e78121eced307d431bbe17..33ff32384b830b08978ac6b68cee1d69b30bbeda 100644 (file)
@@ -5,17 +5,14 @@ class ClanOperator(Map):
     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)
@@ -24,21 +21,21 @@ class ClanOperator(Map):
         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()):
@@ -73,7 +70,7 @@ class ClanOperator(Map):
         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::
 
@@ -96,7 +93,7 @@ class ClanOperator(Map):
         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::
 
@@ -127,7 +124,7 @@ class ClanOperator(Map):
         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::