Constructors

These functions allow the construction of GKM varieties.

GKMtools.gkm_graphFunction
gkm_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 either ZZRingElem or QQFieldElem.
  • 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)
Warning
  1. Do not change the number of verices after this.
  2. Don't modify the underlying OSCAR graph directly after this. Use the functions of this package instead.
  3. All edges should be added immediately after calling this function and not changed afterwards.
Note

After you have added all edges using add_edge!, you may use initialize! to calculate the GKM connection (if it is unique) and the curve classes. If you don't do this, those data will be calculated whenever required for the first time.

source
GKMtools.empty_gkm_graphFunction
empty_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:
source
Missing docstring.

Missing docstring for add_edge!. Check Documenter's build log for details.

GKMtools.initialize!Function
initialize!(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.

source
GKMtools.convert_weightsFunction
convert_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}
source
Base.isvalidMethod
isvalid(gkm::GKM_graph; printDiagnostics::Bool=true) -> Bool

Return true if the GKM graph is valid. This means:

  1. Every vertex has the same degree
  2. The weights are defined for every edge and every reverse of every edge
  3. The weights belong to the weight lattice
  4. The weights of an edge and its reverse sum to zero
  5. There are the right number of vertex labels
  6. If the valency is at least two, the weights of the graph are 2-independent.
  7. Vertex labels must be unique
  8. The equivariant cohomology ring has rank = number of vertices of graph
  9. 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).

source