Generalized Flag Varieties
GKMtools.generalized_gkm_flag — Function
generalized_gkm_flag(
R::RootSystem,
S::Vector{RootSpaceElem};
connection=:birkhoff_grothendieck,
) -> GKMGraphGiven 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 whose Levi factor has 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., the Levi of $P$). The label of a vertex is the unique element of minimal length in the corresponding coset.
By default, the GKM graph comes with the connection from the Birkhoff–Grothendieck splitting along the invariant curves. Set connection=:cartan to construct it from Cartan data. Set connection=:algorithm to construct the connection using an algorithm that always returns a connection, if at least one exists.
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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 2
julia> C3 = root_system(:C, 3)
Root system of rank 3
of type C3
julia> gp1 = generalized_gkm_flag(C3, connection = :cartan);
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)
5The choice of the connection could impact on some properties of the GKM graph, see the example in print_connection.
generalized_gkm_flag(
R::RootSystem,
indices_of_S=Int[];
connection=:birkhoff_grothendieck,
) -> GKMGraphSame 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)
3GKMtools.flag_variety — Function
flag_variety(::Type{GKMGraph}, s::AbstractVector{<:Integer}; connection::Symbol=:birkhoff_grothendieck) -> GKMGraphConstruct the GKM graph of the partial flag variety whose successive quotient dimensions are given by s.
The implementation generates only the required block permutations and builds edges by directly exchanging entries between distinct blocks. 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.
By default, the GKM graph comes with the connection from the Birkhoff–Grothendieck splitting along the invariant curves. Set connection=:cartan to construct it from Cartan data. Set connection=:algorithm to construct the connection using an algorithm that always returns a connection, if at least one exists.
Examples
julia> flag_variety(GKMGraph, [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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 3
julia> flag_variety(GKMGraph, [2,1]; connection = :cartan)
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)
Cartan connection for GKM graph with 3 nodes and valency 2GKMtools.grassmannian — Function
grassmannian(::Type{GKMGraph}, k::Integer, n::Integer; connection::Symbol=:birkhoff_grothendieck) -> GKMGraphConstruct the GKM graph of the Grassmannian of k-planes in $\mathbb{C}^n$.
Examples
julia> grassmannian(GKMGraph, 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)
Birkhoff-Grothendieck connection for GKM graph with 6 nodes and valency 4Oscar.projective_space — Function
projective_space(::Type{GKMGraph}, d::Integer) -> GKMGraphConstruct complex projective space of dimension d.
julia> projective_space(GKMGraph, 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)
Birkhoff-Grothendieck connection for GKM graph with 3 nodes and valency 2Generalized Schubert Varieties
GKMtools.generalized_gkm_schubert — Function
generalized_gkm_schubert(R::RootSystem, indices_of_S::Vector{RootSpaceElem}, vertex_label::String) -> AbstractGKM_subgraphLet $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 the point labeled vertex_label 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)
Birkhoff-Grothendieck connection for GKM graph with 8 nodes and valency 4
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)
Algorithmic connection for GKM graph with 4 nodes and valency 2As 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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 3
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s2 -> id => (0, 1)
Algorithmic connection for GKM graph with 2 nodes and valency 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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 3
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (1, -1)
Algorithmic connection for GKM graph with 2 nodes and valency 1generalized_gkm_schubert(G::AbstractGKMGraph{R, V, F}, vertex_label::String; descending::Bool = true) where {V <: AbstractFlagVertex, R, F} -> GKMGraphAs above, but the generalized flag variety is already provided.
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)
Birkhoff-Grothendieck connection for GKM graph with 8 nodes and valency 4
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)
Algorithmic connection for GKM graph with 4 nodes and valency 2julia> 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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 3
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s2 -> id => (0, 1)
Algorithmic connection for GKM graph with 2 nodes and valency 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)
Birkhoff-Grothendieck connection for GKM graph with 4 nodes and valency 3
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (1, -1)
Algorithmic connection for GKM graph with 2 nodes and valency 1
GKMtools.bott_samelson — Function
bott_samelson(S::Vector{RootSpaceElem}; printEdges::Bool = true)Print the moment graph of the Bott-Samelson desingularization associated with the sequence of simple roots S. Set printEdges=false to print only the summary.
Example
julia> R = root_system(:A, 1);
julia> bott_samelson([simple_root(R, 1)]; printEdges=false)
Bott samelson graph in type Root system of type A1 defined by RootSpaceElem[a_1]
Is GKM: true
Number of vertices: 2
Number of edges: 1
Number of fat edges: 0Schubert Classes
GKMtools.schubert_basis — Function
schubert_basis(G::AbstractGKMGraph; representation=:localized) -> VectorReturn the equivariant Schubert basis of a homogeneous GKM variety $G/P$ given by G. For each $w\in W/W_P$, the corresponding element of the basis is the equivariant Poincaré dual of the opposite Schubert variety $Y_w:=\overline{B^- w P/P}\subset G/P$. Since $\mathrm{dim}_{\mathbb{C}} Y_w = \mathrm{dim}_{\mathbb{C}} G/P - \ell(w)$, the cohomological degree of the class associated to $w$ is $2\ell(w)$.
This convention differs from schubert_class, which uses $X_w$ instead of $Y_w$. Since this function uses Billey's formula [Bil99, AJS94, Tym16] instead of the naive poincare_dual, it also returns the correct result when some $Y_w$ is singular.
Output format
The result is grouped by complex codimension: result[d + 1] is a vector of all Schubert classes of complex codimension d (cohomological degree 2d). Each class is represented as a GKMClass object over the fraction field of $H_T^*(\text{pt})$. Within a group, classes follow the fixed-point ordering of G.
Set representation=:polynomial to return GKMClass objects over $H_T^*(\text{pt})$. The default :localized preserves the historical fraction-field representation.
Example
Let us see the Schubert basis in the full flag variety $G/B$ of type $A_2$.
julia> R = root_system(:A, 2);
julia> G = generalized_gkm_flag(R)
GKM graph with 6 nodes, valency 3 and axial function:
s1 -> id => (1, -1, 0)
s2*s1 -> s1 => (0, 1, -1)
s1*s2*s1 -> id => (1, 0, -1)
s1*s2*s1 -> s2*s1 => (1, -1, 0)
s2 -> id => (0, 1, -1)
s2 -> s2*s1 => (-1, 0, 1)
s1*s2 -> s1 => (1, 0, -1)
s1*s2 -> s1*s2*s1 => (0, -1, 1)
s1*s2 -> s2 => (1, -1, 0)
Birkhoff-Grothendieck connection for GKM graph with 6 nodes and valency 3
julia> print_labels(G)
1 -> id
2 -> s1
3 -> s2*s1
4 -> s1*s2*s1
5 -> s2
6 -> s1*s2
julia> S = schubert_basis(G);
julia> S[1] # degree 0 classes
1-element Vector{GKMClass{GKMGraph{ZZRingElem, GKMtools.GeneralizedFlagVertex, FlagWeight{ZZRingElem}}, AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}}:
GKM class with 6 nodes
julia> S[2][1] # degree 2 classes
GKM class with restrictions:
[0, t1 - t2, t1 - t3, t1 - t3, 0, t1 - t2]
julia> S[2][2]
GKM class with restrictions:
[0, 0, t2 - t3, t1 - t3, t2 - t3, t1 - t3]
julia> S[3][1] # degree 4 classes
GKM class with restrictions:
[0, 0, t1*t2 - t1*t3 - t2*t3 + t3^2, t1*t2 - t1*t3 - t2*t3 + t3^2, 0, 0]
julia> S[3][2]
GKM class with restrictions:
[0, 0, 0, t1^2 - t1*t2 - t1*t3 + t2*t3, 0, t1^2 - t1*t2 - t1*t3 + t2*t3]
julia> S[4][1] # degree 6 classes
GKM class with restrictions:
[0, 0, 0, t1^2*t2 - t1^2*t3 - t1*t2^2 + t1*t3^2 + t2^2*t3 - t2*t3^2, 0, 0]Next, let us see the Schubert basis of the partial flag variety $G/P_{\{\alpha_1\}}\cong \mathbb{P}^2$ in type $A_2$.
julia> R = root_system(:A, 2);
julia> S = simple_roots(R);
julia> G = generalized_gkm_flag(R, [S[1]])
GKM graph with 3 nodes, valency 2 and axial function:
s2 -> id => (0, 1, -1)
s1*s2 -> id => (1, 0, -1)
s1*s2 -> s2 => (1, -1, 0)
Birkhoff-Grothendieck connection for GKM graph with 3 nodes and valency 2
julia> print_labels(G)
1 -> id
2 -> s2
3 -> s1*s2
julia> SB = schubert_basis(G);
julia> SB[1][1]
GKM class with restrictions:
[1, 1, 1]
julia> SB[2][1]
GKM class with restrictions:
[0, t2 - t3, t1 - t3]
julia> SB[3][1]
GKM class with restrictions:
[0, 0, t1^2 - t1*t2 - t1*t3 + t2*t3]GKMtools.billey_schubert_basis — Function
Alias for schubert_basis.
Oscar.IntersectionTheory.schubert_class — Function
schubert_class(schubert::AbstractGKMSubgraph, label::String) -> GKMClassReturn the equivariant Poincaré dual, inside schubert, of the Schubert subvariety indexed by label. If schubert is the Schubert variety $X_w=\overline{BwP/P}\subset G/P$ with $w\in W/W_P$ and label represents $u\in W/W_P$ with $u\le w$, then $\text{dim}_{\mathbb{C}} X_u=\ell(u)$ and $\text{dim}_{\mathbb{C}} X_w=\ell(w)$. Hence, when $X_w$ and $X_u$ are both smooth, the cohomological degree of the returned class is $2(\ell(w) - \ell(u))$. (Recall that the equivariant parameters all have cohomological degree $2$.)
This function uses poincare_dual to compute the Poincaré dual of the subgraph corresponding to the Schubert variety. If $X_w$ or $X_u$ fails to be smooth, the resulting class may not be homogeneous and has questionable geometric meaning. Whenever possible, we recommend using schubert_basis instead, which uses Billey's formula and opposite Schubert varieties in the ambient space $G/P$.
The lower interval is determined directly from the Weyl-group element stored in the flag field of each vertex; no separately constructed Bruhat order is required.
Example
julia> R = root_system(:A, 2);
julia> S = generalized_gkm_schubert(R, "s1*s2");
julia> schubert_class(S, "s1*s2")
GKM class with restrictions:
[1, 1, 1, 1]
julia> schubert_class(S, "s1")
GKM class with restrictions:
[-t2 + t3, -t1 + t3, 0, 0]Oscar.IntersectionTheory.schubert_classes — Function
schubert_classes(schubert::AbstractGKMSubgraph) -> MatrixReturn the fixed-point restrictions of all Schubert classes on schubert. Row v contains the restrictions of the class indexed by the v-th vertex.
This function uses schubert_class, hence the warning there applies also to this function.
Example
julia> R = root_system(:A, 2);
julia> S = generalized_gkm_schubert(R, "s1*s2");
julia> schubert_classes(S)
4×4 Matrix{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
t1*t2 - t1*t3 - t2^2 + t2*t3 0 0 0
-t2 + t3 -t1 + t3 0 0
-t1 + t2 0 -t1 + t2 0
1 1 1 1Cohomology Ring
GKMtools.schubert_cohomology_ring — Function
schubert_cohomology_ring(G; degree_convention=:cohomological)Construct the ordinary rational cohomology ring of the homogeneous GKM variety $G/P$ given by G, as an Oscar graded quotient ring. The basis elements $\sigma_w$ are the non-equivariant projections of the classes provided by schubert_basis. In particular, $\sigma_w$ is the Poincaré dual of the opposite Schubert variety $Y_w=\overline{B^- w P/P}\subset G/P$.
Output format
The result is (H, sigma). Here H is the graded quotient and sigma[d + 1] is the vector of quotient elements corresponding to the codimension-d Schubert basis. Thus sigma[1] == [one(H)].
By default a codimension-d class has degree 2d. Set degree_convention=:codimension to give it degree d instead.
The presentation uses one variable for every positive-codimension Schubert class and relations for their complete multiplication table. It is therefore canonical relative to the fixed-point ordering, though not generator-minimal.
Examples
Let us start with the projective space $\mathbb{P}^n$.
julia> n = 4;
julia> R = root_system(:A, n);
julia> P4 = generalized_gkm_flag(R, 2:n) # P^4
GKM graph with 5 nodes, valency 4 and axial function:
s1 -> id => (1, -1, 0, 0, 0)
s2*s1 -> id => (1, 0, -1, 0, 0)
s2*s1 -> s1 => (0, 1, -1, 0, 0)
s3*s2*s1 -> id => (1, 0, 0, -1, 0)
s3*s2*s1 -> s1 => (0, 1, 0, -1, 0)
s3*s2*s1 -> s2*s1 => (0, 0, 1, -1, 0)
s4*s3*s2*s1 -> id => (1, 0, 0, 0, -1)
s4*s3*s2*s1 -> s1 => (0, 1, 0, 0, -1)
s4*s3*s2*s1 -> s2*s1 => (0, 0, 1, 0, -1)
s4*s3*s2*s1 -> s3*s2*s1 => (0, 0, 0, 1, -1)
Birkhoff-Grothendieck connection for GKM graph with 5 nodes and valency 4
julia> (H, sigma) = schubert_cohomology_ring(P4);
julia> H
Quotient
of multivariate polynomial ring in 4 variables over QQ graded by
σ_s1 -> [2]
σ_s2*s1 -> [4]
σ_s3*s2*s1 -> [6]
σ_s4*s3*s2*s1 -> [8]
by ideal with 10 generators
julia> sigma
5-element Vector{Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}}:
[1]
[σ_s1]
[σ_s2*s1]
[σ_s3*s2*s1]
[σ_s4*s3*s2*s1]
julia> σ_s1 = sigma[2][1]; # hyperplane class
julia> foreach(i -> println("(σ_s1)^$i = ", σ_s1^i), 0:5)
(σ_s1)^0 = 1
(σ_s1)^1 = σ_s1
(σ_s1)^2 = σ_s2*s1
(σ_s1)^3 = σ_s3*s2*s1
(σ_s1)^4 = σ_s4*s3*s2*s1
(σ_s1)^5 = 0Let us consider the Grassmannian $G(2, 4)$.
julia> G24 = generalized_gkm_flag(root_system(:A, 3), [1, 3])
GKM graph with 6 nodes, valency 4 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 -> id => (0, 1, 0, -1)
s3*s2 -> s2 => (0, 0, 1, -1)
s1*s3*s2 -> id => (1, 0, 0, -1)
s1*s3*s2 -> s1*s2 => (0, 0, 1, -1)
s1*s3*s2 -> s3*s2 => (1, -1, 0, 0)
s2*s1*s3*s2 -> s2 => (1, 0, 0, -1)
s2*s1*s3*s2 -> s1*s2 => (0, 1, 0, -1)
s2*s1*s3*s2 -> s3*s2 => (1, 0, -1, 0)
s2*s1*s3*s2 -> s1*s3*s2 => (0, 1, -1, 0)
Birkhoff-Grothendieck connection for GKM graph with 6 nodes and valency 4
julia> (H, sigma) = schubert_cohomology_ring(G24);
julia> H
Quotient
of multivariate polynomial ring in 5 variables over QQ graded by
σ_s2 -> [2]
σ_s1*s2 -> [4]
σ_s3*s2 -> [4]
σ_s1*s3*s2 -> [6]
σ_s2*s1*s3*s2 -> [8]
by ideal with 15 generatorsThose are all Schubert classes of the cohomology ring of $G(2, 4)$, where σ_s2*s1*s3*s2 is the point class and σ_s2 is the Plücker class.
Vector bundles on G/P
Let $R$ be a root system, and $S$ a (possibly empty) set of simple roots of $R$ defining a parabolic subgroup $P\subseteq G$, where $G$ is the simply connected Lie group defined by $R$. See generalized_gkm_flag for the construction of the GKM graph of $G/P$.
Following [Bot57], there is a natural correspondence between $G$-equivariant bundles over $G/P$ and representations $(\rho, V)$ of $P$. Given a representation $\rho\colon P \rightarrow GL(V)$, the relative vector bundle is given by
\[ G\times_P V, \text{ where }(g, v) \sim (gp, \rho(p)^{-1}(v)).\]
Irreducible finite dimensional representations of $P$ are in one-to-one correspondence with $L$-dominant weights $\lambda$, that is with weights of $G$ such that $\langle \lambda, \alpha^{\vee}\rangle \ge 0$ for all $\alpha \in S$.
We provide a function that constructs the vector bundle corresponding to any $\lambda$. We define weights using Oscar's functions.
GKMtools.rank_of_bd — Function
rank_of_bd(lambdas, S_or_indices)Return the rank of the equivariant bundle defined by the weight $\lambda$ (or a collection of weights) over the generalized flag variety $G/P$.
Arguments
lambdas: A singleWeightLatticeElemor anAbstractArrayof them.S_or_indices: This can be one of two types:Vector{RootSpaceElem}: A subset $S$ of simple roots defining the parabolic subgroup $P$.Vector{Int64}: The indices of the simple roots defining $P$. Defaults to an empty vector.
Notes
- If the second argument is empty, it computes the rank over the Borel subgroup $G/B$.
- The weights must be dominant with respect to the Levi root subsystem defined by the input.
GKMtools.tautological_bd — Function
tautological_bd(lambdas, S_or_indices)
tautological_bd(lambdas, G::AbstractGKMGraph)Return the equivariant vector bundle(s) defined by the weight(s) lambdas over the generalized flag variety $G/P$, where $P$ is determined by S_or_indices.
Arguments
lambdas: A singleWeightLatticeElemor anAbstractArrayof them. If an array is provided, an array of vector bundles is returned with the same shape.S_or_indices: Defines the parabolic subgroup $P$. Can be:Vector{RootSpaceElem}: A subset $S$ of simple roots.Vector{Int64}: The indices of the simple roots. Defaults to empty (Borel subgroup $G/B$).
G: A graph previously returned bygeneralized_gkm_flag; its parabolic is inferred from the vertex representatives.
The weights must be dominant with respect to the Levi root subsystem defined by the parabolic subgroup. Otherwise it returns an error.
Examples
1. Exceptional Type $G_2$
Construct the rank 2 bundle over $G/P$ where $P$ is defined by the long simple root.
julia> R = root_system(:G, 2)
Root system of rank 2
of type G2
julia> S = [simple_root(R, 1)]; # parabolic defined by the long root (index 1)
julia> lambda = fundamental_weight(R, 1);
julia> bd = tautological_bd(lambda, S)
GKM vector bundle of rank 2 over 6 vertices with weights:
id: (1, 0, -1), (0, 1, -1)
s2: (-1, 1, 0), (0, 1, -1)
s1*s2: (1, -1, 0), (1, 0, -1)
s2*s1*s2: (-1, 0, 1), (-1, 1, 0)
s1*s2*s1*s2: (0, -1, 1), (1, -1, 0)
s2*s1*s2*s1*s2: (0, -1, 1), (-1, 0, 1)2. Grassmannian $G(2,5)$ (Type $A_4$)
All Grassmannians $G(k, n)$ can be realized as $G/P$ where $G$ is of type $A_{n-1}$ and $P$ is the parabolic subgroup defined by the set excluding only the $k$-th simple root. The tautological bundle over $G(k, n)$ corresponds to the fundamental weight in position $1$, and the Plucker line bundle corresponds to the dual of the fundamental weight in position $k$.
julia> R = root_system(:A, 4)
Root system of rank 4
of type A4
julia> lambdas = fundamental_weights(R); # this gives us the array of fundamental weights, which are the ones corresponding to the simple roots
julia> indices_of_S = [1, 3, 4]; # this means we take the parabolic defined by the simple roots in position 1, 3 and 4, which corresponds to the Grassmannian G(2,5)
julia> bds = tautological_bd(lambdas, indices_of_S)
4-element Vector{GKMVectorBundle{QQFieldElem, GKMtools.GeneralizedFlagVertex, FlagWeight{QQFieldElem}, GKMGraph{QQFieldElem, GKMtools.GeneralizedFlagVertex, FlagWeight{QQFieldElem}}}}:
GKM vector bundle of rank 2 over 10 vertices
GKM vector bundle of rank 1 over 10 vertices
GKM vector bundle of rank 3 over 10 vertices
GKM vector bundle of rank 3 over 10 vertices
julia> bds[1] # this is the tautological bundle over G(2,5)
GKM vector bundle of rank 2 over 10 vertices with weights:
id: (-4//5, 1//5, 1//5, 1//5, 1//5), (1//5, -4//5, 1//5, 1//5, 1//5)
s2: (-4//5, 1//5, 1//5, 1//5, 1//5), (1//5, 1//5, -4//5, 1//5, 1//5)
s1*s2: (1//5, -4//5, 1//5, 1//5, 1//5), (1//5, 1//5, -4//5, 1//5, 1//5)
s3*s2: (-4//5, 1//5, 1//5, 1//5, 1//5), (1//5, 1//5, 1//5, -4//5, 1//5)
s1*s3*s2: (1//5, -4//5, 1//5, 1//5, 1//5), (1//5, 1//5, 1//5, -4//5, 1//5)
s2*s1*s3*s2: (1//5, 1//5, -4//5, 1//5, 1//5), (1//5, 1//5, 1//5, -4//5, 1//5)
s4*s3*s2: (-4//5, 1//5, 1//5, 1//5, 1//5), (1//5, 1//5, 1//5, 1//5, -4//5)
s1*s4*s3*s2: (1//5, -4//5, 1//5, 1//5, 1//5), (1//5, 1//5, 1//5, 1//5, -4//5)
s2*s1*s4*s3*s2: (1//5, 1//5, -4//5, 1//5, 1//5), (1//5, 1//5, 1//5, 1//5, -4//5)
s3*s2*s1*s4*s3*s2: (1//5, 1//5, 1//5, -4//5, 1//5), (1//5, 1//5, 1//5, 1//5, -4//5)
julia> bds[2] # this is the dual of Plucker line bundle over G(2,5)
GKM vector bundle of rank 1 over 10 vertices with weights:
id: (-3//5, -3//5, 2//5, 2//5, 2//5)
s2: (-3//5, 2//5, -3//5, 2//5, 2//5)
s1*s2: (2//5, -3//5, -3//5, 2//5, 2//5)
s3*s2: (-3//5, 2//5, 2//5, -3//5, 2//5)
s1*s3*s2: (2//5, -3//5, 2//5, -3//5, 2//5)
s2*s1*s3*s2: (2//5, 2//5, -3//5, -3//5, 2//5)
s4*s3*s2: (-3//5, 2//5, 2//5, 2//5, -3//5)
s1*s4*s3*s2: (2//5, -3//5, 2//5, 2//5, -3//5)
s2*s1*s4*s3*s2: (2//5, 2//5, -3//5, 2//5, -3//5)
s3*s2*s1*s4*s3*s2: (2//5, 2//5, 2//5, -3//5, -3//5)3. Orthogonal Grassmannian $OG(2,7)$ (Type $B_3$) and Gromov-Witten invariant
As an application, we can compute a Gromov-Witten invariants of the orthogonal Grassmannian $OG(2,7)$. This variety is a generalized flag variety of root system $B_3$ and $S=\{\alpha_1, \alpha_3\}$. A zero section of $\mathcal{O}_{OG(2,7)}(1)^{\oplus 4}$ is a Calabi-Yau threefold.
julia> R = root_system(:B, 3)
Root system of rank 3
of type B3
julia> indices_of_S = [1, 3];
julia> w = fundamental_weights(R);
julia> bds = tautological_bd(w, indices_of_S)
3-element Vector{GKMVectorBundle{QQFieldElem, GKMtools.GeneralizedFlagVertex, FlagWeight{QQFieldElem}, GKMGraph{QQFieldElem, GKMtools.GeneralizedFlagVertex, FlagWeight{QQFieldElem}}}}:
GKM vector bundle of rank 2 over 12 vertices
GKM vector bundle of rank 1 over 12 vertices
GKM vector bundle of rank 2 over 12 vertices
julia> E = dual(bds[1]) # use the dual representation to match the tangent-weight convention
GKM vector bundle of rank 2 over 12 vertices with weights:
id: (1, 0, 0), (0, 1, 0)
s2: (1, 0, 0), (0, 0, 1)
s1*s2: (0, 1, 0), (0, 0, 1)
s3*s2: (1, 0, 0), (0, 0, -1)
s1*s3*s2: (0, 1, 0), (0, 0, -1)
s2*s1*s3*s2: (0, 0, 1), (0, -1, 0)
s1*s2*s1*s3*s2: (0, 0, 1), (-1, 0, 0)
s2*s3*s2: (1, 0, 0), (0, -1, 0)
s1*s2*s3*s2: (0, 1, 0), (-1, 0, 0)
s3*s2*s1*s3*s2: (0, 0, -1), (0, -1, 0)
s1*s3*s2*s1*s3*s2: (0, 0, -1), (-1, 0, 0)
s2*s1*s3*s2*s1*s3*s2: (0, -1, 0), (-1, 0, 0)
julia> plucker = dual(det(E)); # this is the Plucker line bundle, also equal to bds[2]
julia> V = plucker + plucker + plucker + plucker; # this is the bundle we want to use for the GW invariant
julia> X = baseof(V); # this is the base variety, which is OG(2,7)We can confirm that the zero section of $V$ is a Calabi-Yau threefold by computing the first Chern class, which should be equal to the first Chern class of the tangent bundle of $OG(2,7)$.
julia> c1_V = chern_class(V, 1) # this is the first Chern class of V
GKM class with restrictions:
[-4*t1 - 4*t2, -4*t1 - 4*t3, -4*t2 - 4*t3, -4*t1 + 4*t3, -4*t2 + 4*t3, 4*t2 - 4*t3, 4*t1 - 4*t3, -4*t1 + 4*t2, 4*t1 - 4*t2, 4*t2 + 4*t3, 4*t1 + 4*t3, 4*t1 + 4*t2]
julia> c1_T = chern_class(X, 1); # this is the first Chern class of the tangent bundle of X
julia> c1_V == c1_T # we expect this to be true
trueNow we can compute a Gromov-Witten invariant of a zero section of $V$.
julia> P = virtual_zero_section(V); # this is the virtual zero section of the bundle, which we will use as the insertion for the GW invariant
julia> beta = curve_class(X, "id", "s2") # this is the curve class corresponding to the edge between the vertices id and s2 in the GKM graph of X
(1)
julia> gromov_witten(X, beta, 0, P; show_bar = false, fast_mode = true) # this computes the GW invariant of degree beta
160