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.
GKMtools.gkm_subgraph_from_vertices — Function
gkm_subgraph_from_vertices(gkm::AbstractGKM_graph, vertices::Vector{Int64}; include_all_flags::Bool=false) -> AbstractGKM_subgraphReturn the GKM subgraph induced by the given vertices.
Arguments
gkm: The supergraphvertices: Vector of vertex indices to include in the subgraphinclude_all_flags: Iftrue, includes all flags at the subgraph vertices. Iffalse(default), only includes flags corresponding to edges contained in the subgraph.
- This does not check if the result is a valid GKM graph (use
isvalidfor that). - If possible, the subgraph will be endowed with the connection induced from the supergraph.
- If
include_all_flags=truethen 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)gkm_subgraph_from_vertices(gkm::AbstractGKM_graph, vertexLabels::Vector{String}; include_all_flags::Bool=false) -> AbstractGKM_subgraphAs before, but the vertices are given by their labels.
GKMtools.gkm_subgraph_from_edges — Function
gkm_subgraph_from_edges(gkm::AbstractGKM_graph, edges::Vector{Edge}; include_standalone_flags::Bool=false) -> AbstractGKM_subgraphReturn the GKM subgraph induced by the given edges.
Arguments
gkm: The supergraphedges: Vector of edges to include in the subgraphinclude_all_flags: Iftrue, includes all flags at the subgraph vertices. Iffalse(default), only includes edge flags.
- This does not check if the result is a valid GKM graph (use
isvalidfor that). - If possible, the subgraph will be endowed with the connection induced from the supergraph.
- If
include_all_flags=truethe 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)GKMtools.gkm_subgraph_from_flags — Function
gkm_subgraph_from_flags(gkm::AbstractGKM_graph, sub_vertices::Vector{Int64}, sub_flags::Vector{Vector{Int64}}) -> AbstractGKM_subgraphReturn 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.
- This does not check if the result is a valid GKM graph (use
isvalidfor that). - If possible, the subgraph will be endowed with the connection induced from the supergraph.
- To create a compact GKM subgraph, it is easier to use
gkm_subgraph_from_verticesorgkm_subgraph_from_edgesinstead.
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)Base.isvalid — Method
isvalid(gkmsub::AbstractGKM_subgraph; printDiagnostics::Bool = true) -> BoolReturn true if the given GKM subgraph is valid. This holds if and only if all of the following hold:
- The supergraph and subgraph are both valid GKM graphs of the same character group
- The subgraph is mathematically a subgraph of the supergraph
- The edge weights of the subgraph match that of the supergraph
- The vertex labels of the subgraph and the supergraph match
- The flag weights of the subgraph match the corresponding flags in the supergraph
- flagDict correctly maps flags from subgraph to supergraph
Blowups
The following figure illustrates the effect of blowups along a GKM subgraph (red) on the underlying graph.
Oscar.blow_up — Function
blow_up(gkmSub::AbstractGKM_subgraph) -> AbstractGKM_subgraphReturn 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.
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].
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)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.
Products
Base.:* — Method
*(G1::AbstractGKM_graph, G2::AbstractGKM_graph; calculateCurveClasses::Bool=true, calculateConnection::Bool=true) -> AbstractGKM_graphIt 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)