Operators

GKM Subgraphs

The following figure shows the GKM subgraph of a Schubert variety $X_w$ in the full flag variety of $\mathbb{C}^3$. Edge labels are illustrate the axial function, while the vertex labels describe the equivariant Poincaré dual of $X_w$ via localization. Illustration of GKM subspaces

GKMtools.gkm_subgraph_from_verticesFunction
gkm_subgraph_from_vertices(gkm::AbstractGKM_graph, vertices::Vector{Int64}; include_all_flags::Bool=false) -> AbstractGKM_subgraph

Return the GKM subgraph induced by the given vertices.

Arguments

  • gkm: The supergraph
  • vertices: Vector of vertex indices to include in the subgraph
  • include_all_flags: If true, includes all flags at the subgraph vertices. If false (default), only includes flags corresponding to edges contained in the subgraph.
Note
  1. This does not check if the result is a valid GKM graph (use isvalid for that).
  2. If possible, the subgraph will be endowed with the connection induced from the supergraph.
  3. If include_all_flags=true then the valency of the subgraph will be identical with the valency of the given graph.

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> S = gkm_subgraph_from_vertices(G, [2, 3])
GKM subgraph of:
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)
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
3 -> 2 => (0, -1, 1, 0)

julia> S.self
GKM graph with 2 nodes, valency 1 and axial function:
3 -> 2 => (0, -1, 1, 0)

julia> S.super
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> S2 = gkm_subgraph_from_vertices(G, [2, 3]; include_all_flags=true).self
GKM graph with 2 nodes, valency 3 and axial function:
3 -> 2 => (0, -1, 1, 0)
Standalone flags:
2.1 => (-1, 1, 0, 0)
2.3 => (0, 1, 0, -1)
3.1 => (-1, 0, 1, 0)
3.3 => (0, 0, 1, -1)
source
gkm_subgraph_from_vertices(gkm::AbstractGKM_graph, vertexLabels::Vector{String}; include_all_flags::Bool=false) -> AbstractGKM_subgraph

As before, but the vertices are given by their labels.

source
GKMtools.gkm_subgraph_from_edgesFunction
gkm_subgraph_from_edges(gkm::AbstractGKM_graph, edges::Vector{Edge}; include_standalone_flags::Bool=false) -> AbstractGKM_subgraph

Return the GKM subgraph induced by the given edges.

Arguments

  • gkm: The supergraph
  • edges: Vector of edges to include in the subgraph
  • include_all_flags: If true, includes all flags at the subgraph vertices. If false (default), only includes edge flags.
Note
  1. This does not check if the result is a valid GKM graph (use isvalid for that).
  2. If possible, the subgraph will be endowed with the connection induced from the supergraph.
  3. If include_all_flags=true the result will have the same valency as the given GKM graph.

Example

julia> G = projective_space(GKM_graph, 3);

julia> S = gkm_subgraph_from_edges(G, [Edge(1, 2), Edge(2, 3)])
GKM subgraph of:
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)
Subgraph:
GKM graph with 3 nodes, valency 1 and axial function:
2 -> 1 => (-1, 1, 0, 0)
3 -> 2 => (0, -1, 1, 0)
source
GKMtools.gkm_subgraph_from_flagsFunction
gkm_subgraph_from_flags(gkm::AbstractGKM_graph, sub_vertices::Vector{Int64}, sub_flags::Vector{Vector{Int64}}) -> AbstractGKM_subgraph

Return the GKM subgraph induced by the given vertices and flags. The subgraph includes vertex sub_vertices[i] from the supergraph as vertex i in the subgraph. For each vertex i in the subgraph, sub_flags[i] specifies which flags from the supergraph vertex sub_vertices[i] are included in the subgraph.

The edges of the subgraph are determined by the flags: an edge is included if and only if both of its corresponding flags are included in the flag subset.

