Quantum Cohomology
Much of this can be found in [CK99, Chapter 8 and 9.3]. Let $X$ be a GKM space (see Definition). Its (small) equivariant quantum cohomology $QH_T^*(X)$ is given additively by $H_T^*(X;\mathbb{Q})\otimes \widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}$, where $\widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}$ is the completion of the semigroup ring $H_2^\text{eff}(X;\mathbb{Z})$ of effective curve classes. The element corresponding to $\beta\in H_2^\text{eff}(X;\mathbb{Z})$ is written as $q^\beta$.
The $H_T(\text{pt};\mathbb{Q})$-module $QH_T^*(X)$ is a commutative associative unital $H_T(\text{pt};\mathbb{Q})$-algebra via the (small) equivariant quantum product $\ast$ defined as follows. For every classes $a,b,c\in H_T^*(X;\mathbb{Q})$ we have
\[ \langle a \ast b, c \rangle = \sum_{\beta\in H_2^\text{eff}(X;\mathbb{Z})} GW^T_{X,0,3,\beta}(a,b,c) \cdot q^\beta\]
where:
- The equivariant Poincaré pairing is given by $\langle a,b\rangle := \int_X a\cup b\in H_T^*(\text{pt};\mathbb{Q})$, where we use equivariant integration,
- We denote by $GW^T_{X,0,3,\beta}(a,b,c)\in H_T^*(\text{pt};\mathbb{Q})$ the equivariant Gromov–Witten invariant for $X$ in class $\beta$ of genus $0$ with $3$ marked points.
Note that setting all the equivariant parameters $t_1,\dots,t_{\dim_\mathbb{C}(T)}$ to zero recovers the standard (small, non-equivariant) quantum product.
Structure Constants
Given any linear basis $e_1,\dots,e_N$ of $H_T^*(X;\mathbb{Q})\otimes \text{Frac}(H_T^*(\text{pt}; \mathbb{Q}))$ over $\text{Frac}(H_T^*(\text{pt}; \mathbb{Q}))\cong \mathbb{Q}(t_1,\dots,t_r)$, the associated structure constants are $(c_{i,j,k})_{i,j,k=1}^N$ where
\[c_{i,j,k}\in \mathbb{Q}(t_1,\dots,t_r)\otimes \widehat{\mathbb{Q}[H_2^\text{eff}(X;\mathbb{Z})]}\]
is the coefficient of $e_k$ in $e_i\ast e_j$. Let us denote the coefficient of $q^\beta$ in $c_{i,j,k}$ by $c_{i,j,k}(\beta)\in\mathbb{Q}(t_1,\dots,t_r)$.
When $(X,T)$ is a compact Hamiltonian or projective GKM space, and $e_1,\dots,e_N$ is chosen to be a linear basis of $H_T^*(X;\mathbb{Q})$ over $H_T^*(\text{point};\mathbb{Q})\cong \mathbb{Q}[t_1,\dots,t_r]$, we have
\[ c_{i,j,k}(\beta)\in\mathbb{Q}[t_1,\dots,t_r]\]
for all $i,j,k,\beta$.
Choice of basis
Since structure constants depend on a choice of basis, let us introduce some common choices and explain structure constants for mixed bases.
The standard basis
In general, when no basis is specified explicitly, all structure constants are computed with respect to the basis $e_1,\dots,e_N$, which we call the standard basis. Namely, let $N$ be the number of vertices of the GKM graph $G$. For each $i\in\{1,\dots,N\}$, let
\[ e_i \in H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)\]
be class that localizes to $1$ at the $i$-th fixed point and to $0$ at every other fixed point. This uniquely defines a class by the GKM theorem [GKM98].
- The $e_i$ are only well-defined as elements of $H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)$, not of $H_T^*(X;\mathbb{Q})$.
- Since the standard basis over $\mathbb{Q}(t_1,\dots,t_r)$, the resulting structure constants $c_{i,j,k}(\beta)$ can fail to be polynomials in $t_1,\dots,t_r$ even when $G$ is the GKM graph of a compact Hamiltonian or projective GKM space $(X,T)$.
In our implementation, $e_i$ is represented by its fixed-point restrictions (see Cohomology).
The fixed point basis
The fixed point basis is given by $f_1,\dots,f_N$, where $N$ is the number of vertices of $G$ and
\[ f_i = \left( \prod_{\epsilon\in E(G)_i} \alpha(\epsilon) \right) e_i \in H_T^*(X;\mathbb{Q}).\]
Mathematically, we have $\prod_{\epsilon\in E(G)_i} \alpha(\epsilon) = e_T(T_{p_i}X)$ when $G$ is realized by the GKM space $X$ and $p_i\in X^T$ corresponds to the $i$-th vertex of $G$.
- Sometimes, we use the notation $f_i = PD(p_i)$ as $f_i$ is the equivariant Poincaré dual of $p_i\in X^T$.
- The collection $(f_i)_{i=1}^N$ is not a $\mathbb{Q}[t_1,\dots,t_r]$-linear basis for $H_T^*(X;\mathbb{Q})$, but it is a $\mathbb{Q}(t_1,\dots,t_r)$-linear basis for $H_T^*(X;\mathbb{Q})\otimes \mathbb{Q}(t_1,\dots,t_r)$.
- The element $f_i$ can be obtained computationally as
point_class(i, G)(seepoint_class).
Mixing the bases
One can also use two different bases to define $c_{i,j,k}(\beta)$. Namely, given two bases $(a_i)$ and $(b_i)$, we let $c_{i,j,k}(\beta)$ be the coefficient of $b_k q^\beta$ in $a_i \ast a_j$. In this case, we say that $(c_{i,j,k}(\beta))$ are the structure constants with respect to the input basis $(a_i)$ and output basis $(b_i)$.
For multiplication matrices in a chosen basis, use matrix_small_quantum_product.
Quantum Arithmetic
GKMtools.quantum_product — Function
quantum_product(G, beta, a, b; show_bar=false, twist_class = nothing)Calculate the $q^\beta$-coefficient of the equivariant quantum product of the equivariant cohomology classes a and b on G.
Twisting
The experimental optional argument twist_class allows to multiply by any additional EquivariantClass before integrating over $\overline{\mathcal{M}}_{0,3}(X;\beta)$ in the definition of the quantum product.
Progress bar
The optional progress bars for each underlying call to gromov_witten can be activated by setting show_bar=true.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> beta0 = zero(GKM_second_homology(P1).H2);
julia> p = point_class(P1, 1);
julia> quantum_product(P1, beta0, p, p) == localize(p^2)
trueLet us compute the equivariant quantum products of some point classes on $\mathbb{P}^2$.
julia> P2 = projective_space(GKMGraph, 2);
julia> beta = curve_class(P2, Edge(1, 2));
julia> quantum_product(P2, beta, point_class(P2, 1), point_class(P2, 2))
GKM class with restrictions:
[-t1 + t3, -t2 + t3, 0]
julia> quantum_product(P2, 0*beta, point_class(P2, 1), point_class(P2, 2))
GKM class with restrictions:
[0, 0, 0]
julia> quantum_product(P2, 2*beta, point_class(P2, 1), point_class(P2, 2))
GKM class with restrictions:
[0, 0, 0]The remaining part of this subsection is still experimental and in the process of being ported from versions 0.X.X to post-1.0.0. This does not affect the range of quantum products that is accessible using GKMtools, but only the level of conveniene of computing full quantum products. Skip to Multiplication matrices and pairings to continue reading the non-experimental part.
The implementation represents an element as a finite dictionary $\beta \mapsto a_\beta$ corresponding to $\sum_\beta a_\beta q^\beta$. Coefficients are localized GKM classes. Because a general GKM space can have infinitely many contributing effective classes, a parent records an explicit finite set of Novikov degrees. Products are projected to this truncation.
julia> P1 = GKMtools.projective_space(GKMtools.GKMGraph, 1);
julia> beta = GKMtools.curve_class(P1, Oscar.Edge(1, 2));
julia> QH = small_equivariant_quantum_cohomology(P1; degrees=[beta]);
julia> p = quantum_class(QH, point_class(P1, 1));
julia> q = quantum_class(QH, 1; degree=beta);
julia> iszero(coefficient(p, beta)) && isone(coefficient(q, beta))
true
julia> p * one(QH) == p
trueDegree-zero multiplication is the ordinary equivariant cup product. For a positive effective class, quantum_product computes the coefficient with gromov_witten_nomarks, integrating the factors and fixed-point classes over the image curve. Multiplication of quantum classes combines these coefficients and retains only the degrees in the parent truncation.
API
GKMtools.SmallEquivariantQuantumCohomology — Type
SmallEquivariantQuantumCohomologyParent type for a finite Novikov truncation of small equivariant quantum cohomology. Use small_equivariant_quantum_cohomology to construct it.
GKMtools.SmallEquivariantQuantumClass — Type
SmallEquivariantQuantumClassElement type for a finite sum $\sum_\beta a_\beta q^\beta$ with localized GKMClass coefficients. Use quantum_class to construct it.
GKMtools.small_equivariant_quantum_cohomology — Function
small_equivariant_quantum_cohomology(G; degrees=[0])Construct the small equivariant quantum cohomology of G, truncated to the finite vector of effective curve classes degrees. The zero class is included automatically.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> beta = curve_class(P1, Edge(1, 2));
julia> QH = small_equivariant_quantum_cohomology(P1; degrees=[beta]);
julia> length(truncation_degrees(QH))
2GKMtools.truncation_degrees — Function
truncation_degrees(QH)
truncation_degrees(c)Return a copy of the Novikov degrees retained by a quantum-cohomology parent or quantum class.
GKMtools.quantum_class — Function
quantum_class(QH, value; degree=0)
quantum_class(QH, coefficients)
quantum_class(G, value; degree=0, degrees=[degree])Construct a quantum class from a GKMClass, a vector of fixed-point restrictions, a scalar, or a dictionary of Novikov coefficients. Every degree must belong to the truncation of QH.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> beta = curve_class(P1, Edge(1, 2));
julia> QH = small_equivariant_quantum_cohomology(P1; degrees=[beta]);
julia> p = quantum_class(QH, point_class(P1, 1));
julia> q = quantum_class(QH, unit_cohomology_ring(P1); degree=beta);
julia> coefficient(p + q, beta) == localize(unit_cohomology_ring(P1))
true
julia> quantum_class(QH, [1, 1]) == one(QH)
trueGKMtools.QH_class — Function
QH_class(G, value; beta=nothing, degree=nothing, degrees=nothing)Compatibility constructor for quantum_class. The beta keyword is an alias for degree.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> beta = curve_class(P1, Edge(1, 2));
julia> q = QH_class(P1, 1; beta=beta);
julia> coefficient(q, beta) == localize(unit_cohomology_ring(P1))
trueGKMtools.quantum_coefficients — Function
quantum_coefficients(c)Return a copy of the dictionary of nonzero Novikov coefficients of c.
GKMtools.coefficient — Function
coefficient(c, beta)Return the coefficient of $q^\beta$ in c. A degree outside the support has the zero GKM class as coefficient.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> beta = curve_class(P1, Edge(1, 2));
julia> QH = small_equivariant_quantum_cohomology(P1; degrees=[beta]);
julia> c = quantum_class(QH, Dict(beta => [1, 1]));
julia> length(quantum_coefficients(c))
1
julia> iszero(coefficient(c, zero(GKM_second_homology(P1).H2)))
trueGKMtools.small_quantum_cohomology_ring — Function
small_quantum_cohomology_ring(G; degrees, basis=nothing,
codimensions=nothing,
basis_names=nothing,
degree_convention=:cohomological)Construct a presentation of the small rational quantum cohomology of G as an Oscar graded quotient ring. The finite vector degrees specifies the effective curve classes whose quantum corrections are included; degree zero is included automatically.
The result is (QH, classes, q). Here QH is the quotient, classes[d + 1] contains the chosen codimension-d cohomology basis elements, and q contains the Novikov generators for a basis of $H_2(G;\mathbb Z)$.
For a Weyl-backed homogeneous graph, the polynomial Schubert basis is used automatically. For the standard GKM graph of projective space, the basis is $1,H,\ldots,H^n$. Other graphs must provide a polynomial GKM basis, its codimensions, and optionally basis_names.
Example
julia> P1 = GKMtools.projective_space(GKMtools.GKMGraph, 1);
julia> beta = GKMtools.curve_class(P1, Oscar.Edge(1, 2));
julia> QH, classes, q = small_quantum_cohomology_ring(P1; degrees=[beta]);
julia> h = only(classes[2]);
julia> h^2 == only(q)
trueMake sure that the standard operations +, -, *, ^, zero, and one are supported for quantum classes.
The constructor small_quantum_cohomology_ring packages a finite set of computed quantum corrections into an Oscar graded quotient. It returns the quotient, its cohomology basis grouped by codimension, and its Novikov generators.
Multiplication matrices and pairings
GKMtools.matrix_small_quantum_product — Function
matrix_small_quantum_product(G, class; basis=nothing, beta=nothing, show_bar=true, equivariant=false)
matrix_small_quantum_product(G, classes::Vector; kwargs...)Return the matrix of small quantum multiplication by class, or a vector of matrices in the same order as classes. With beta=nothing, sum the curve contributions at q=1; otherwise compute only the contribution of beta. Use basis to specify a cohomology basis; otherwise the point classes are used. Use show_bar=false to suppress the progress bar. If equivariant=true, compute the equivariant quantum product. If equivariant=false, compute the non-equivariant quantum product, in that case a basis should be provided.
julia> L = line_bundle_O(1, 1)
GKM vector bundle of rank 1 over 2 vertices with weights:
1: (1, 0)
2: (2, -1)
julia> G = baseof(L)
GKM graph with 2 nodes, valency 1 and axial function:
2 -> 1 => (1, -1)
Birkhoff-Grothendieck connection for GKM graph with 2 nodes and valency 1
julia> matrix_small_quantum_product(G, first_chern_class(G); equivariant = true, show_bar = false)
[(-t1^2 + 2*t1*t2 - t2^2 - 2)//(t1 - t2) -2//(t1 - t2)]
[ 2//(t1 - t2) (t1^2 - 2*t1*t2 + t2^2 + 2)//(t1 - t2)]
julia> basis = [chern_class(L, i-1) for i in 1:num_vertices(G)];
julia> matrix_small_quantum_product(G, first_chern_class(G); basis = basis, equivariant = false, show_bar = false)
[0 2]
[2 0]
julia> matrix_small_quantum_product(G, first_chern_class(G); basis = basis, equivariant = true, show_bar = false)
[-3*t1 + t2 -4*t1^2 + 2*t1*t2 + 2]
[ 2 3*t1 - t2]GKMtools.twisted_matrix_small_quantum_product — Function
twisted_matrix_small_quantum_product(V, class; basis=nothing, beta=nothing, show_bar=true, equivariant=false)
twisted_matrix_small_quantum_product(V, classes::Vector; kwargs...)Return the $q^\beta$ part of the matrix of the V-twisted equivariant quantum product with $c_1(T_X)-c_1(V)$ on $X=\operatorname{baseof}(V)$. The point classes are used by default; pass basis to choose another basis.
The twisting class is virtual_zero_section. The resulting quantum cohomology maps to that of the smooth zero locus $Y\subset X$ of a section of V, and $c_1(T_X)-c_1(V)$ restricts to $c_1(T_Y)$.
Twisted version of matrix_small_quantum_product for GKM vector bundles.
Example
julia> V = vector_bundle_O(5, [3]);
julia> P5 = baseof(V);
julia> H = first_chern_class(V)/3
GKM class with restrictions:
[1//3*t1, 4//3*t1 - t2, 4//3*t1 - t3, 4//3*t1 - t4, 4//3*t1 - t5, 4//3*t1 - t6]
julia> basis = [H^i for i in 0:(num_vertices(P5)-2)];
julia> M = twisted_matrix_small_quantum_product_tangent_class(V, basis = basis, show_bar = false)
[0 0 18 0 0]
[3 0 0 45 0]
[0 3 0 0 18]
[0 0 3 0 0]
[0 0 0 3 0]Oscar.intersection_matrix — Function
intersection_matrix(basis::Vector{GKMClass}; equivariant::Bool = false)Return the symmetric matrix whose (i, j) entry is integrate(basis[i] * basis[j]). The basis must be nonempty.
If equivariant=true, the result is a matrix over the equivariant coefficient ring; otherwise they will be specialized to zero.
Example
julia> V = vector_bundle_O(5, [3]);
julia> P5 = baseof(V);
julia> H = first_chern_class(V)/3
GKM class with restrictions:
[1//3*t1, 4//3*t1 - t2, 4//3*t1 - t3, 4//3*t1 - t4, 4//3*t1 - t5, 4//3*t1 - t6]
julia> basis = [H^i for i in 0:(num_vertices(P5)-1)];
julia> intersection_matrix(basis)
[0 0 0 0 0 1]
[0 0 0 0 1 0]
[0 0 0 1 0 0]
[0 0 1 0 0 0]
[0 1 0 0 0 0]
[1 0 0 0 0 0]GKMtools.twisted_intersection_matrix — Function
twisted_intersection_matrix(basis::Vector{GKMClass{G,R}}, V::GKMVectorBundle; equivariant::Bool = false) where {G,R}Return the symmetric pairing matrix with entries integrate(chern_class(V, rank(V)) * basis[i] * basis[j]). The basis must be nonempty. Twisted version of intersection_matrix. If equivariant=true, the result is a matrix over the equivariant coefficient ring; otherwise they will be specialized to zero.
Example
julia> V = vector_bundle_O(5, [3]);
julia> P5 = baseof(V);
julia> H = first_chern_class(V)/3;
julia> basis = [H^i for i in 0:(num_vertices(P5)-1)];
julia> twisted_intersection_matrix(basis, V)
[0 0 0 0 3 0]
[0 0 0 3 0 0]
[0 0 3 0 0 0]
[0 3 0 0 0 0]
[3 0 0 0 0 0]
[0 0 0 0 0 0]GKMtools.conjecture_O_eigenvalues — Function
conjecture_O_eigenvalues(G::AbstractGKMGraph; printData::Bool=true)Return the eigenvalues of quantum multiplication by $c_1^T(TX)$ at $q=1$ and at the non-equivariant limit $t=0$.
The characteristic polynomial is computed before taking the limit, so this is well-defined even when the standard-basis matrix contains rational functions in the equivariant parameters. The graph must be compact and strictly nef. When printData=true, the specialized characteristic polynomial is printed.
Example
julia> P1 = projective_space(GKMGraph, 1);
julia> conjecture_O_eigenvalues(P1)
Characteristic poly of c1(TX)* at q=1, t=0:
x^2 - 4
2-element Vector{QQBarFieldElem}:
{a1: 2.00000}
{a1: -2.00000}