Constructors
These functions allow the construction of GKM varieties.
GKMtools.gkm_graph
— Functiongkm_graph(g, labels, M, w; check=true, checkLabels=true) -> GKM_graph
Create a GKM graph from the given data.
Arguments
g::Graph
: An unoriented OSCAR graph.labels::Vector{String}
: A vector of strings, used to denote the vertices.M::AbstractAlgebra.Generic.FreeModule{R}
: A OSCAR free module over $\mathbb{Z}$ or $\mathbb{Q}$, it denotes the character group.R
is eitherZZRingElem
orQQFieldElem
.w::Dict{Edge, AbstractAlgebra.Generic.FreeModuleElem{R}}
: The axial function. Note that it is enough to specify the weight of each edge in one orientation here. The opposite oriented edge will automatically be given minus that weight.check::Bool=true
: Check if the data inserted are consistent.checkLabels::Bool=true
: Check that the labels don't contain the characters<
,[
,]
, which are reserved for the output of special constructions like blowups and projective bundles.
Example
Let us construct the GKM graph of the projective line. First of all, we create a graph with two vertices, and one edge.
julia> g = Graph{Undirected}(2)
Undirected graph with 2 nodes and no edges
julia> add_edge!(g, 1, 2);
Let us define our array of labels.
julia> labels = ["a", "b"];
Now, we create the character group. We take a free module of rank 2 over the integers.
julia> M = free_module(ZZ, 2)
Free module of rank 2 over ZZ
We create the axial function. It is a dictionary from the set of edges to the character group. This time we have only one edge.
julia> e = first(edges(g));
julia> w = Dict(e => gens(M)[1] - gens(M)[2])
Dict{Edge, AbstractAlgebra.Generic.FreeModuleElem{ZZRingElem}} with 1 entry:
Edge(2, 1) => (1, -1)
Finally, we create the GKM graph.
julia> gkm_graph(g, labels, M, w)
GKM graph with 2 nodes, valency 1 and axial function:
b -> a => (1, -1)
GKMtools.empty_gkm_graph
— Functionempty_gkm_graph(n::Int64, r::Int64, labels::Vector{String}) -> GKM_graph
Return the GKM graph with n
fixed points, no edges, torus rank r
and vertices labelled by labels
.
Example
julia> G = empty_gkm_graph(2, 2, ["a", "b"])
GKM graph with 2 nodes, valency 0 and axial function:
GKMtools.initialize!
— Functioninitialize!(gkm::GKM_graph; connection::Bool=true, curveClasses::Bool=true)
You may optionally call this function as soon as all edges have been added to the GKM graph to calculate the GKM connection (if unique) and the curve classes of the gkm graph. This will set the fields gkm.connection
and gkm.H2
that are initially nothing
. If you don't call this, these fields will be initialized later if possible, which might take some time at unexpected moments (especially for curve classes). If any of those fields are already set, this will not overwrite them.
GKMtools.convert_weights
— Functionconvert_weights(G::GKM_graph) -> GKM_graph{QQFieldElem}
It returns $G$, but the character group will be embedded into a free $\mathbb{Q}$-module.
Examples
julia> G_over_Z = generalized_gkm_flag(root_system(:A, 1))
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (-1, 1)
julia> typeof(G_over_Z)
GKM_graph{ZZRingElem}
julia> G_over_Q = convert_weights(G_over_Z)
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (-1, 1)
julia> typeof(G_over_Q)
GKM_graph{QQFieldElem}
Base.isvalid
— Methodisvalid(gkm::GKM_graph; printDiagnostics::Bool=true) -> Bool
Return true if the GKM graph is valid. This means:
- Every vertex has the same degree
- The weights are defined for every edge and every reverse of every edge
- The weights belong to the weight lattice
- The weights of an edge and its reverse sum to zero
- There are the right number of vertex labels
- If the valency is at least two, the weights of the graph are 2-independent.
- Vertex labels must be unique
- The equivariant cohomology ring has rank = number of vertices of graph
- The coefficient ring of the equivariant cohomology ring has number of generators = torus rank.
Examples
The standard constructions always produce valid GKM graphs, e.g. the complex projective space $\mathbb{P}^3$:
julia> isvalid(projective_space(GKM_graph, 3))
true
On the other hand, here is an example showing why one should never modify the underlying OSCAR graph of a GKM graph directly:
julia> G = empty_gkm_graph(3, 1, ["v1", "v2", "v3"])
GKM graph with 3 nodes, valency 0 and axial function:
julia> add_edge!(G.g, 1, 2)
true
julia> isvalid(G)
The valency is not the same for all vertices
false
julia> add_edge!(G.g, 1, 3)
true
julia> add_edge!(G.g, 2, 3)
true
julia> isvalid(G)
Weight of Edge(2, 1) is missing.
false
Instead, one should add all edges with add_edge!(G, "v1", "v2", weight)
(see above).