]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
mjo/clan/unital_clan.py: start working on the Vinberg clan
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 14 Feb 2026 18:27:44 +0000 (13:27 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Sat, 14 Feb 2026 18:30:41 +0000 (13:30 -0500)
Just sketch the constructor. Nothing works, but I don't want to forget
about it.

mjo/clan/unital_clan.py

index 5ad9b514f9a66322ce8f756398911bda00cf57ed..d838093da2d11291cc1b6ef935d36bea8b7e0089 100644 (file)
@@ -533,3 +533,67 @@ class HnClan(MatrixClan):
 
         """
         return f"Clan H^{self.rank()} over {self.base_ring()}"
+
+class VinbergClan(NormalDecomposition):
+    r"""
+    The clan corresponding to the Vinberg cone (as defined by Ishi).
+
+    The Vinberg cone lives in a space whose points are pairs of real
+    2x2 symmetric matrices that agree in the first coordinate. The
+    cone itself is the subset where both elements of the pair are
+    positive-semidefinite.
+
+    Ishi describes this space as x = (a,b) where
+
+       a = [ x11 x21 ]
+           [ x21 x22 ],
+
+       b = [ x11 x31 ]
+           [ x31 x33 ]
+
+    As there is no obvious way to express this in Sage, we instead
+    simply write out the x = (x11, x21, x22, x31, x33) as a vector of
+    real numbers, and provide lifts to the matrix representation. The
+    clan product is in terms of the up-hat and down-hat that is
+    defined on `S^{2}.
+    """
+    def __init__(self, scalar_field=QQ, **kwargs):
+        from sage.matrix.matrix_space import MatrixSpace
+        from sage.modules.free_module import VectorSpace
+
+        M2 = MatrixSpace(scalar_field, 2)
+        b = Mn.basis()
+
+        from sage.sets.family import Family
+        S2_basis = Family({ (i,j,1) :
+            a*(b[(i,j)] + b[(j,i)])
+            for i in range(n)
+            for j in range(i+1)
+            if (a := 1 - (i == j)/scalar_field(2))
+        })
+
+        # Mn.submodule() destroys our basis keys, so use
+        # SubmoduleWithBasis directly.
+        self._S2 = SubmoduleWithBasis(S2_basis,
+                                      support_order=b.keys(),
+                                      ambient=M2)
+
+        R5 = VectorSpace(scalar_field, 5)
+
+        def lift(v):
+            
+            return 
+
+        super().__init__(R5, MatrixClan._cp, MatrixClan._ip, **kwargs)
+
+    def __repr__(self) -> str:
+        r"""
+        The string representation of this clan.
+
+        EXAMPLES::
+
+            sage: VinbergClan()
+            Vinberg clan over Rational Field
+
+        """
+        return f"Vinberg clan over {self.base_ring()}"