Connections
Let $e$ be a directed edge $p\rightarrow q$, and let $F_p$ (resp., $F_q$) be the set of all flags at $p$ (resp., $q$). Following [GZ00], a connection along $e$ is a bijection
\[\nabla_e\colon F_p \longrightarrow F_q.\]
A connection $\nabla$ of a GKM graph $G$ is a family of connections $\nabla = \{\nabla_e \}_{e \in E}$, where $E$ is the set of all edges of $G$, such that $\nabla_{-e}=\nabla_{e}^{-1}$.
The connection is compatible with the axial function $\mathrm{w}$ of $G$ if for all $e' \in F_p$, there exists a coefficient $a$ depending on $e$ and $e'$ such that
\[\mathrm{w}(\nabla_e(e')) = \mathrm{w}(e') - a \mathrm{w}(e).\]
If $G$ is the GKM graph of a GKM space $X$, then these integers $a$ are the degrees of the equivariant line bundles into which $TX$ splits when restricted to the invariant rational curve represented by $e$.
Existence and uniqueness of connections
Given a GKM graph $G$ that comes from a GKM space $X$, it always has a compatible connection for the geometric reason sketched above. However, $G$ may admit more than one compatible connection.
The following are sufficient conditions for the existence of a unique connection of $G$.
- The valency of $G$ is at least 3 and $G$ is $3$-independent, i.e. the weights of every three edges starting at the same vertex are linearly independent.
- The valency of $G$ is at most 2.
Toric varieties always satisfy those conditions, hence they admits a unique connection.
Some other varieties admits more than one compatible connection, for example generalized_gkm_flag.
When a GKM graph is created, unless otherwise set, a compatible connection is always created using a combinatorial algorithm. This connection is created using the following function:
GKMtools.build_gkm_connection — Function
build_gkm_connection(data::GKMCombinatorialData) -> ConnectionBuild an algorithmic connection compatible with the axial function of a smooth or orbifold GKM graph. Along e = (v,w) it satisfies weight(G,w,transport[e][i]) = weight(G,v,i) - a[e][i]*weight(G,e).
If several transports are possible, return the lexicographically first one. Throw ArgumentError if no compatible bijection of flags exists.
In order to show the connection of a GKM graph, use the following function:
GKMtools.print_connection — Function
print_connection(G::AbstractGKMGraph; verbose::Bool = true)Print all relevant information of the connection of G.
Examples
julia> G = gkm_graph_of_toric(projective_space(NormalToricVariety, 3))
GKM graph with 4 nodes, valency 3 and axial function:
2 -> 1 => (-1, 0, 0, 1)
3 -> 1 => (0, -1, 0, 1)
3 -> 2 => (1, -1, 0, 0)
4 -> 1 => (0, 0, -1, 1)
4 -> 2 => (1, 0, -1, 0)
4 -> 3 => (0, 1, -1, 0)
Algorithmic connection for GKM graph with 4 nodes and valency 3Algorithmic connection means that the connection has been generated using the internal algorithm. This is perfectly fine since this GKM admits only one connection.
julia> print_connection(G)
Algorithmic connection for GKM graph with 4 nodes and valency 3
Connection:
1 -> 2 => [3, 1, 2]
1 -> 3 => [1, 3, 2]
1 -> 4 => [1, 2, 3]
2 -> 1 => [2, 3, 1]
2 -> 3 => [1, 2, 3]
2 -> 4 => [2, 1, 3]
3 -> 1 => [1, 3, 2]
3 -> 2 => [1, 2, 3]
3 -> 4 => [1, 2, 3]
4 -> 1 => [1, 2, 3]
4 -> 2 => [2, 1, 3]
4 -> 3 => [1, 2, 3]
a_i's:
1 -> 2 => [2, 1, 1]
1 -> 3 => [1, 2, 1]
1 -> 4 => [1, 1, 2]
2 -> 1 => [1, 1, 2]
2 -> 3 => [2, 1, 1]
2 -> 4 => [1, 2, 1]
3 -> 1 => [1, 1, 2]
3 -> 2 => [2, 1, 1]
3 -> 4 => [1, 2, 1]
4 -> 1 => [1, 1, 2]
4 -> 2 => [2, 1, 1]
4 -> 3 => [1, 2, 1]Here 3 -> 4 => [1, 2, 3] means that transport along the edge from 3 to 4 maps the i-th flag at vertex 3 to the i-th flag at vertex 4. The entry 3 -> 4 => [1, 2, 1] under a_i's gives the corresponding coefficients: for i = 1, 2, 3, the weight of the transported flag is the weight of the i-th flag at vertex 3 minus, respectively, 1, 2, or 1 times the weight of the edge from 3 to 4.
Some GKM varieties allow the choice of more GKM connections, for example the variety of complete flags in $\mathbb{C}^3$, see Generalized Flag Varieties.
julia> R = root_system(:A, 2)
Root system of rank 2
of type A2
julia> G1 = generalized_gkm_flag(R)
GKM graph with 6 nodes, valency 3 and axial function:
s1 -> id => (1, -1, 0)
s2*s1 -> s1 => (0, 1, -1)
s1*s2*s1 -> id => (1, 0, -1)
s1*s2*s1 -> s2*s1 => (1, -1, 0)
s2 -> id => (0, 1, -1)
s2 -> s2*s1 => (-1, 0, 1)
s1*s2 -> s1 => (1, 0, -1)
s1*s2 -> s1*s2*s1 => (0, -1, 1)
s1*s2 -> s2 => (1, -1, 0)
Birkhoff-Grothendieck connection for GKM graph with 6 nodes and valency 3By default, generalized_gkm_flag equips the graph with the connection coming from the Birkhoff-Grothendieck decomposition. In order to have the connection using the root data, use the following:
julia> G2 = generalized_gkm_flag(R; connection = :cartan)
GKM graph with 6 nodes, valency 3 and axial function:
s1 -> id => (1, -1, 0)
s2*s1 -> s1 => (0, 1, -1)
s1*s2*s1 -> id => (1, 0, -1)
s1*s2*s1 -> s2*s1 => (1, -1, 0)
s2 -> id => (0, 1, -1)
s2 -> s2*s1 => (-1, 0, 1)
s1*s2 -> s1 => (1, 0, -1)
s1*s2 -> s1*s2*s1 => (0, -1, 1)
s1*s2 -> s2 => (1, -1, 0)
Cartan connection for GKM graph with 6 nodes and valency 3One can use also the algorithm connection:
julia> G3 = generalized_gkm_flag(R; connection = :algorithm);In this example, the Birkhoff-Grothendieck connection and the Cartan connection do not coincide.
julia> print_connection(G1)
Birkhoff-Grothendieck connection for GKM graph with 6 nodes and valency 3
Connection:
id -> s1 => [1, 3, 2]
id -> s1*s2*s1 => [3, 2, 1]
id -> s2 => [3, 1, 2]
s1 -> id => [1, 3, 2]
s1 -> s2*s1 => [2, 3, 1]
s1 -> s1*s2 => [3, 1, 2]
s2*s1 -> s1 => [3, 1, 2]
s2*s1 -> s1*s2*s1 => [3, 1, 2]
s2*s1 -> s2 => [1, 2, 3]
s1*s2*s1 -> id => [3, 2, 1]
s1*s2*s1 -> s2*s1 => [2, 3, 1]
s1*s2*s1 -> s1*s2 => [1, 3, 2]
s2 -> id => [2, 3, 1]
s2 -> s2*s1 => [1, 2, 3]
s2 -> s1*s2 => [1, 2, 3]
s1*s2 -> s1 => [2, 3, 1]
s1*s2 -> s1*s2*s1 => [1, 3, 2]
s1*s2 -> s2 => [1, 2, 3]
a_i's:
id -> s1 => [2, 0, 0]
id -> s1*s2*s1 => [1, 1, 2]
id -> s2 => [0, 2, 0]
s1 -> id => [2, 0, 0]
s1 -> s2*s1 => [1, 1, 2]
s1 -> s1*s2 => [0, 2, 0]
s2*s1 -> s1 => [2, 1, 1]
s2*s1 -> s1*s2*s1 => [0, 0, 2]
s2*s1 -> s2 => [0, 2, 0]
s1*s2*s1 -> id => [2, 1, 1]
s1*s2*s1 -> s2*s1 => [0, 2, 0]
s1*s2*s1 -> s1*s2 => [0, 0, 2]
s2 -> id => [2, 0, 0]
s2 -> s2*s1 => [0, 2, 0]
s2 -> s1*s2 => [1, 1, 2]
s1*s2 -> s1 => [2, 0, 0]
s1*s2 -> s1*s2*s1 => [0, 2, 0]
s1*s2 -> s2 => [1, 1, 2]
julia> print_connection(G2)
Cartan connection for GKM graph with 6 nodes and valency 3
Connection:
id -> s1 => [1, 2, 3]
id -> s1*s2*s1 => [3, 2, 1]
id -> s2 => [2, 1, 3]
s1 -> id => [1, 2, 3]
s1 -> s2*s1 => [2, 3, 1]
s1 -> s1*s2 => [2, 1, 3]
s2*s1 -> s1 => [3, 1, 2]
s2*s1 -> s1*s2*s1 => [1, 3, 2]
s2*s1 -> s2 => [3, 2, 1]
s1*s2*s1 -> id => [3, 2, 1]
s1*s2*s1 -> s2*s1 => [1, 3, 2]
s1*s2*s1 -> s1*s2 => [3, 1, 2]
s2 -> id => [2, 1, 3]
s2 -> s2*s1 => [3, 2, 1]
s2 -> s1*s2 => [1, 2, 3]
s1*s2 -> s1 => [2, 1, 3]
s1*s2 -> s1*s2*s1 => [2, 3, 1]
s1*s2 -> s2 => [1, 2, 3]
a_i's:
id -> s1 => [2, -1, 1]
id -> s1*s2*s1 => [1, 1, 2]
id -> s2 => [-1, 2, 1]
s1 -> id => [2, -1, 1]
s1 -> s2*s1 => [1, 1, 2]
s1 -> s1*s2 => [-1, 2, 1]
s2*s1 -> s1 => [2, 1, 1]
s2*s1 -> s1*s2*s1 => [1, -1, 2]
s2*s1 -> s2 => [1, 2, -1]
s1*s2*s1 -> id => [2, 1, 1]
s1*s2*s1 -> s2*s1 => [1, 2, -1]
s1*s2*s1 -> s1*s2 => [1, -1, 2]
s2 -> id => [2, -1, 1]
s2 -> s2*s1 => [-1, 2, 1]
s2 -> s1*s2 => [1, 1, 2]
s1*s2 -> s1 => [2, -1, 1]
s1*s2 -> s1*s2*s1 => [-1, 2, 1]
s1*s2 -> s2 => [1, 1, 2]
julia> print_connection(G3, verbose = false)
Algorithmic connection for GKM graph with 6 nodes and valency 3Validation
GKMtools.is_valid — Function
is_valid(G::AbstractGKMGraph, con::AbstractGKMConnection;
print_diagnostics=false) -> BoolCheck that con defines a valid connection on G. Every oriented edge must have a permutation of the flags, inverse transport on the reversed edge, and coefficients satisfying the connection equation.