Note
  1. This does not check if the result is a valid GKM graph (use isvalid for that).
  2. If possible, the subgraph will be endowed with the connection induced from the supergraph.
  3. To create a compact GKM subgraph, it is easier to use gkm_subgraph_from_vertices or gkm_subgraph_from_edges instead.

Example

julia> P2 = projective_space(GKM_graph, 2);

julia> # Add standalone flags to make it non-compact
       add_standalone_flag!(P2, 1, gens(P2.M)[1]);

julia> add_standalone_flag!(P2, 2, gens(P2.M)[2]);

julia> add_standalone_flag!(P2, 3, gens(P2.M)[3]);

julia> # Create a subgraph with vertices [1,2] and specific flags
       # Vertex 1 has flags [1, 3] (first edge flag and the standalone flag)
       # Vertex 2 has flags [1, 3] (first edge flag and the standalone flag)
       S = gkm_subgraph_from_flags(P2, [1, 2], [[1, 3], [1, 3]])
GKM subgraph of:
GKM graph with 3 nodes, valency 3 and axial function:
2 -> 1 => (-1, 1, 0)
3 -> 1 => (-1, 0, 1)
3 -> 2 => (0, -1, 1)
Standalone flags:
1.3 => (1, 0, 0)
2.3 => (0, 1, 0)
3.3 => (0, 0, 1)
Subgraph:
GKM graph with 2 nodes, valency 2 and axial function:
2 -> 1 => (-1, 1, 0)
Standalone flags:
1.2 => (1, 0, 0)
2.2 => (0, 1, 0)
source
Base.isvalidMethod
isvalid(gkmsub::AbstractGKM_subgraph; printDiagnostics::Bool = true) -> Bool

Return true if the given GKM subgraph is valid. This holds if and only if all of the following hold:

  1. The supergraph and subgraph are both valid GKM graphs of the same character group
  2. The subgraph is mathematically a subgraph of the supergraph
  3. The edge weights of the subgraph match that of the supergraph
  4. The vertex labels of the subgraph and the supergraph match
  5. The flag weights of the subgraph match the corresponding flags in the supergraph
  6. flagDict correctly maps flags from subgraph to supergraph
Warning

If a connection for the supergraph is set, this does not check if it is compatible with the subgraph. Use is_compatible_with_connection() for this.

source

Blowups

The following figure illustrates the effect of blowups along a GKM subgraph (red) on the underlying graph. Illustration of blowups along sub-GKM-graphs

Oscar.blow_upFunction
blow_up(gkmSub::AbstractGKM_subgraph) -> AbstractGKM_subgraph

Return the tuple (GKM graph of blowup, GKM graph of exceptional divisor) from (GKM graph, GKM subgraph, connection on supergraph), where both are encoded as AbstractGKM_subgraph.

Note

The GKM graph needs to have the connection field set. The returned blowup graph and subgraph will also have the connection field set, but not the curveClasses field. (It will be calculated automatically on demand via GKM_second_homology()). Mathematically, this follows [GZ01, section 2.2.1].

Warning

The natural connection induced on the blowup is not yet implemented. However, this is not required for applications in Gromov-Witten theory.

Examples

julia> G = projective_space(GKM_graph, 3) # 3-dimensional projective space
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> S = gkm_subgraph_from_vertices(G, [1, 2]) # we take the subgraph of two vertices, it corresponds to a line
GKM subgraph of:
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)
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
2 -> 1 => (-1, 1, 0, 0)

julia> blowupSub = blow_up(S) # blowup of P3 along the line S
GKM subgraph of:
GKM graph with 6 nodes, valency 3 and axial function:
[1>4] -> [1>3] => (0, 0, -1, 1)
[2>3] -> [1>3] => (-1, 1, 0, 0)
[2>4] -> [1>4] => (-1, 1, 0, 0)
[2>4] -> [2>3] => (0, 0, -1, 1)
3 -> [1>3] => (-1, 0, 1, 0)
3 -> [2>3] => (0, -1, 1, 0)
4 -> [1>4] => (-1, 0, 0, 1)
4 -> [2>4] => (0, -1, 0, 1)
4 -> 3 => (0, 0, -1, 1)
Subgraph:
GKM graph with 4 nodes, valency 2 and axial function:
[1>4] -> [1>3] => (0, 0, -1, 1)
[2>3] -> [1>3] => (-1, 1, 0, 0)
[2>4] -> [1>4] => (-1, 1, 0, 0)
[2>4] -> [2>3] => (0, 0, -1, 1)

