Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
A tutorial for the software package admcycles for SageMath.
admcycles Tutorial
Below we show how to use admcycles
for computations in the tautological ring of the moduli space of stable curves. More detailed explanations are available in the preprint [Delecroix-Schmitt-vanZelm].
If you opened this document on share.cocalc.com, you can open an interactive copy by clicking the button Open in CoCalc with one click
above. Then you can execute commands and do calculations below by clicking on a box containing code (such as from admcycles import *
below) and pressing Shift + Enter
. Note that many commands rely on earlier lines having been executed before, in particular the first line from admcycles import *
should be executed once at the start.
To insert a new box for writing own commands, you can choose Insert -> Insert cell below
in the menu above or click left of the text of a box and press b
.
To use admcycles
, the first thing you need to do is import it:
Then many functions become available. For example you can enter tautological classes as combinations of divisors (here on ):
Above, the function sepbdiv(g1,A1,g,n)
returns the class of a boundary divisor, the pushforward of the fundamental class under the gluing map , and psiclass(i,g,n)
returns on . To avoid having to type g,n in long formulas, we can use reset_g_n(g,n)
to set them once:
To get explanations about a function, you can type the name of the function followed by a question mark. E.g. type irrbdiv?
below and press Shift+Enter
to see the documentation of this function:
Tautological classes
Creating tautological classes
One way to enter a tautological class is to first use the function list_tautgens(g,n,r)
to print a list of generators of :
Generators are given by a stable graph, decorated with a monomial in and -classes (see below for an explanation of the representation of stable graphs). One can create a list L
of the generators we printed above using tautgens(g,n,r)
and compute linear combinations of the elements L[i]
of this list:
Stable graphs are represented by three lists:
a list
genera
of the genera of the vertices,a list
legs
of lists of legs and half-edges at these vertices,a list
edges
of pairs(h1,h2)
of half-edges forming an edge.
A stable graph can be created manually using StableGraph(genera,legs,edges)
by specifying these three lists. Below we create a stable graph with two vertices of genus 1, carrying half-edges 2,3 which form an edge:
Basic operations
Tautological classes can be manipulated using standard arithmetic operations:
They can also be pushed forward under forgetful morphisms, by specifying the list of markings that are forgotten. As an example, we push forward s_1
, the class on , under the map forgetting marking , obtaining the class on as expected:
Similarly, we can pull back the class on :
Given a tautological class t
, the function t.evaluate()
computes the integral of t
against the fundamental class of , i.e. the degree of the zero-cycle part of t
. Below we compute the intersection number We check the equality
predicted by the String equation:
Using simplify()
to reduce number of terms in tautclass:
A basis of the tautological ring and tautological relations
The package can compute the generalized Faber-Zagier relations between the generators above. The function generating_indices(g,n,r)
computes a list of indices of tautgens(g,n,r)
forming a basis of :
Then, the function toTautbasis(g,n,r)
can be used to express a tautological class in this basis:
This means that the class t3
we defined above as the linear combination t3=2*L[3]+L[4]
can be expressed as t3=-48*L[0]+22*L[1]
in terms of the basis L[0],L[1]
of .
We can also use the function is_zero
to check a tautological relation. Below, we verify the divisor relation on :
Comparing classes on open subsets of using parameter moduli
to be one of 'st'
, 'tl'
, 'ct'
, 'rt'
or 'sm'
:
Pulling back tautological classes to a boundary divisor
Below we create a stable graph bdry
and compute a pullback of a tautological class under the corresponding boundary gluing map. The result is expressed in terms of a basis of the tautological ring on :
We can see that in the Kunneth decomposition of the pullback has no component along and the contributions to and are symmetric, as expected.
Pushing forward classes from the boundary
We can also compute the pushforward of the product of classes under a boundary gluing map:
si1 is obtained by pushing forward the fundamental class on the genus 2 vertex times on the second vertex (where is the half-edge). We can then check the self-intersection formula for the boundary divisor above:
Special cycle classes
Double ramification cycles
Double ramification cycles are computed by the function DR_cycle(g,A)
. Below we verify a multiplicativity relation between DR-cycles from the paper [Holmes-Pixton-Schmitt]:
Calculating DR-cycles as classes with polynomial coefficients in the input:
Checking intersection numbers of DR-cycles with lambdaclass from [Buryak-Rossi]:
Strata of k-differentials
Strata of k-differentials using Strataclass(g,k,mu)
with mu
vector of zero and pole multiplicities:
Generalized lambda classes
Computing Chern classes of for the universal curve using generalized_lambda
:
Admissible cover cycles
Hyperelliptic and bielliptic cycles
Computing the cycle of the hyperelliptic locus in genus 3:
The cycle of hyperelliptic curves of genus 3 with 0 marked fixed points of the involution and 0 marked pairs of conjugate points:
We compare with the known expression :
Creating and identifying general admissible cover cycles
Below we define the group and ramification data H
, specifying that we look at double covers with two points of stabilizer G[1]
, which is the generator of the group :
An example with this ramification behaviour is the locus of bielliptic curves in of genus 2 curves admitting a double cover of an elliptic curve with marked ramification points . The following identifies the class of this locus in terms of the generating set tautgens(2,2,3)
of :
If instead we wanted to specify a locus with two points of generator G[1]
and one pair of points with generator G[0]
, we would consider:
We can also identify the pushforward of the locus of bielliptic curves under the map forgetting both markings, obtaining (a multiple of) the locus of bielliptic curves inside . For this we use the optional parameter markings
to specify that no marking should be remembered:
We can compare this to a known formula . When entering this, note that irrbdiv
returns two times the class since in general the convention is not to divide by automorphisms of stable graphs:
Example: Hurwitz-Hodge integrals
Computing the Hurwitz-Hodge integral :
Computing Hurwitz-Hodge integral of cyclic triple covers of genus 0 curves against , see [Owens-Somerstep]:
Citing admcycles
If you use admcycles
in your research, consider citing the preprint [Delecroix-Schmitt-vanZelm].