Vector Bundles
Theory of GKM vector bundles, see [GSZ12].
Oscar.IntersectionTheory.line_bundle
— Functionline_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 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
— Functionvector_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 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)
LinearAlgebra.rank
— Methodrank(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
AbstractAlgebra.direct_sum
— Functiondirect_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)
Hecke.dual
— Methoddual(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)
GKMtools.get_connection
— Methodget_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.
Oscar.projectivization
— Functionprojectivization(V::GKM_vector_bundle) -> AbstractGKM_graph
Return 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.tangent_bd
— Methodtangent_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
GKMtools.cotangent_bd
— Methodcotangent_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)