Crystal Of Mirković-Vilonen (MV) Polytopes¶
AUTHORS:
- Dinakar Muthiah, Travis Scrimshaw (2015-05-11): initial version 
- class sage.combinat.crystals.mv_polytopes.MVPolytope(parent, lusztig_datum, long_word=None)[source]¶
- Bases: - PBWCrystalElement- A Mirković-Vilonen (MV) polytope. - EXAMPLES: - We can create an animation showing how the MV polytope changes under a string of crystal operators: - sage: MV = crystals.infinity.MVPolytopes(['C', 2]) sage: u = MV.highest_weight_vector() sage: L = RootSystem(['C',2,1]).ambient_space() sage: s = [1,2,1,2,2,2,1,1,1,1,2,1,2,2,1,2] sage: BB = [[-9, 2], [-10, 2]] sage: p = L.plot(reflection_hyperplanes=False, bounding_box=BB) # long time sage: frames = [p + L.plot_mv_polytope(u.f_string(s[:i]), # long time ....: circle_size=0.1, ....: wireframe='green', ....: fill='purple', ....: bounding_box=BB) ....: for i in range(len(s))] sage: for f in frames: # long time ....: f.axes(False) sage: animate(frames).show(delay=60) # optional -- ImageMagick # long time - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)]) >>> u = MV.highest_weight_vector() >>> L = RootSystem(['C',Integer(2),Integer(1)]).ambient_space() >>> s = [Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(2),Integer(1),Integer(1),Integer(1),Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(1),Integer(2)] >>> BB = [[-Integer(9), Integer(2)], [-Integer(10), Integer(2)]] >>> p = L.plot(reflection_hyperplanes=False, bounding_box=BB) # long time >>> frames = [p + L.plot_mv_polytope(u.f_string(s[:i]), # long time ... circle_size=RealNumber('0.1'), ... wireframe='green', ... fill='purple', ... bounding_box=BB) ... for i in range(len(s))] >>> for f in frames: # long time ... f.axes(False) >>> animate(frames).show(delay=Integer(60)) # optional -- ImageMagick # long time - plot(P=None, **options)[source]¶
- Plot - self.- INPUT: - P– (optional) a space to realize the polytope; default is the weight lattice realization of the crystal
 - See also - EXAMPLES: - sage: MV = crystals.infinity.MVPolytopes(['C', 2]) sage: b = MV.highest_weight_vector().f_string([1,2,1,2,2,2,1,1,1,1,2,1]) sage: b.plot() # needs sage.plot Graphics object consisting of 12 graphics primitives - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)]) >>> b = MV.highest_weight_vector().f_string([Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(2),Integer(1),Integer(1),Integer(1),Integer(1),Integer(2),Integer(1)]) >>> b.plot() # needs sage.plot Graphics object consisting of 12 graphics primitives - Here is the above example placed inside the ambient space of type \(C_2\): 
 - polytope(P=None)[source]¶
- Return a polytope of - self.- INPUT: - P– (optional) a space to realize the polytope; default is the weight lattice realization of the crystal
 - EXAMPLES: - sage: MV = crystals.infinity.MVPolytopes(['C', 3]) sage: b = MV.module_generators[0].f_string([3,2,3,2,1]) sage: P = b.polytope(); P A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 6 vertices sage: P.vertices() (A vertex at (0, 0, 0), A vertex at (0, 1, -1), A vertex at (0, 1, 1), A vertex at (1, -1, 0), A vertex at (1, 1, -2), A vertex at (1, 1, 2)) - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['C', Integer(3)]) >>> b = MV.module_generators[Integer(0)].f_string([Integer(3),Integer(2),Integer(3),Integer(2),Integer(1)]) >>> P = b.polytope(); P A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 6 vertices >>> P.vertices() (A vertex at (0, 0, 0), A vertex at (0, 1, -1), A vertex at (0, 1, 1), A vertex at (1, -1, 0), A vertex at (1, 1, -2), A vertex at (1, 1, 2)) 
 
