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 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 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(gkm::AbstractGKM_graph) -> Union{Nothing, GKM_connection}

Return the 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 one of the first two cases holds and the connection hasn't been calculated before, it is saved in the gkm object for later use. If none of the three cases hold, return nothing.

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)
GKM connection for GKM graph with 3 nodes and valency 2:
Connection:
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
(Edge(2, 3), Edge(2, 1)) => Edge(3, 1)
(Edge(1, 3), Edge(1, 2)) => Edge(3, 2)
(Edge(3, 1), Edge(3, 2)) => Edge(1, 2)
(Edge(3, 1), Edge(3, 1)) => Edge(1, 3)
(Edge(2, 1), Edge(2, 3)) => Edge(1, 3)
(Edge(1, 3), Edge(1, 3)) => Edge(3, 1)
(Edge(2, 3), Edge(2, 3)) => Edge(3, 2)
(Edge(3, 2), Edge(3, 2)) => Edge(2, 3)
(Edge(3, 2), Edge(3, 1)) => Edge(2, 1)
(Edge(1, 2), Edge(1, 3)) => Edge(2, 3)
a_i's:
(Edge(2, 1), Edge(2, 1)) => 2
(Edge(1, 2), Edge(1, 2)) => 2
(Edge(2, 3), Edge(2, 1)) => 1
(Edge(1, 3), Edge(1, 2)) => 1
(Edge(3, 1), Edge(3, 2)) => 1
(Edge(3, 1), Edge(3, 1)) => 2
(Edge(2, 1), Edge(2, 3)) => 1
(Edge(1, 3), Edge(1, 3)) => 2
(Edge(2, 3), Edge(2, 3)) => 2
(Edge(3, 2), Edge(3, 2)) => 2
(Edge(3, 2), Edge(3, 1)) => 1
(Edge(1, 2), Edge(1, 3)) => 1
source
GKMtools.get_any_connectionMethod
get_any_connection(gkm::AbstractGKM_graph)::Union{Nothing, GKM_connection}

Return any connection for the given GKM graph, if there exists one, or nothing otherwise. This connection is not guaranteed to have any special properties. In particular, if gkm is the GKM graph of a sufficiently nice space, the returned connection is not guaranteed to be the one induced by the geometry of the space.

source
GKMtools.build_GKM_connectionFunction
build_GKM_connection(gkm::AbstractGKM_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!(::AbstractGKM_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)
GKM connection for GKM graph with 2 nodes and valency 1:
Connection:
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
a_i's:
(Edge(2, 1), Edge(2, 1)) => 2
(Edge(1, 2), Edge(1, 2)) => 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::AbstractGKM_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!(::AbstractGKM_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)
GKM connection for GKM graph with 2 nodes and valency 1:
Connection:
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
a_i's:
(Edge(2, 1), Edge(2, 1)) => 2
(Edge(1, 2), Edge(1, 2)) => 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::AbstractGKM_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)
GKM connection for GKM graph with 2 nodes and valency 1:
Connection:
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
a_i's:
(Edge(2, 1), Edge(2, 1)) => 2
(Edge(1, 2), Edge(1, 2)) => 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
Base.isvalidMethod
isvalid(con::GKM_connection; printDiagnostics::Bool=true) -> Bool

Return true if the given connection is valid for its GKM graph. This holds if and only if all of the following hold:

  1. con.con and con.a are set for all (Edge(v,w), Edge(v,u)) where $vw$ and $vu$ 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)
GKM connection for GKM graph with 2 nodes and valency 1:
Connection:
(Edge(2, 1), Edge(2, 1)) => Edge(1, 2)
(Edge(1, 2), Edge(1, 2)) => Edge(2, 1)
a_i's:
(Edge(2, 1), Edge(2, 1)) => 2
(Edge(1, 2), Edge(1, 2)) => 2

julia> C.con[(Edge(1, 2), Edge(1, 2))] = Edge(1, 2) # Should be Edge(2, 1)!
Edge(1, 2)

julia> isvalid(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::AbstractGKM_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