julia> Spoint = gkm_subgraph_from_vertices(G, [1]) # we take the subgraph of one vertex that is an invariant point
GKM subgraph of:
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)
Subgraph:
GKM graph with 1 nodes, valency 0 and axial function:

julia> blowupPt = blow_up(Spoint) # blowup of P3 at a point
GKM subgraph of:
GKM graph with 6 nodes, valency 3 and axial function:
[1>3] -> [1>2] => (0, -1, 1, 0)
[1>4] -> [1>2] => (0, -1, 0, 1)
[1>4] -> [1>3] => (0, 0, -1, 1)
2 -> [1>2] => (-1, 1, 0, 0)
3 -> [1>3] => (-1, 0, 1, 0)
3 -> 2 => (0, -1, 1, 0)
4 -> [1>4] => (-1, 0, 0, 1)
4 -> 2 => (0, -1, 0, 1)
4 -> 3 => (0, 0, -1, 1)
Subgraph:
GKM graph with 3 nodes, valency 2 and axial function:
[1>3] -> [1>2] => (0, -1, 1, 0)
[1>4] -> [1>2] => (0, -1, 0, 1)
[1>4] -> [1>3] => (0, 0, -1, 1)

Let us also blowup a non-compact GKM graph:

julia> G = empty_gkm_graph(3, 2, ["1", "2", "3"]);

julia> g1, g2 = gens(G.M);

julia> add_edge!(G, 1, 2, g1);

julia> add_edge!(G, 2, 3, -g2);

julia> add_standalone_flag!(G, 1, g2);

julia> add_standalone_flag!(G, 1, -g1-g2);

julia> add_standalone_flag!(G, 2, g1+g2);

julia> add_standalone_flag!(G, 3, g1);

julia> add_standalone_flag!(G, 3, -g1-g2);

julia> set_connection!(G, get_any_connection(G)); # Set connection manually G is not 3-independent.

julia> S_cpct = gkm_subgraph_from_vertices(G, [1, 2])
GKM subgraph of:
GKM graph with 3 nodes, valency 3 and axial function:
2 -> 1 => (-1, 0)
3 -> 2 => (0, 1)
Standalone flags:
1.2 => (0, 1)
1.3 => (-1, -1)
2.3 => (1, 1)
3.2 => (1, 0)
3.3 => (-1, -1)
Subgraph:
GKM graph with 2 nodes, valency 1 and axial function:
2 -> 1 => (-1, 0)

julia> B = blow_up(S_cpct)
GKM subgraph of:
GKM graph with 5 nodes, valency 3 and axial function:
[1>F3] -> [1>F2] => (1, 2)
[2>3] -> [1>F3] => (-1, 0)
[2>F3] -> [1>F2] => (-1, 0)
[2>F3] -> [2>3] => (-1, -2)
3 -> [2>3] => (0, 1)
Standalone flags:
[1>F2].2 => (0, 1)
[1>F3].2 => (-1, -1)
[2>F3].2 => (1, 1)
3.1 => (1, 0)
3.2 => (-1, -1)
Subgraph:
GKM graph with 4 nodes, valency 2 and axial function:
[1>F3] -> [1>F2] => (1, 2)
[2>3] -> [1>F3] => (-1, 0)
[2>F3] -> [1>F2] => (-1, 0)
[2>F3] -> [2>3] => (-1, -2)

julia> # And another example where the subgraph that we blow up has standalone flags:

