Standard Constructions
In this section we present some functions that allow the construction of famous GKM graphs.
Generalized Flags Varieties
GKMtools.generalized_gkm_flag
— Functiongeneralized_gkm_flag(R::RootSystem, S::Vector{RootSpaceElem}) -> GKM_graph
Given a root system $R$ and a subset $S$ of the set of simple roots, it constructs the GKM graph of the generalized flag variety $G/P$. Here $G$ is the simply-connected complex Lie group with root system $R$, and $P$ is the parabolic subgroup with root system $S$. If $S$ is empty, it construct $G/B$ where $B$ is a Borel subgroup. The vertices of $G/P$ correspond to the cosets $W/W_P$ where $W$ (resp., $W_P$) is the Weyl group of $G$ (resp., $P$). The label of a vertex is the unique element of minimal length in the corresponding coset.
The character group is of type free $\mathbb{Z}$-module if $R$ is of type $A, B, C, D, G$. It is a free $\mathbb{Q}$-module if $R$ is of type $E$ or $F$.
Examples
julia> A1xA1 = root_system([(:A, 1), (:A, 1)])
Root system of rank 2
of type A1 x A1
julia> generalized_gkm_flag(A1xA1)
GKM graph with 4 nodes, valency 2 and axial function:
s1 -> id => (-1, 1, 0, 0)
s2 -> id => (0, 0, -1, 1)
s1*s2 -> s1 => (0, 0, -1, 1)
s1*s2 -> s2 => (-1, 1, 0, 0)
julia> RC3 = root_system(:C, 3)
Root system of rank 3
of type C3
julia> gp1 = generalized_gkm_flag(RC3);
julia> rank_torus(gp1)
3
julia> R = root_system([(:A, 1), (:G, 2)])
Root system of rank 3
of type A1 x G2
julia> S = [simple_roots(R)[3]];
julia> gp2 = generalized_gkm_flag(R, S);
julia> rank_torus(gp2)
5
generalized_gkm_flag(R::RootSystem; indices_of_S) -> GKM_graph
Same as before, but indicating the indices of the roots in $S$ instead of the roots itself.
Examples
julia> R = root_system(matrix(ZZ, [2 -1 -2; -1 2 0; -1 0 2]))
Root system of rank 3
of type C3 (with non-canonical ordering of simple roots)
julia> gp1 = generalized_gkm_flag(R, 2:3);
julia> valency(gp1)
7
julia> gp2 = generalized_gkm_flag(R, [1,2]);
julia> rank_torus(gp2)
3
GKMtools.flag_variety
— Functionflag_variety(::Type{GKM_graph}, s::Vector{Int64}) -> GKM_graph{ZZRingElem}
Construct the GKM graph of the variety of flags of $\mathbb{C}^n$. The dimensions of quotients are expressed by the array s
. The labels represent the vectors generating the flags. For example, if $s=[1,2,1]$, the string $213$ corresponds to the flag:
$0\subset \langle e_2 \rangle \subset \langle e_2, e_1, e_3 \rangle \subset \langle e_2, e_1, e_3, e_4 \rangle=\mathbb{C}^4.$
This function is faster than generalized_gkm_flag(root_system(:A, n-1), S)
, but the results are isomorphic.
Examples
julia> flag_variety(GKM_graph, [1,3])
GKM graph with 4 nodes, valency 3 and axial function:
2 -> 1 => (-1, 1, 0, 0)
3 -> 1 => (-1, 0, 1, 0)
3 -> 2 => (0, -1, 1, 0)
4 -> 1 => (-1, 0, 0, 1)
4 -> 2 => (0, -1, 0, 1)
4 -> 3 => (0, 0, -1, 1)
julia> flag_variety(GKM_graph, [2,1])
GKM graph with 3 nodes, valency 2 and axial function:
13 -> 12 => (0, -1, 1)
23 -> 12 => (-1, 0, 1)
23 -> 13 => (-1, 1, 0)
GKMtools.grassmannian
— Functiongrassmannian(::Type{gkm_graph}, k::Int, n::Int) -> GKM_graph{ZZRingElem}
Construct the Grassmann variety of k
-planes in the complex vector space of dimension n
.
Examples
julia> grassmannian(GKM_graph, 2, 4)
GKM graph with 6 nodes, valency 4 and axial function:
13 -> 12 => (0, -1, 1, 0)
14 -> 12 => (0, -1, 0, 1)
14 -> 13 => (0, 0, -1, 1)
23 -> 12 => (-1, 0, 1, 0)
23 -> 13 => (-1, 1, 0, 0)
24 -> 12 => (-1, 0, 0, 1)
24 -> 14 => (-1, 1, 0, 0)
24 -> 23 => (0, 0, -1, 1)
34 -> 13 => (-1, 0, 0, 1)
34 -> 14 => (-1, 0, 1, 0)
34 -> 23 => (0, -1, 0, 1)
34 -> 24 => (0, -1, 1, 0)
Oscar.projective_space
— Functionprojective_space(::Type{gkm_graph}, d::Int)
Construct the projective space of dimension d
.
Examples
julia> projective_space(GKM_graph, 2)
GKM graph with 3 nodes, valency 2 and axial function:
2 -> 1 => (-1, 1, 0)
3 -> 1 => (-1, 0, 1)
3 -> 2 => (0, -1, 1)
Generalized Schubert Varieties
GKMtools.get_bruhat_order_of_generalized_flag
— Functionget_bruhat_order_of_generalized_flag(R::RootSystem, S::Vector{RootSpaceElem}; descending::Bool=true) -> BruhatOrder
It returns the Bruhat order of the generalized flag variety given by the root system $R$ with the subset of simple roots given by $S$. See generalized_gkm_flag
. If descending
is true
, the Bruhat order is given from the elements of maximal length to the smallest.
Examples
julia> R = root_system(:A, 3);
julia> S = simple_roots(R);
julia> get_bruhat_order_of_generalized_flag(R, S[1:2])
Bruhat order in descending order:
Length: 3
s1*s2*s3 => ["s2*s3"]
Length: 2
s2*s3 => ["s3"]
Length: 1
s3 => ["id"]
Length: 0
id
get_bruhat_order_of_generalized_flag(R::RootSystem, indices_of_S; descending::Bool=true) -> BruhatOrder
Same as before, but indicating the indices of the roots in $S$ instead of the roots itself.
Examples
julia> R = root_system(:A, 3);
julia> get_bruhat_order_of_generalized_flag(R, [1]; descending = false)
Bruhat order in ascending order:
Length: 0
id => ["s2", "s3"]
Length: 1
s2 => ["s1*s2", "s3*s2", "s2*s3"]
s3 => ["s3*s2", "s2*s3"]
Length: 2
s2*s3 => ["s2*s3*s2", "s1*s2*s3"]
s1*s2 => ["s1*s3*s2", "s1*s2*s3"]
s3*s2 => ["s1*s3*s2", "s2*s3*s2"]
Length: 3
s1*s2*s3 => ["s1*s2*s3*s2"]
s2*s3*s2 => ["s2*s1*s3*s2", "s1*s2*s3*s2"]
s1*s3*s2 => ["s2*s1*s3*s2", "s1*s2*s3*s2"]
Length: 4
s2*s1*s3*s2 => ["s1*s2*s1*s3*s2"]
s1*s2*s3*s2 => ["s1*s2*s1*s3*s2"]
Length: 5
s1*s2*s1*s3*s2
GKMtools.generalized_gkm_schubert
— Functiongeneralized_gkm_schubert(R::RootSystem, indices_of_S::Vector{RootSpaceElem}, pt::String) -> GKM_subgraph
Let $G$ be the generalized flag variety given by the root system $R$ with the subset of simple roots given by $S$. See generalized_gkm_flag
. This functions returns the subgraph of the variety $G$ given by all Schubert cells corresponding to the points less or equal to pt
in the Bruhat order.
Examples
julia> R = root_system(:B, 2);
julia> generalized_gkm_schubert(R, "s1*s2")
GKM subgraph of:
GKM graph with 8 nodes, valency 4 and axial function:
s1 -> id => (-1, 1)
s2*s1 -> s1 => (0, -1)
s1*s2*s1 -> id => (-1, 0)
s1*s2*s1 -> s2*s1 => (-1, 1)
s2 -> id => (0, -1)
s2 -> s2*s1 => (1, 1)
s1*s2 -> s1 => (-1, 0)
s1*s2 -> s1*s2*s1 => (1, 1)
s1*s2 -> s2 => (-1, 1)
s2*s1*s2 -> id => (-1, -1)
s2*s1*s2 -> s2*s1 => (-1, 0)
s2*s1*s2 -> s1*s2 => (0, -1)
s1*s2*s1*s2 -> s1 => (-1, -1)
s1*s2*s1*s2 -> s1*s2*s1 => (0, -1)
s1*s2*s1*s2 -> s2 => (-1, 0)
s1*s2*s1*s2 -> s2*s1*s2 => (-1, 1)
Subgraph:
GKM graph with 4 nodes, valency 2 and axial function:
s1 -> id => (-1, 1)
s2 -> id => (0, -1)
s1*s2 -> s1 => (-1, 0)
s1*s2 -> s2 => (-1, 1)
As before, the subset S can be a subset of simple roots or a subset of indices.
julia> generalized_gkm_schubert(R, [1], "s2")
GKM subgraph of:
GKM graph with 4 nodes, valency 3 and axial function:
s2 -> id => (0, -1)
s1*s2 -> id => (-1, 0)
s1*s2 -> s2 => (-1, 1)
s2*s1*s2 -> id => (-1, -1)
s2*s1*s2 -> s2 => (-1, 0)
s2*s1*s2 -> s1*s2 => (0, -1)
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s2 -> id => (0, -1)
julia> S = simple_roots(R);
julia> generalized_gkm_schubert(R, [S[2]], "s1")
GKM subgraph of:
GKM graph with 4 nodes, valency 3 and axial function:
s1 -> id => (-1, 1)
s2*s1 -> id => (-1, -1)
s2*s1 -> s1 => (0, -1)
s1*s2*s1 -> id => (-1, 0)
s1*s2*s1 -> s1 => (-1, -1)
s1*s2*s1 -> s2*s1 => (-1, 1)
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (-1, 1)
generalized_gkm_schubert(R::RootSystem, indices_of_S::Union{UnitRange{Int64}, Vector{Int64}}, pt::String) -> AbstractGKM_subgraph
generalized_gkm_schubert(R::RootSystem, pt::String) -> AbstractGKM_subgraph
GKMtools.bott_samelson
— Functionbott_samelson(S::Vector{RootSpaceElem}; printEdges::Bool = true)
We construct the Bott-Samelson desingularization of a Schubert variety given by S
.
Schubert Classes
Oscar.IntersectionTheory.schubert_class
— Functionschubert_class(schubert::AbstractGKM_subgraph, BO::BruhatOrder, label::String)
Return the Poincare dual (as subvariety of the Schubert variety schubert
) of the Schubert variety given by label
.
Arguments
schubert::AbstractGKM_subgraph
: The Schubert variety given as GKM subgraph object of the corresponding generalized partial flag variety (as returned bygeneralized_gkm_schubert
).BO::BruhatOrder
: The Bruhat order on the generalized partial flag variety (as returned byget_bruhat_order_of_generalized_flag
).label:String
: The label of the Weyl group element or coset defining the Schubert variety as subvariety of the generalized partial flag variety.
Example
julia> R = root_system(:A, 3);
julia> S = simple_roots(R);
julia> BO = get_bruhat_order_of_generalized_flag(R, S[1:1]);
julia> schubert = generalized_gkm_schubert(R, S[1:1], "s1*s2*s3")
GKM subgraph of:
GKM graph with 12 nodes, valency 5 and axial function:
s2 -> id => (0, -1, 1, 0)
s1*s2 -> id => (-1, 0, 1, 0)
s1*s2 -> s2 => (-1, 1, 0, 0)
s3*s2 -> s2 => (0, 0, -1, 1)
s1*s3*s2 -> s1*s2 => (0, 0, -1, 1)
s1*s3*s2 -> s3*s2 => (-1, 1, 0, 0)
s2*s1*s3*s2 -> s1*s2 => (0, -1, 0, 1)
s2*s1*s3*s2 -> s1*s3*s2 => (0, -1, 1, 0)
s1*s2*s1*s3*s2 -> s2 => (-1, 0, 0, 1)
s1*s2*s1*s3*s2 -> s3*s2 => (-1, 0, 1, 0)
s1*s2*s1*s3*s2 -> s2*s1*s3*s2 => (-1, 1, 0, 0)
s2*s3*s2 -> id => (0, -1, 0, 1)
s2*s3*s2 -> s3*s2 => (0, -1, 1, 0)
s2*s3*s2 -> s2*s1*s3*s2 => (1, 0, -1, 0)
s1*s2*s3*s2 -> id => (-1, 0, 0, 1)
s1*s2*s3*s2 -> s1*s3*s2 => (-1, 0, 1, 0)
s1*s2*s3*s2 -> s1*s2*s1*s3*s2 => (0, 1, -1, 0)
s1*s2*s3*s2 -> s2*s3*s2 => (-1, 1, 0, 0)
s3 -> id => (0, 0, -1, 1)
s3 -> s3*s2 => (0, 1, 0, -1)
s3 -> s1*s3*s2 => (1, 0, 0, -1)
s2*s3 -> s2 => (0, -1, 0, 1)
s2*s3 -> s2*s1*s3*s2 => (1, 0, 0, -1)
s2*s3 -> s2*s3*s2 => (0, 0, 1, -1)
s2*s3 -> s3 => (0, -1, 1, 0)
s1*s2*s3 -> s1*s2 => (-1, 0, 0, 1)
s1*s2*s3 -> s1*s2*s1*s3*s2 => (0, 1, 0, -1)
s1*s2*s3 -> s1*s2*s3*s2 => (0, 0, 1, -1)
s1*s2*s3 -> s3 => (-1, 0, 1, 0)
s1*s2*s3 -> s2*s3 => (-1, 1, 0, 0)
Subgraph:
GKM graph with 6 nodes, valency 3 and axial function:
s2 -> id => (0, -1, 1, 0)
s1*s2 -> id => (-1, 0, 1, 0)
s1*s2 -> s2 => (-1, 1, 0, 0)
s3 -> id => (0, 0, -1, 1)
s2*s3 -> s2 => (0, -1, 0, 1)
s2*s3 -> s3 => (0, -1, 1, 0)
s1*s2*s3 -> s1*s2 => (-1, 0, 0, 1)
s1*s2*s3 -> s3 => (-1, 0, 1, 0)
s1*s2*s3 -> s2*s3 => (-1, 1, 0, 0)
julia> schubert_class(schubert, BO, "s1*s2")
(t3 - t4)*e[1] + (t2 - t4)*e[2] + (t1 - t4)*e[3]
julia> schubert_class(schubert, BO, "s1*s2*s3")
e[1] + e[2] + e[3] + e[4] + e[5] + e[6]
schubert_class(schubert::AbstractGKM_graph, BO::BruhatOrder, v::Int64)
Like above, but the Weyl group element is given by the index v
corresponding to its index as vertex of the GKM graph on the flag variety containing the Schubert variety.
schubert_class(flag::AbstractGKM_graph, BO::BruhatOrder, label::String)
Return the Poincare dual (as subvariety of the generalized partial flag variety flag
) of the Schubert variety determined by label
.
Arguments
flag::AbstractGKM_graph
: The generalized partial flag variety (as returned bygeneralized_gkm_flag
).BO::BruhatOrder
: The Bruhat order on the generalized partial flag variety (as returned byget_bruhat_order_of_generalized_flag
).label:String
: The label of the Weyl group element or coset defining the Schubert variety as subvariety of the generalized partial flag variety.
Example
julia> R = root_system(:G, 2);
julia> BO = get_bruhat_order_of_generalized_flag(R);
julia> flag = generalized_gkm_flag(R);
julia> schubert_class(flag, BO, "s2*s1*s2*s1*s2")
(-t2 + t3)*e[1] + (-t1 - t2 + 2*t3)*e[2] + (t1 - 2*t2 + t3)*e[3] + (-t1 + t3)*e[4] + (t1 - t2)*e[5] + (-t2 + t3)*e[7] + (-t1 - t2 + 2*t3)*e[8] + (t1 - 2*t2 + t3)*e[9] + (-t1 + t3)*e[10] + (t1 - t2)*e[11]
schubert_class(flag::AbstractGKM_graph, BO::BruhatOrder, v::Int64)
Like above, but the Weyl group element is given by the index v
corresponding to its index as vertex of the GKM graph on the Schubert variety.
Oscar.IntersectionTheory.schubert_classes
— Functionschubert_classes(schubert::AbstractGKM_subgraph, BO::BruhatOrder)
Return all Schubert classes on the given generalized Schubert variety. The i-th row in the returned matrix is the Schubert class of the Weyl group element (or coset) corresponding to the i-th vertex of the given Schubert variety.
Arguments
schubert::AbstractGKM_subgraph
: The Schubert variety given as GKM subgraph of its generalized partial flag variety (as returned bygeneralized_gkm_schubert
).BO::BruhatOrder
: The Bruhat order for the generalized partial flag variety containing the Schubert variety (as returned byget_bruhat_order_of_generalized_flag
).
Examples
Schubert classes on the Schubert variety $\overline{X_{s_1s_2s_3}}\subset SL_4/P_1$:
julia> R = root_system(:A, 2);
julia> S = simple_roots(R);
julia> schubert = generalized_gkm_schubert(R, S[1:1], "s1*s2");
julia> BO = get_bruhat_order_of_generalized_flag(R, S[1:1]);
julia> schubert_classes(schubert, BO)
3×3 Matrix{QQMPolyRingElem}:
t1*t2 - t1*t3 - t2*t3 + t3^2 0 0
t1 - t3 t1 - t2 0
1 1 1
schubert_classes(flag::AbstractGKM_graph, BO::BruhatOrder)
Return all Schubert classes on the given generalized partial flag variety. The i-th row in the returned matrix is the Schubert class of the Weyl group element (or coset) corresponding to the i-th vertex of the given partial flag variety.
Arguments
flag::AbstractGKM_graph
: The generalized partial flag variety (as returned bygeneralized_gkm_flag
).BO::BruhatOrder
: The Bruhat order for the generalized partial flag variety containing the Schubert variety (as returned byget_bruhat_order_of_generalized_flag
).
Example
julia> R = root_system(:A, 2);
julia> BO = get_bruhat_order_of_generalized_flag(R);
julia> flag = generalized_gkm_flag(R);
julia> schubert_classes(flag, BO)
6×6 Matrix{QQMPolyRingElem}:
t1^2*t2 - t1^2*t3 - t1*t2^2 + t1*t3^2 + t2^2*t3 - t2*t3^2 0 0 0 0 0
t1*t2 - t1*t3 - t2*t3 + t3^2 t1*t2 - t1*t3 - t2*t3 + t3^2 0 0 0 0
t1 - t3 t1 - t3 t1 - t2 0 t1 - t2 0
1 1 1 1 1 1
t1^2 - t1*t2 - t1*t3 + t2*t3 0 0 0 t1^2 - t1*t2 - t1*t3 + t2*t3 0
t1 - t3 t2 - t3 0 0 t1 - t3 t2 - t3
Toric varieties
GKMtools.gkm_graph_of_toric
— Functiongkm_graph_of_toric(v::NormalToricVariety) -> GKM_graph{ZZRingElem}
Construct the GKM graph of the (smooth, projective) toric variety v
.
Examples
julia> P2 = projective_space(NormalToricVariety, 2)
Normal toric variety
julia> gkm_graph_of_toric(P2)
GKM graph with 3 nodes, valency 2 and axial function:
2 -> 1 => (1, 0, -1)
3 -> 1 => (0, 1, -1)
3 -> 2 => (-1, 1, 0)
julia> F = hirzebruch_surface(NormalToricVariety, 3)
Normal toric variety
julia> gkm_graph_of_toric(F)
GKM graph with 4 nodes, valency 2 and axial function:
2 -> 1 => (1, 0, -1, 0)
3 -> 2 => (3, 1, 0, -1)
4 -> 1 => (0, 1, 3, -1)
4 -> 3 => (-1, 0, 1, 0)