"""
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()}"