Vector Bundles

Theory of GKM vector bundles, see [GSZ12].

Oscar.IntersectionTheory.line_bundleFunction
line_bundle(G::AbstractGKM_graph, M::AbstractAlgebra.Generic.FreeModule{R}, GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}, weights::Vector{AbstractAlgebra.Generic.FreeModuleElem{R}}) -> GKM_vector_bundle

Return 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 graph
  • M::AbstractAlgebra.Generic.FreeModule{R}: The weight lattice of the torus acting on the line bundle. This is often bigger than the torus acting on G, for example when there is an extra scaling-action on the fibres.
  • GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}: The inclusion of G.M (the weight lattice of the torus acting on G) into M (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 of G.

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)
source
GKMtools.vector_bundleFunction
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_bundle

Construct 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 on G, for example when there is an extra scaling-action on the fibres.
  • GMtoM::AbstractAlgebra.Generic.ModuleHomomorphism{R}: The inclusion of G.M (the weight lattice of the torus acting on G) into M (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 of G), 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 that weights[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)
source
LinearAlgebra.rankMethod
rank(V::GKM_vector_bundle) -> Int64

Return 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))
3
source
AbstractAlgebra.direct_sumFunction
direct_sum(V::GKM_vector_bundle{R}...) -> GKM_vector_bundle

Return 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)
source
Hecke.dualMethod
dual(V::GKM_vector_bundle) -> GKM_vector_bundle

Return 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)
source
GKMtools.get_connectionMethod
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) => 2

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

source
Oscar.projectivizationFunction
projectivization(V::GKM_vector_bundle) -> AbstractGKM_graph

Return the projectivisation of the given equivariant vector bundle.

Note

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.

source
GKMtools.tangent_bdMethod
tangent_bd(G::AbstractGKM_graph; scaling_weight::Int64 = 1) -> GKM_vector_bundle

Return 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
 1
source
GKMtools.cotangent_bdMethod
cotangent_bd(G::AbstractGKM_graph; scaling_weight::Int64 = 1) -> GKM_vector_bundle

Return 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)
source