- class sage.combinat.crystals.mv_polytopes.MVPolytopes(cartan_type)[source]¶
- Bases: - PBWCrystal- The crystal of Mirković-Vilonen (MV) polytopes. - Let \(W\) denote the corresponding Weyl group and \(P_{\RR} = \RR \otimes P\). Let \(\Gamma = \{ w \Lambda_i \mid w \in W, i \in I \}\). Consider \(M = (M_{\gamma} \in \ZZ)_{\gamma \in \Gamma}\) that satisfy the tropical Plücker relations (see Proposition 7.1 of [BZ01]). The MV polytope is defined as \[P(M) = \{ \alpha \in P_{\RR} \mid \langle \alpha, \gamma \rangle \geq M_{\gamma} \text{ for all } \gamma \in \Gamma \}.\]- The vertices \(\{\mu_w\}_{w \in W}\) are given by \[\langle \mu_w, \gamma \rangle = M_{\gamma}\]- and are known as the GGMS datum of the MV polytope. - Each path from \(\mu_e\) to \(\mu_{w_0}\) corresponds to a reduced expression \(\mathbf{i} = (i_1, \ldots, i_m)\) for \(w_0\) and the corresponding edge lengths \((n_k)_{k=1}^m\) from the Lusztig datum with respect to \(\mathbf{i}\). Explicitly, we have \[\begin{split}\begin{aligned} n_k & = -M_{w_{k-1} \Lambda_{i_k}} - M_{w_k \Lambda_{i_k}} - \sum_{j \neq i} a_{ji} M_{w_k \Lambda_j}, \\ \mu_{w_k} - \mu_{w_{k-1}} & = n_k w_{k-1} \alpha_{i_k}, \end{aligned}\end{split}\]- where \(w_k = s_{i_1} \cdots s_{i_k}\) and \((a_{ji})\) is the Cartan matrix. - MV polytopes have a crystal structure that corresponds to the crystal structure, which is isomorphic to \(\mathcal{B}(\infty)\) with \(\mu_{w_0} = 0\), on - PBW data. Specifically, we have \(f_j P(M)\) as being the unique MV polytope given by shifting \(\mu_e\) by \(-\alpha_j\) and fixing the vertices \(\mu_w\) when \(s_j w < w\) (in Bruhat order) and the weight is given by \(\mu_e\). Furthermore, the \(*\)-involution is given by negating \(P(M)\).- INPUT: - cartan_type– a Cartan type
 - EXAMPLES: - sage: MV = crystals.infinity.MVPolytopes(['B', 3]) sage: hw = MV.highest_weight_vector() sage: x = hw.f_string([1,2,2,3,3,1,3,3,2,3,2,1,3,1,2,3,1,2,1,3,2]); x MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1) - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['B', Integer(3)]) >>> hw = MV.highest_weight_vector() >>> x = hw.f_string([Integer(1),Integer(2),Integer(2),Integer(3),Integer(3),Integer(1),Integer(3),Integer(3),Integer(2),Integer(3),Integer(2),Integer(1),Integer(3),Integer(1),Integer(2),Integer(3),Integer(1),Integer(2),Integer(1),Integer(3),Integer(2)]); x MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1) - Elements are expressed in terms of Lusztig datum for a fixed reduced expression of \(w_0\): - sage: MV.default_long_word() [1, 3, 2, 3, 1, 2, 3, 1, 2] sage: MV.set_default_long_word([2,1,3,2,1,3,2,3,1]) sage: x MV polytope with Lusztig datum (3, 1, 1, 0, 1, 0, 1, 3, 4) sage: MV.set_default_long_word([1, 3, 2, 3, 1, 2, 3, 1, 2]) - >>> from sage.all import * >>> MV.default_long_word() [1, 3, 2, 3, 1, 2, 3, 1, 2] >>> MV.set_default_long_word([Integer(2),Integer(1),Integer(3),Integer(2),Integer(1),Integer(3),Integer(2),Integer(3),Integer(1)]) >>> x MV polytope with Lusztig datum (3, 1, 1, 0, 1, 0, 1, 3, 4) >>> MV.set_default_long_word([Integer(1), Integer(3), Integer(2), Integer(3), Integer(1), Integer(2), Integer(3), Integer(1), Integer(2)]) - We can construct elements by giving it Lusztig data (with respect to the default long word reduced expression): - sage: MV([1,1,1,3,1,0,0,1,1]) MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1) - >>> from sage.all import * >>> MV([Integer(1),Integer(1),Integer(1),Integer(3),Integer(1),Integer(0),Integer(0),Integer(1),Integer(1)]) MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1) - We can also construct elements by passing in a reduced expression for a long word: - sage: x = MV([1,1,1,3,1,0,0,1,1], [3,2,1,3,2,3,2,1,2]); x MV polytope with Lusztig datum (1, 1, 1, 0, 1, 0, 5, 1, 1) sage: x.to_highest_weight()[1] [1, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 2, 1, 3] - >>> from sage.all import * >>> x = MV([Integer(1),Integer(1),Integer(1),Integer(3),Integer(1),Integer(0),Integer(0),Integer(1),Integer(1)], [Integer(3),Integer(2),Integer(1),Integer(3),Integer(2),Integer(3),Integer(2),Integer(1),Integer(2)]); x MV polytope with Lusztig datum (1, 1, 1, 0, 1, 0, 5, 1, 1) >>> x.to_highest_weight()[Integer(1)] [1, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 2, 1, 3] - The highest weight crystal \(B(\lambda) \subseteq B(\infty)\) is characterized by the MV polytopes that sit inside of \(W \lambda\) (translating \(\mu_{w_0} \mapsto \lambda\)): - sage: MV = crystals.infinity.MVPolytopes(['A',2]) sage: La = MV.weight_lattice_realization().fundamental_weights() sage: R = crystals.elementary.R(La[1]+La[2]) sage: T = tensor([R, MV]) sage: x = T(R.module_generators[0], MV.highest_weight_vector()) sage: lw = x.to_lowest_weight()[0]; lw [(2, 1, 0), MV polytope with Lusztig datum (1, 1, 1)] sage: lw[1].polytope().vertices() (A vertex at (0, 0, 0), A vertex at (0, 1, -1), A vertex at (1, -1, 0), A vertex at (1, 1, -2), A vertex at (2, -1, -1), A vertex at (2, 0, -2)) - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['A',Integer(2)]) >>> La = MV.weight_lattice_realization().fundamental_weights() >>> R = crystals.elementary.R(La[Integer(1)]+La[Integer(2)]) >>> T = tensor([R, MV]) >>> x = T(R.module_generators[Integer(0)], MV.highest_weight_vector()) >>> lw = x.to_lowest_weight()[Integer(0)]; lw [(2, 1, 0), MV polytope with Lusztig datum (1, 1, 1)] >>> lw[Integer(1)].polytope().vertices() (A vertex at (0, 0, 0), A vertex at (0, 1, -1), A vertex at (1, -1, 0), A vertex at (1, 1, -2), A vertex at (2, -1, -1), A vertex at (2, 0, -2)) - REFERENCES: - Element[source]¶
