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_connectionMethod
get_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

Note

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
source
GKMtools.get_any_connectionMethod
get_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.

source
GKMtools.build_gkm_connectionFunction
build_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.

Warning
  1. This function does not check whether the given connection map is valid (use isvalid(::GKM_connection) for that).
  2. 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
Note

In this example, it is unnecessary to define the connection manually, since there is a unique one. To get it, simply use get_connection(G).

source
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.

Warning
  1. This function does not check whether the given connection map is valid (use isvalid(::GKM_connection) for that).
  2. 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
Note

In this example, it is unnecessary to define the connection manually, since there is a unique one. To get it, simply use get_connection(G).

source
GKMtools.set_connection!Function
set_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
Note

In this example, it is unnecessary to set the connection manually, since there is a unique one. To get it, simply use get_connection(G).

source
GKMtools.isvalid_connectionFunction
isvalid_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:

  1. con.con and con.a are set for all (Edge(v,w), Edge(v,u)) where (v,w) and (v,u) are edges in the graph.
  2. con maps every (e,e) to reverse(e)
  3. a maps every (e,e) to 2
  4. 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
source
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:

  1. con.con and con.a are set for all (Edge(v,w), Edge(v,u)) where (v,w) and (v,u) are edges in the graph.
  2. con maps every (e,e) to reverse(e)
  3. a maps every (e,e) to 2
  4. 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
source
GKMtools.is_compatible_with_connectionFunction
is_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.

source