Connections
Let $e$ be an directed edge $p\rightarrow q$, and let $E_p$ (resp., $E_q$) be the set of all directed edges starting from $p$ (resp., $q$). Following [GZ00], a connection along $e$ is a bijection
\[\nabla_e\colon E_p \longrightarrow E_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 E_p$, there exists an integer $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 variety $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 variety $X$, it always has a connection for the geometric reason sketched above. However, $G$ may admit more than one 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.
In those cases, the connection can be computed using get_connection
.
If neither of these two conditions hold and $G$ is not the output of a standard construction, a choice of connection can be specified manually using set_connection!
.
GKMtools.get_connection
— Methodget_connection(G::GKM_graph; store::Bool = true) -> Union{Nothing, GKM_connection}
It returns the (unique) connection of the given GKM graph if it is 3-independent, or if it is 2-valent and 2-independent, or if it has been set manually. If none of the three cases hold, return nothing
. If store
is true, the new connection is stored inside G
for later use
For GKM graphs of valency at least 3 that are not 3-independent, a connection may still exist, although uniqueness is not guaranteed. Use get_any_connection
to get any compatible connection if one exists.
Example
The unique connection for $\mathbb{P}^n$ has $\nabla_{(p\rightarrow q)}(p\rightarrow r)=(q\rightarrow r)$ for every triple of distinct vertices $(p, q, r)$, and $\nabla_{(p\rightarrow q)}(p\rightarrow q)=(q\rightarrow p)$ for every distinct vertices $p$ and $q$.
julia> G = projective_space(GKM_graph, 2)
GKM graph with 3 nodes, valency 2 and axial function:
2 -> 1 => (-1, 1, 0)
3 -> 1 => (-1, 0, 1)
3 -> 2 => (0, -1, 1)
julia> C = get_connection(G)
Connection:
(Edge(3, 2), Edge(3, 1)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 3)) => Edge(1, 3)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(3, 2), Edge(3, 2)) => Edge(2, 3)
(Edge(1, 3), Edge(1, 2)) => Edge(3, 2)
(Edge(2, 3), Edge(2, 1)) => Edge(3, 1)
(Edge(1, 3), Edge(1, 3)) => Edge(3, 1)
(Edge(1, 2), Edge(1, 3)) => Edge(2, 3)
(Edge(3, 1), Edge(3, 2)) => Edge(1, 2)
(Edge(3, 1), Edge(3, 1)) => Edge(1, 3)
(Edge(2, 3), Edge(2, 3)) => Edge(3, 2)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(3, 2), Edge(3, 1)) => 1
(Edge(2, 1), Edge(2, 3)) => 1
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(3, 2), Edge(3, 2)) => 2
(Edge(1, 3), Edge(1, 2)) => 1
(Edge(2, 3), Edge(2, 1)) => 1
(Edge(1, 3), Edge(1, 3)) => 2
(Edge(1, 2), Edge(1, 3)) => 1
(Edge(3, 1), Edge(3, 2)) => 1
(Edge(3, 1), Edge(3, 1)) => 2
(Edge(2, 3), Edge(2, 3)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
GKMtools.get_any_connection
— Methodget_any_connection(G::GKM_graph; store::Bool = true) -> Union{Nothing, GKM_connection}
It returns the connection of G
if there exists one. Otherwise, it tries to construct one. This new connection is not guaranteed to have any special properties. In particular, it is not guaranteed to be the one induced by the geometry of a space. If it is not possible to construct it, it returns nothing
.
GKMtools.build_gkm_connection
— Functionbuild_gkm_connection(gkm::GKM_graph, con::Dict{Tuple{Edge, Edge}, Edge}) -> GKM_connection
Return the GKM_connection
object (including information of the integers $a$) defined by the given connection map.
- This function does not check whether the given connection map is valid (use
isvalid(::GKM_connection)
for that). - This does not save the new connection to the gkm object (use
set_connection!(::GKM_graph, ::GKM_connection)
for that).
Example
julia> G = projective_space(GKM_graph, 1)
GKM graph with 2 nodes, valency 1 and axial function:
2 -> 1 => (-1, 1)
julia> con = Dict{Tuple{Edge, Edge}, Edge}()
Dict{Tuple{Edge, Edge}, Edge}()
julia> con[(Edge(1, 2), Edge(1, 2))] = Edge(2, 1)
Edge(2, 1)
julia> con[(Edge(2, 1), Edge(2, 1))] = Edge(1, 2)
Edge(1, 2)
julia> C = build_gkm_connection(G, con)
Connection:
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
build_gkm_connection(gkm::GKM_graph, a::Dict{Tuple{Edge, Edge}, ZZRingElem}) -> GKM_connection
Return the GKM_connection
object (including the connection map $\nabla$) defined by the given integers a
.
- This function does not check whether the given connection map is valid (use
isvalid(::GKM_connection)
for that). - This does not save the new connection to the gkm object (use
set_connection!(::GKM_graph, ::GKM_connection)
for that).
Example
julia> G = projective_space(GKM_graph, 1)
GKM graph with 2 nodes, valency 1 and axial function:
2 -> 1 => (-1, 1)
julia> a = Dict{Tuple{Edge, Edge}, ZZRingElem}()
Dict{Tuple{Edge, Edge}, ZZRingElem}()
julia> a[(Edge(1, 2), Edge(1, 2))] = 2
2
julia> a[(Edge(2, 1), Edge(2, 1))] = 2
2
julia> C = build_gkm_connection(G, a)
Connection:
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
GKMtools.set_connection!
— Functionset_connection!(gkm::GKM_graph, con::GKM_connection)
Manually set the GKM connection of gkm
to con
. This will overwrite any previously set connection.
Example
After building the GKM_connection
using build_gkm_connection
like in the example above, we may assign it to the GKM graph using set_connection!
:
julia> G = projective_space(GKM_graph, 1);
julia> a = Dict{Tuple{Edge, Edge}, ZZRingElem}();
julia> a[(Edge(1, 2), Edge(1, 2))] = 2;
julia> a[(Edge(2, 1), Edge(2, 1))] = 2;
julia> C = build_gkm_connection(G, a);
julia> set_connection!(G, C)
Connection:
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
GKMtools.isvalid_connection
— Functionisvalid_connection(G::GKM_graph, con::GKM_connection; printDiagnostics::Bool=true)::Bool -> Bool
Return true
if con
is a valid connection of G
is valid. This holds if and only if all of the followings hold:
con.con
andcon.a
are set for all(Edge(v,w), Edge(v,u))
where(v,w)
and(v,u)
are edges in the graph.- con maps every
(e,e)
toreverse(e)
- a maps every
(e,e)
to2
- Every pair of edges
(e,ei)
with same source satisfies the relation of the associated a's (see above), i.e.con.gkm.w[ei'] = con.gkm.w[ei] - con.a[(e,ei)] * con.gkm.w[e]
Example
julia> G = projective_space(GKM_graph, 1);
julia> C = get_connection(G)
Connection:
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
julia> C.con[(Edge(1, 2), Edge(1, 2))] = Edge(1, 2) # Should be Edge(2, 1)!
Edge(1, 2)
julia> isvalid_connection(G, C)
Connection doesn't map (e,e) to reverse(e) for e=Edge(1, 2).
false
isvalid_connection(G::GKM_graph; printDiagnostics::Bool=true)::Bool -> Bool
Return true
if the connection assigned to G
is valid. This holds if and only if all of the followings hold:
con.con
andcon.a
are set for all(Edge(v,w), Edge(v,u))
where(v,w)
and(v,u)
are edges in the graph.- con maps every
(e,e)
toreverse(e)
- a maps every
(e,e)
to2
- Every pair of edges
(e,ei)
with same source satisfies the relation of the associated a's (see above), i.e.con.gkm.w[ei'] = con.gkm.w[ei] - con.a[(e,ei)] * con.gkm.w[e]
Example
julia> G = projective_space(GKM_graph, 1);
julia> C = get_connection(G)
Connection:
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
a_i's:
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 1), Edge(2, 1)) => 2
julia> C.con[(Edge(1, 2), Edge(1, 2))] = Edge(1, 2) # Should be Edge(2, 1)!
Edge(1, 2)
julia> isvalid_connection(G, C)
Connection doesn't map (e,e) to reverse(e) for e=Edge(1, 2).
false
GKMtools.is_compatible_with_connection
— Functionis_compatible_with_connection(gkmSub::GKM_subgraph, con::GKM_connection; printDiagnostics::Bool=true)::Bool
Return true
if the connection map sends edge pairs contained in the subgraph to an edge of the subgraph. This is necessary for the subgraph to represent a $T$-invariant subspace.