- alias of - MVPolytope
 - latex_options()[source]¶
- Return the latex options of - self.- EXAMPLES: - sage: MV = crystals.infinity.MVPolytopes(['F', 4]) sage: MV.latex_options() {'P': Ambient space of the Root system of type ['F', 4], 'circle_size': 0.1, 'mark_endpoints': True, 'projection': True} - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['F', Integer(4)]) >>> MV.latex_options() {'P': Ambient space of the Root system of type ['F', 4], 'circle_size': 0.1, 'mark_endpoints': True, 'projection': True} 
 - set_latex_options(**kwds)[source]¶
- Set the latex options for the elements of - self.- INPUT: - projection– the projection; set to- Trueto use the default projection of the specified weight lattice realization (initial:- True)
- P– the weight lattice realization to use (initial: the weight lattice realization of- self)
- mark_endpoints– whether to mark the endpoints (initial:- True)
- circle_size– the size of the endpoint circles (initial: 0.1)
 - EXAMPLES: - sage: MV = crystals.infinity.MVPolytopes(['C', 2]) sage: P = RootSystem(['C', 2]).weight_lattice() sage: b = MV.highest_weight_vector().f_string([1,2,1,2]) sage: latex(b) \begin{tikzpicture} \draw (0, 0) -- (0, -2) -- (-1, -3) -- (-1, -3) -- (-2, -2); \draw (0, 0) -- (-1, 1) -- (-1, 1) -- (-2, 0) -- (-2, -2); \draw[fill=black] (0, 0) circle (0.1); \draw[fill=black] (-2, -2) circle (0.1); \end{tikzpicture} sage: MV.set_latex_options(P=P, circle_size=float(0.2)) sage: latex(b) \begin{tikzpicture} \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2); \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2); \draw[fill=black] (0, 0) circle (0.2); \draw[fill=black] (0, -2) circle (0.2); \end{tikzpicture} sage: MV.set_latex_options(mark_endpoints=False) sage: latex(b) \begin{tikzpicture} \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2); \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2); \end{tikzpicture} sage: MV.set_latex_options(P=MV.weight_lattice_realization(), ....: circle_size=0.2, ....: mark_endpoints=True) - >>> from sage.all import * >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)]) >>> P = RootSystem(['C', Integer(2)]).weight_lattice() >>> b = MV.highest_weight_vector().f_string([Integer(1),Integer(2),Integer(1),Integer(2)]) >>> latex(b) \begin{tikzpicture} \draw (0, 0) -- (0, -2) -- (-1, -3) -- (-1, -3) -- (-2, -2); \draw (0, 0) -- (-1, 1) -- (-1, 1) -- (-2, 0) -- (-2, -2); \draw[fill=black] (0, 0) circle (0.1); \draw[fill=black] (-2, -2) circle (0.1); \end{tikzpicture} >>> MV.set_latex_options(P=P, circle_size=float(RealNumber('0.2'))) >>> latex(b) \begin{tikzpicture} \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2); \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2); \draw[fill=black] (0, 0) circle (0.2); \draw[fill=black] (0, -2) circle (0.2); \end{tikzpicture} >>> MV.set_latex_options(mark_endpoints=False) >>> latex(b) \begin{tikzpicture} \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2); \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2); \end{tikzpicture} >>> MV.set_latex_options(P=MV.weight_lattice_realization(), ... circle_size=RealNumber('0.2'), ... mark_endpoints=True)