julia> S_non_cpct = gkm_subgraph_from_flags(G, [1, 2], [[1, 2], [1, 3]])
GKM subgraph of:
GKM graph with 3 nodes, valency 3 and axial function:
2 -> 1 => (-1, 0)
3 -> 2 => (0, 1)
Standalone flags:
1.2 => (0, 1)
1.3 => (-1, -1)
2.3 => (1, 1)
3.2 => (1, 0)
3.3 => (-1, -1)
Subgraph:
GKM graph with 2 nodes, valency 2 and axial function:
2 -> 1 => (-1, 0)
Standalone flags:
1.2 => (0, 1)
2.2 => (1, 1)

julia> B2 = blow_up(S_non_cpct)
GKM subgraph of:
GKM graph with 3 nodes, valency 3 and axial function:
[2>3] -> [1>F3] => (-1, 0)
3 -> [2>3] => (0, 1)
Standalone flags:
[1>F3].1 => (-1, -1)
[1>F3].2 => (0, 1)
[2>3].1 => (1, 1)
3.1 => (1, 0)
3.2 => (-1, -1)
Subgraph:
GKM graph with 2 nodes, valency 2 and axial function:
[2>3] -> [1>F3] => (-1, 0)
Standalone flags:
[1>F3].1 => (0, 1)
[2>3].1 => (1, 1)
Warning

Blowups along non-closed subgraphs may result in invalid GKM graphs, like in the following example. The convention is that Edge(s,d) with s in the subgraph and d only creates an edge in the blowup if the flag for Edge(s,d) at s is not contained in the subgraph.

julia> P3 = 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> S = gkm_subgraph_from_flags(P3, [1, 2], [[1, 2], [1, 2]])
GKM subgraph of:
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)
Subgraph:
GKM graph with 2 nodes, valency 2 and axial function:
2 -> 1 => (-1, 1, 0, 0)
Standalone flags:
1.2 => (1, 0, -1, 0)
2.2 => (0, 1, -1, 0)

julia> B = blow_up(S)
The number of flags is not the same for all vertices
┌ Warning: Creating GKM subgraph of invalid gkm graph. This may result in undefined behavior.
└ @ GKMtools GKMsubgraphs.jl:243
GKM subgraph of:
GKM graph with 4 nodes, valency 3 and axial function:
[2>4] -> [1>4] => (-1, 1, 0, 0)
4 -> [1>4] => (-1, 0, 0, 1)
4 -> [2>4] => (0, -1, 0, 1)
4 -> 3 => (0, 0, -1, 1)
Standalone flags:
[1>4].1 => (1, 0, -1, 0)
[2>4].1 => (0, 1, -1, 0)
Subgraph:
GKM graph with 2 nodes, valency 2 and axial function:
[2>4] -> [1>4] => (-1, 1, 0, 0)
Standalone flags:
[1>4].1 => (1, 0, -1, 0)
[2>4].1 => (0, 1, -1, 0)

The warning above is thrown because the blowup GKM graph has non-constant valency, so creating the exceptional locus as GKM subgraph of an invalid GKM graph throws a warning.

source

Products

Base.:*Method
*(G1::AbstractGKM_graph, G2::AbstractGKM_graph; calculateCurveClasses::Bool=true, calculateConnection::Bool=true) -> AbstractGKM_graph

It constructs the product of two GKM graphs.

Examples

julia> G = generalized_gkm_flag(root_system(:A, 1))
GKM graph with 2 nodes, valency 1 and axial function:
s1 -> id => (-1, 1)

julia> G*G
GKM graph with 4 nodes, valency 2 and axial function:
s1,id -> id,id => (-1, 1, 0, 0)
id,s1 -> id,id => (0, 0, -1, 1)
s1,s1 -> s1,id => (0, 0, -1, 1)
s1,s1 -> id,s1 => (-1, 1, 0, 0)
Note

The character group is of type free $\mathbb{Q}$-module if this holds for one of the two GKM graphs.

source