Standard Constructions

In this section we present some functions that allow the construction of famous GKM graphs.

Generalized Flags Varieties

GKMtools.generalized_gkm_flagFunction
generalized_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.

Note

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$.

Warning

Computing this function with root systems of very large Weyl groups may be slow.

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
source
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
source
GKMtools.flag_varietyFunction
flag_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.$

Note

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)
source
GKMtools.grassmannianFunction
grassmannian(::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)
source
Oscar.projective_spaceFunction
projective_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)
source

Generalized Schubert Varieties

GKMtools.get_bruhat_order_of_generalized_flagFunction
get_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
source
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
source
GKMtools.generalized_gkm_schubertFunction
generalized_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)
source
generalized_gkm_schubert(R::RootSystem, indices_of_S::Union{UnitRange{Int64}, Vector{Int64}}, pt::String)  -> AbstractGKM_subgraph
source
generalized_gkm_schubert(R::RootSystem, pt::String) -> AbstractGKM_subgraph
source
GKMtools.bott_samelsonFunction
bott_samelson(S::Vector{RootSpaceElem}; printEdges::Bool = true)

We construct the Bott-Samelson desingularization of a Schubert variety given by S.

source

Schubert Classes

Oscar.IntersectionTheory.schubert_classFunction
schubert_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 by generalized_gkm_schubert).
  • BO::BruhatOrder: The Bruhat order on the generalized partial flag variety (as returned by get_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]
source
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.

source
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 by generalized_gkm_flag).
  • BO::BruhatOrder: The Bruhat order on the generalized partial flag variety (as returned by get_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]
source
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.

source
Oscar.IntersectionTheory.schubert_classesFunction
schubert_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 by generalized_gkm_schubert).
  • BO::BruhatOrder: The Bruhat order for the generalized partial flag variety containing the Schubert variety (as returned by get_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
source
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 by generalized_gkm_flag).
  • BO::BruhatOrder: The Bruhat order for the generalized partial flag variety containing the Schubert variety (as returned by get_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
source

Toric varieties

GKMtools.gkm_graph_of_toricFunction
gkm_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)
source