Vector Bundles
Theory of GKM vector bundles, see [GSZ12].
Construction
Oscar.IntersectionTheory.line_bundle — Function
line_bundle(G::AbstractGKM_graph, M::AbstractAlgebra.Generic.FreeModule{R}, GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}, weights::Vector{AbstractAlgebra.Generic.FreeModuleElem{R}}) -> GKM_vector_bundleReturn the equivariant line bundle over the GKM graph G whose weights over the fixed points are given by weights.
Arguments
g::G::AbstractGKM_graph: A GKM graphM::AbstractAlgebra.Generic.FreeModule{R}: The weight lattice of the torus acting on the line bundle. This is often bigger than the torus acting onG, for example when there is an extra scaling-action on the fibres.GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}: The inclusion ofG.M(the weight lattice of the torus acting onG) intoM(the weight lattice of the possibly bigger torus acting on the total space of the line bundle).weights::Vector{AbstractAlgebra.Generic.FreeModuleElem{R}}: A vector containing the weight of the fibre of the line bundle over each vertex ofG.
Examples
The trivial line bundle $L\rightarrow \mathbb{P}^2$ with scaling action on each fibre. Here $T=(\mathbb{C}^\times)^3$ acts on $\mathbb{P}^2$ and $T\times\mathbb{C}^\times$ acts on the total space of $L$, where the extra factor $\mathbb{C}^\times$ scales each fiber and preserves the base.
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> GMtoM = ModuleHomomorphism(G.M, M, [gens(M)[1], gens(M)[2], gens(M)[3]]);
julia> V1 = line_bundle(G, M, GMtoM, [gens(M)[4], gens(M)[4], gens(M)[4]])
GKM vector bundle of rank 1 over GKM graph with 3 nodes and valency 2 with weights:
1: (0, 0, 0, 1)
2: (0, 0, 0, 1)
3: (0, 0, 0, 1)Here is another line bundle on $\mathbb{P}^2$ with a more interesting action than fibrewise scaling:
julia> V2 = line_bundle(G, M, GMtoM, [gens(M)[1], gens(M)[2], gens(M)[3]])
GKM vector bundle of rank 1 over GKM graph with 3 nodes and valency 2 with weights:
1: (1, 0, 0, 0)
2: (0, 1, 0, 0)
3: (0, 0, 1, 0)GKMtools.vector_bundle — Function
vector_bundle(G::AbstractGKM_graph, M::AbstractAlgebra.Generic.FreeModule{R}, GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}, weights::Matrix{AbstractAlgebra.Generic.FreeModuleElem{R}}; calculateConnection::Bool=true) -> GKM_vector_bundleConstruct the equivariant vector bundle given by the following datum:
Arguments
g::G::AbstractGKM_graph: The GKM graph of the base.M::AbstractAlgebra.Generic.FreeModule{R}: The weight lattice of the torus acting on the vector bundle. This is often bigger than the torus acting onG, for example when there is an extra scaling-action on the fibres.GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}: The inclusion ofG.M(the weight lattice of the torus acting onG) intoM(the weight lattice of the possibly bigger torus acting on the total space of the vector bundle).weights::Matrix{AbstractAlgebra.Generic.FreeModuleElem{R}}: Over each fixed point (i.e., vertex ofG), the vector bundle splits into a direct sum of $r$ equivariant line bundles, where $r$ is the rank of the vector bundle. This argument is a matrix such thatweights[i, j]is the $j$-th weight at the $i$-th vertex.
Examples
Let us construct manually (without using direct_sum()) the direct sum of the two examples from line_bundle().
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3]]);
julia> V = vector_bundle(G, M, GMtoM, [g[1] g[4]; g[2] g[4]; g[3] g[4]])
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (1, 0, 0, 0), (0, 0, 0, 1)
2: (0, 1, 0, 0), (0, 0, 0, 1)
3: (0, 0, 1, 0), (0, 0, 0, 1)GKMtools.tangent_bd — Method
tangent_bd(G::AbstractGKM_graph; scaling_weight::Int64 = 1) -> GKM_vector_bundleReturn the tangent bundle of G. The torus is enlarged by one dimension where the extra factor scales the fibers of the tangent bundle. The default weight is 1, but can be changed using the optional argument scaling_weight if desired.
Example
julia> G = 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)
julia> T = tangent_bd(G)
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (1, -1, 0, 1), (1, 0, -1, 1)
2: (-1, 1, 0, 1), (0, 1, -1, 1)
3: (-1, 0, 1, 1), (0, -1, 1, 1)
julia> P = projectivization(T)
GKM graph is valid but not 3-independent, so connections may not be unique.
GKM graph with 6 nodes, valency 3 and axial function:
[1]_2 -> [1]_1 => (0, -1, 1, 0)
[2]_1 -> [1]_1 => (-1, 1, 0, 0)
[2]_2 -> [1]_2 => (-1, 1, 0, 0)
[2]_2 -> [2]_1 => (-1, 0, 1, 0)
[3]_1 -> [1]_2 => (-1, 0, 1, 0)
[3]_1 -> [2]_1 => (0, -1, 1, 0)
[3]_2 -> [1]_1 => (-1, 0, 1, 0)
[3]_2 -> [2]_2 => (0, -1, 1, 0)
[3]_2 -> [3]_1 => (-1, 1, 0, 0)
julia> betti_numbers(P)
4-element Vector{Int64}:
1
2
2
1GKMtools.cotangent_bd — Method
cotangent_bd(G::AbstractGKM_graph; scaling_weight::Int64 = 1) -> GKM_vector_bundleReturn the cotangent bundle of G. The torus is enlarged by one dimension where the extra factor scales the fibers of the tangent bundle. The default weight is 1, but can be changed using the optional argument scaling_weight if desired.
Example
julia> G = projective_space(GKM_graph, 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> T = cotangent_bd(G)
GKM vector bundle of rank 3 over GKM graph with 4 nodes and valency 3 with weights:
1: (-1, 1, 0, 0, 1), (-1, 0, 1, 0, 1), (-1, 0, 0, 1, 1)
2: (1, -1, 0, 0, 1), (0, -1, 1, 0, 1), (0, -1, 0, 1, 1)
3: (1, 0, -1, 0, 1), (0, 1, -1, 0, 1), (0, 0, -1, 1, 1)
4: (1, 0, 0, -1, 1), (0, 1, 0, -1, 1), (0, 0, 1, -1, 1)Oscar.projectivization — Function
projectivization(V::GKM_vector_bundle) -> AbstractGKM_graphReturn the projectivisation of the given equivariant vector bundle.
If the given bundle does not admit a unique connection, it must be specified manually by setting the field V.con.
Example
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3]]);
julia> V1 = line_bundle(G, M, GMtoM, [gens(M)[4], gens(M)[4], gens(M)[4]]);
julia> V2 = line_bundle(G, M, GMtoM, [gens(M)[1], gens(M)[2], gens(M)[3]]);
julia> V = direct_sum(V1, V2)
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (0, 0, 0, 1), (1, 0, 0, 0)
2: (0, 0, 0, 1), (0, 1, 0, 0)
3: (0, 0, 0, 1), (0, 0, 1, 0)
julia> P = projectivization(V)
GKM graph with 6 nodes, valency 3 and axial function:
[1]_2 -> [1]_1 => (-1, 0, 0, 1)
[2]_1 -> [1]_1 => (-1, 1, 0, 0)
[2]_2 -> [1]_2 => (-1, 1, 0, 0)
[2]_2 -> [2]_1 => (0, -1, 0, 1)
[3]_1 -> [1]_1 => (-1, 0, 1, 0)
[3]_1 -> [2]_1 => (0, -1, 1, 0)
[3]_2 -> [1]_2 => (-1, 0, 1, 0)
[3]_2 -> [2]_2 => (0, -1, 1, 0)
[3]_2 -> [3]_1 => (0, 0, -1, 1)The naming convention for the vertices of the projectivization's GKM graph is [v]_i where v is a vertex of the original GKM graph and i is the index of the line bundle direct summand to which this vertex of the projectivization corresponds.
GKMtools.baseof — Function
baseof(V::GKM_vector_bundle) -> AbstractGKM_graphReturn the base of the given GKM vector bundle.
GKMtools.gkm_line_bundle_of_toric — Function
gkm_line_bundle_of_toric(V::ToricLineBundle) -> GKM_vector_bundleReturn the GKM line bundle supported on the toric line bundle V.
Example
Let us compute the line bundle of bidegree [1,0] on the Hirzebruch surface $\mathbb{P}(\mathcal{O}_{\mathbb{P}^1}\oplus \mathcal{O}_{\mathbb{P}^1}(4))$.
julia> F4 = hirzebruch_surface(NormalToricVariety, 4);
julia> V = toric_line_bundle(F4, [1,0]);
julia> gkm_line_bundle_of_toric(V)
GKM vector bundle of rank 1 over GKM graph with 4 nodes and valency 2 with weights:
1: (0, 0, -1, 1, 0)
2: (1, 0, -1, 0, 0)
3: (1, 0, -1, 0, 0)
4: (0, 0, -1, 1, 0)GKMtools.gkm_vector_bundle_of_toric — Function
gkm_vector_bundle_of_toric(E::Vector{ToricLineBundle}) -> GKM_vector_bundleReturn the GKM vector bundle supported on the direct sum of the toric line bundles in the vector E.
Example
Let us compute the direct sum of bundles of bidegree [1,0] and [1,1] on the Hirzebruch surface $\mathbb{P}(\mathcal{O}_{\mathbb{P}^1}\oplus \mathcal{O}_{\mathbb{P}^1}(4))$.
julia> F4 = hirzebruch_surface(NormalToricVariety, 4);
julia> V1 = toric_line_bundle(F4, [1,0]);
julia> V2 = toric_line_bundle(F4, [1,1]);
julia> E = [V1, V2];
julia> gkm_vector_bundle_of_toric(E)
GKM vector bundle of rank 2 over GKM graph with 4 nodes and valency 2 with weights:
1: (0, 0, -1, 0, 1, 0), (0, 0, 0, -1, -3, 1)
2: (1, 0, -1, 0, 0, 0), (-3, 0, 0, -1, 0, 1)
3: (1, 0, -1, 0, 0, 0), (1, 1, 0, -1, 0, 0)
4: (0, 0, -1, 0, 1, 0), (0, 1, 0, -1, 1, 0)Linear algebra
LinearAlgebra.rank — Method
rank(V::GKM_vector_bundle) -> Int64Return the rank of the given GKM vector bundle.
Example
julia> G = gkm_graph_of_toric(hirzebruch_surface(NormalToricVariety, 5));
julia> M = free_module(ZZ, 5);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3], g[4]]);
julia> L = line_bundle(G, M, GMtoM, [g[5], g[5], g[5], g[5]]);
julia> rank(direct_sum(L, L, L))
3AbstractAlgebra.direct_sum — Function
direct_sum(V::GKM_vector_bundle{R}...) -> GKM_vector_bundleReturn the direct sum of the given vector bundles. This requires all bundles to have the same base GKM graph and the same character lattice.
Example
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3]]);
julia> V1 = line_bundle(G, M, GMtoM, [gens(M)[4], gens(M)[4], gens(M)[4]]);
julia> V2 = line_bundle(G, M, GMtoM, [gens(M)[1], gens(M)[2], gens(M)[3]]);
julia> V = direct_sum(V1, V2)
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (0, 0, 0, 1), (1, 0, 0, 0)
2: (0, 0, 0, 1), (0, 1, 0, 0)
3: (0, 0, 0, 1), (0, 0, 1, 0)Base.:+ — Method
+(V::GKM_vector_bundle, W::GKM_vector_bundle) -> GKM_vector_bundleReturn the direct sum of two vector bundles. This requires all bundles to have the same base GKM graph and the same character lattice.
Example
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3]]);
julia> V1 = line_bundle(G, M, GMtoM, [gens(M)[4], gens(M)[4], gens(M)[4]]);
julia> V2 = line_bundle(G, M, GMtoM, [gens(M)[1], gens(M)[2], gens(M)[3]]);
julia> V = V1 + V2
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (0, 0, 0, 1), (1, 0, 0, 0)
2: (0, 0, 0, 1), (0, 1, 0, 0)
3: (0, 0, 0, 1), (0, 0, 1, 0)Hecke.dual — Method
dual(V::GKM_vector_bundle) -> GKM_vector_bundleReturn the dual equivariant vector bundle.
Example
julia> G = gkm_graph_of_toric(hirzebruch_surface(NormalToricVariety, 5));
julia> M = free_module(ZZ, 5);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3], g[4]]);
julia> L = line_bundle(G, M, GMtoM, [g[5], g[5], g[5], g[5]])
GKM vector bundle of rank 1 over GKM graph with 4 nodes and valency 2 with weights:
1: (0, 0, 0, 0, 1)
2: (0, 0, 0, 0, 1)
3: (0, 0, 0, 0, 1)
4: (0, 0, 0, 0, 1)
julia> dual(L)
GKM vector bundle of rank 1 over GKM graph with 4 nodes and valency 2 with weights:
1: (0, 0, 0, 0, -1)
2: (0, 0, 0, 0, -1)
3: (0, 0, 0, 0, -1)
4: (0, 0, 0, 0, -1)
Base.:* — Method
*(V::GKM_vector_bundle, W::GKM_vector_bundle) -> GKM_vector_bundleReturn the tensor product of V and W, that is $V \otimes W$.
Example
Let us compute the vector bundle $S\otimes\mathcal{O}(-1)$ of the Grassmannian $G(2, 4)$.
julia> S, Q = tautological_and_univ_bd(GKM_graph, 2, 4);
julia> S
GKM vector bundle of rank 2 over GKM graph with 6 nodes and valency 4 with weights:
12: (-1, 0, 0, 0), (0, -1, 0, 0)
13: (-1, 0, 0, 0), (0, 0, -1, 0)
14: (-1, 0, 0, 0), (0, 0, 0, -1)
23: (0, -1, 0, 0), (0, 0, -1, 0)
24: (0, -1, 0, 0), (0, 0, 0, -1)
34: (0, 0, -1, 0), (0, 0, 0, -1)
julia> O_minus_one = wedge_product(S, 2)
GKM vector bundle of rank 1 over GKM graph with 6 nodes and valency 4 with weights:
12: (-1, -1, 0, 0)
13: (-1, 0, -1, 0)
14: (-1, 0, 0, -1)
23: (0, -1, -1, 0)
24: (0, -1, 0, -1)
34: (0, 0, -1, -1)
julia> S * O_minus_one
GKM vector bundle of rank 2 over GKM graph with 6 nodes and valency 4 with weights:
12: (-2, -1, 0, 0), (-1, -2, 0, 0)
13: (-2, 0, -1, 0), (-1, 0, -2, 0)
14: (-2, 0, 0, -1), (-1, 0, 0, -2)
23: (0, -2, -1, 0), (0, -1, -2, 0)
24: (0, -2, 0, -1), (0, -1, 0, -2)
34: (0, 0, -2, -1), (0, 0, -1, -2)Base.:^ — Method
^(V::GKM_vector_bundle, n::Number) -> GKM_vector_bundleReturn the tensor product $V^{\otimes n}$.
Example
Let us compute the line bundle $l=\mathcal{O}(-4)$ of the Grassmannian $G(2, 4)$.
julia> S, Q = tautological_and_univ_bd(GKM_graph, 2, 4);
julia> S
GKM vector bundle of rank 2 over GKM graph with 6 nodes and valency 4 with weights:
12: (-1, 0, 0, 0), (0, -1, 0, 0)
13: (-1, 0, 0, 0), (0, 0, -1, 0)
14: (-1, 0, 0, 0), (0, 0, 0, -1)
23: (0, -1, 0, 0), (0, 0, -1, 0)
24: (0, -1, 0, 0), (0, 0, 0, -1)
34: (0, 0, -1, 0), (0, 0, 0, -1)
julia> O_minus_one = wedge_product(S, 2)
GKM vector bundle of rank 1 over GKM graph with 6 nodes and valency 4 with weights:
12: (-1, -1, 0, 0)
13: (-1, 0, -1, 0)
14: (-1, 0, 0, -1)
23: (0, -1, -1, 0)
24: (0, -1, 0, -1)
34: (0, 0, -1, -1)
julia> l = O_minus_one^4
GKM vector bundle of rank 1 over GKM graph with 6 nodes and valency 4 with weights:
12: (-4, -4, 0, 0)
13: (-4, 0, -4, 0)
14: (-4, 0, 0, -4)
23: (0, -4, -4, 0)
24: (0, -4, 0, -4)
34: (0, 0, -4, -4)GKMtools.wedge_product — Function
wedge_product(V::GKM_vector_bundle, n::Int64) -> GKM_vector_bundleReturn the wedge product, or external product, $\wedge^n V$.
Example
Let us compute $\wedge^3 Q$ where Q is the universal quotient bundle of the Grassmannian $G(2, 5)$.
julia> S, Q = tautological_and_univ_bd(GKM_graph, 2, 5);
julia> wedge_product(Q, 2)
GKM vector bundle of rank 3 over GKM graph with 10 nodes and valency 6 with weights:
12: (0, 0, -1, -1, 0), (0, 0, -1, 0, -1), (0, 0, 0, -1, -1)
13: (0, -1, 0, -1, 0), (0, -1, 0, 0, -1), (0, 0, 0, -1, -1)
14: (0, -1, -1, 0, 0), (0, -1, 0, 0, -1), (0, 0, -1, 0, -1)
15: (0, -1, -1, 0, 0), (0, -1, 0, -1, 0), (0, 0, -1, -1, 0)
23: (-1, 0, 0, -1, 0), (-1, 0, 0, 0, -1), (0, 0, 0, -1, -1)
24: (-1, 0, -1, 0, 0), (-1, 0, 0, 0, -1), (0, 0, -1, 0, -1)
25: (-1, 0, -1, 0, 0), (-1, 0, 0, -1, 0), (0, 0, -1, -1, 0)
34: (-1, -1, 0, 0, 0), (-1, 0, 0, 0, -1), (0, -1, 0, 0, -1)
35: (-1, -1, 0, 0, 0), (-1, 0, 0, -1, 0), (0, -1, 0, -1, 0)
45: (-1, -1, 0, 0, 0), (-1, 0, -1, 0, 0), (0, -1, -1, 0, 0)GKMtools.sym_product — Function
sym_product(V::GKM_vector_bundle, n::Int64) -> GKM_vector_bundleReturn the symmetric product $\mathrm{Sym}^n V$.
Example
Let us compute $\mathrm{Sym}^2 Q$ where Q is the universal quotient bundle of the Grassmannian $G(3, 5)$.
julia> S, Q = tautological_and_univ_bd(GKM_graph, 3, 5);
julia> sym_product(Q, 2)
GKM vector bundle of rank 3 over GKM graph with 10 nodes and valency 6 with weights:
123: (0, 0, 0, -2, 0), (0, 0, 0, -1, -1), (0, 0, 0, 0, -2)
124: (0, 0, -2, 0, 0), (0, 0, -1, 0, -1), (0, 0, 0, 0, -2)
125: (0, 0, -2, 0, 0), (0, 0, -1, -1, 0), (0, 0, 0, -2, 0)
134: (0, -2, 0, 0, 0), (0, -1, 0, 0, -1), (0, 0, 0, 0, -2)
135: (0, -2, 0, 0, 0), (0, -1, 0, -1, 0), (0, 0, 0, -2, 0)
145: (0, -2, 0, 0, 0), (0, -1, -1, 0, 0), (0, 0, -2, 0, 0)
234: (-2, 0, 0, 0, 0), (-1, 0, 0, 0, -1), (0, 0, 0, 0, -2)
235: (-2, 0, 0, 0, 0), (-1, 0, 0, -1, 0), (0, 0, 0, -2, 0)
245: (-2, 0, 0, 0, 0), (-1, 0, -1, 0, 0), (0, 0, -2, 0, 0)
345: (-2, 0, 0, 0, 0), (-1, -1, 0, 0, 0), (0, -2, 0, 0, 0)Missing docstring for det(::GKMtools.GKM_vector_bundle). Check Documenter's build log for details.
Connections
GKMtools.get_connection — Method
get_connection(V::GKM_vector_bundle)Return the connection of the given vector bundle, if it is unique or has been set manually. If the vector bundle does not admit a unique connection and it has not bene set manually, return nothing.
Mathematical description:
This is the same concept as a Connection on a GKM graph. Let G be the GKM graph that is the basis of the vector bundle V. Assume that G comes from a GKM space $X$. Then each edge of e corresponds to an invariant rational curve $C_e$ in $X$. If $V$ is an equivariant line bundle overe $X$, then its restriction to $C_e\cong\mathbb{P}^1$ splits into a direct sum of equivariant line bundles. This defines a bijection between the direct summands of $V$ at $\text{src}(e)$ and the direct summands of $V$ at $\text{dst}(e)$.
This bijection is recorded in the returned object.
Example
julia> G = projective_space(GKM_graph, 2);
julia> M = free_module(ZZ, 4);
julia> g = gens(M);
julia> GMtoM = ModuleHomomorphism(G.M, M, [g[1], g[2], g[3]]);
julia> V = vector_bundle(G, M, GMtoM, [g[1] g[4]; g[2] g[4]; g[3] g[4]])
GKM vector bundle of rank 2 over GKM graph with 3 nodes and valency 2 with weights:
1: (1, 0, 0, 0), (0, 0, 0, 1)
2: (0, 1, 0, 0), (0, 0, 0, 1)
3: (0, 0, 1, 0), (0, 0, 0, 1)
julia> get_connection(V)
Dict{Tuple{Edge, Int64}, Int64} with 12 entries:
(Edge(3, 1), 2) => 2
(Edge(1, 2), 1) => 1
(Edge(3, 1), 1) => 1
(Edge(1, 2), 2) => 2
(Edge(3, 2), 1) => 1
(Edge(2, 3), 1) => 1
(Edge(3, 2), 2) => 2
(Edge(2, 3), 2) => 2
(Edge(1, 3), 1) => 1
(Edge(2, 1), 1) => 1
(Edge(1, 3), 2) => 2
(Edge(2, 1), 2) => 2It is visible here that the vector bundle is a direct sum of two line bundles, since we have (e, i) => i for each edge e and index i. The output will be more complicated when the vector bundle does not split into line bundles.
GKMtools.get_any_connection — Method
get_any_connection(V::GKM_vector_bundle)Return any compatible connection for the given vector bundle, if one exists. The result does not necessarily agree with the splittings of $V$ over the $T$-stable $\mathbb{P}^1$s. However, for many applications in Gromov–Witten theory, any compatible connection is enough.
Important Examples
GKMtools.vector_bundle_O — Method
vector_bundle_O(n::Int64, d::Vector{Int64})Given $d=(d_1, d_2,\dots,d_r)$, return the vector bundle $\mathcal{O}(d_1)\oplus\cdots\oplus\mathcal{O}(d_r)\rightarrow \mathbb{P}^n$, linearized so that each summand has its own equivariant parameter.
Example
Let us see $\mathcal{O}(-3)\oplus\mathcal{O}(0)\oplus\mathcal{O}(5)$ on $\mathbb{P}^3$.
julia> V = GKMtools.vector_bundle_O(3, [-3, 0, 5])
GKM vector bundle of rank 3 over GKM graph with 4 nodes and valency 3 with weights:
1: (0, 0, 0, 0, 1, 0, 0), (0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 0, 1)
2: (3, -3, 0, 0, 1, 0, 0), (0, 0, 0, 0, 0, 1, 0), (-5, 5, 0, 0, 0, 0, 1)
3: (3, 0, -3, 0, 1, 0, 0), (0, 0, 0, 0, 0, 1, 0), (-5, 0, 5, 0, 0, 0, 1)
4: (3, 0, 0, -3, 1, 0, 0), (0, 0, 0, 0, 0, 1, 0), (-5, 0, 0, 5, 0, 0, 1)The acting torus has rank 7. The first 4 copies of $\mathbb{C}^\times$ act on the base $\mathbb{P}^3$, the remaining 3 are just there to scale the fibres.
GKMtools.tautological_and_univ_bd — Function
tautological_and_univ_bd(::Type{GKM_graph}, k::Int, n::Int) -> GKM_vector_bundle{ZZRingElem}Return a pair (S, Q) where S is the tautological vector bundle, and Q is the universal quotient bundle of the Grassmann variety of k-planes in the complex vector space of dimension n.
Example
julia> S, Q = tautological_and_univ_bd(GKM_graph, 2, 4);
julia> S
GKM vector bundle of rank 2 over GKM graph with 6 nodes and valency 4 with weights:
12: (-1, 0, 0, 0), (0, -1, 0, 0)
13: (-1, 0, 0, 0), (0, 0, -1, 0)
14: (-1, 0, 0, 0), (0, 0, 0, -1)
23: (0, -1, 0, 0), (0, 0, -1, 0)
24: (0, -1, 0, 0), (0, 0, 0, -1)
34: (0, 0, -1, 0), (0, 0, 0, -1)
julia> Q
GKM vector bundle of rank 2 over GKM graph with 6 nodes and valency 4 with weights:
12: (0, 0, -1, 0), (0, 0, 0, -1)
13: (0, -1, 0, 0), (0, 0, 0, -1)
14: (0, -1, 0, 0), (0, 0, -1, 0)
23: (-1, 0, 0, 0), (0, 0, 0, -1)
24: (-1, 0, 0, 0), (0, 0, -1, 0)
34: (-1, 0, 0, 0), (0, -1, 0, 0)Generalized GKM flags
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)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$).
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 GKM graph with 6 nodes and valency 5 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{GKMtools.GKM_vector_bundle{QQFieldElem}}:
GKM vector bundle of rank 2 over GKM graph with 10 vertices
GKM vector bundle of rank 1 over GKM graph with 10 vertices
GKM vector bundle of rank 3 over GKM graph with 10 vertices
GKM vector bundle of rank 3 over GKM graph with 10 vertices
julia> bds[1] # this is the tautological bundle over G(2,5)
GKM vector bundle of rank 2 over GKM graph with 10 nodes and valency 6 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 GKM graph with 10 nodes and valency 6 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{GKMtools.GKM_vector_bundle{QQFieldElem}}:
GKM vector bundle of rank 2 over GKM graph with 12 vertices
GKM vector bundle of rank 1 over GKM graph with 12 vertices
GKM vector bundle of rank 2 over GKM graph with 12 vertices
julia> E = bds[1] # this is the tautological bundle over OG(2,7)
GKM vector bundle of rank 2 over GKM graph with 12 nodes and valency 7 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 dual(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
(4*t1 + 4*t2)*e[1] + (4*t1 + 4*t3)*e[2] + (4*t2 + 4*t3)*e[3] + (4*t1 - 4*t3)*e[4] + (4*t2 - 4*t3)*e[5] + (-4*t2 + 4*t3)*e[6] + (-4*t1 + 4*t3)*e[7] + (4*t1 - 4*t2)*e[8] + (-4*t1 + 4*t2)*e[9] + (-4*t2 - 4*t3)*e[10] + (-4*t1 - 4*t3)*e[11] + (-4*t1 - 4*t2)*e[12]
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