Skip to content

Code for computing tropical Gromov-Witten invariants via Feynman integrals.

License

Notifications You must be signed in to change notification settings

singular-gpispace/GromovWitten

Repository files navigation

GromovWitten

Documentation Build Status

GromovWitten

The package GromovWitten computes generating series for tropical Hurwitz numbers of elliptic curves via mirror symmetry and Feynman integrals, and thus, by a correspondence theorem, Hurwitz numbers in the sense algebraic geometry. Generalizations of the method also allow for the computation of Gromov-Witten invariants for elliptic curves, and are also implemented in the package. GromovWitten is based on the computeralgebra system OSCAR and is provided as a package for the Julia programming language.

Installation

We assume that Julia is installed in a recent enough version to run OSCAR. To install the package, follow these steps:

using Pkg
Pkg.add(url="https://github.com/singular-gpispace/GromovWitten.git")

This command will fetch the package from its GitHub repository and set it up in your Julia environment.

Once the package is installed, you can load it with the following command:

using GromovWitten

Example of graph without vertex contribution and loop.

alt text

julia> G = feynman_graph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3,4)] )
graph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3, 4)])
julia> F = feynman_integral(G);
julia> a = [0, 2, 1, 0, 0, 1];
julia> o = [1,3,4,2];
julia> feynman_integral_branch_type_order(F, a, o)
128*q[2]^4*q[3]^2*q[6]^2
julia> feynman_integral_branch_type(F, a)
256*q[2]^4*q[3]^2*q[6]^2

also we can compute Feynman Integral of degree 3

julia> f = feynman_integral_degree(F, 3)
288*q[1]^6 + 32*q[1]^4*q[2]^2 + 32*q[1]^4*q[3]^2 + 32*q[1]^4*q[5]^2 + 32*q[1]^4*q[6]^2 + 8*q[1]^2*q[2]^2*q[5]^2 + 8*q[1]^2*q[2]^2*q[6]^2 + 8*q[1]^2*q[3]^2*q[5]^2 + 8*q[1]^2*q[3]^2*q[6]^2 + 24*q[2]^6 + 152*q[2]^4*q[3]^2 + 8*q[2]^4*q[5]^2 + 8*q[2]^4*q[6]^2 + 152*q[2]^2*q[3]^4 + 32*q[2]^2*q[3]^2*q[5]^2 + 32*q[2]^2*q[3]^2*q[6]^2 + 32*q[2]^2*q[4]^4 + 8*q[2]^2*q[4]^2*q[5]^2 + 8*q[2]^2*q[4]^2*q[6]^2 + 8*q[2]^2*q[5]^4 + 32*q[2]^2*q[5]^2*q[6]^2 + 8*q[2]^2*q[6]^4 + 24*q[3]^6 + 8*q[3]^4*q[5]^2 + 8*q[3]^4*q[6]^2 + 32*q[3]^2*q[4]^4 + 8*q[3]^2*q[4]^2*q[5]^2 + 8*q[3]^2*q[4]^2*q[6]^2 + 8*q[3]^2*q[5]^4 + 32*q[3]^2*q[5]^2*q[6]^2 + 8*q[3]^2*q[6]^4 + 288*q[4]^6 + 32*q[4]^4*q[5]^2 + 32*q[4]^4*q[6]^2 + 24*q[5]^6 + 152*q[5]^4*q[6]^2 + 152*q[5]^2*q[6]^4 + 24*q[6]^6

Finally we substitute all $q$ variables by $q_{1}$ after computing the sum of all Feynman Integral of degree up to 8.

julia> substitute(feynman_integral_degree_sum(F,8))
10246144*q[1]^16 + 3294720*q[1]^14 + 886656*q[1]^12 + 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4

Caching Feynman Integral

We can try to cache the previous result in a table. To do that, we define feynman_integral_branch_type_cache , feynman_integral_degree_cache and feynman_integral_degree__sum_cache. The last one returns the univariable polynomial of Feynman integral sum up to degree $d$. We define first the Feynman graph,

julia> G = feynman_graph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3,4)] )
graph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3, 4)])
julia> F = feynman_integral(G);

we cache the Feynman Integral.

julia> feynman_integral_degree_cache(F, 3);

To display the previous caching

julia> F.integral_cache[:degree]
Dict{Vector{Int64}, QQMPolyRingElem} with 4 entries:
  [8]  => 906376*q[1]^16 + 76832*q[1]^14*q[2]^2 + 76832*q[1]^14*q[3]^2 + 76832*
  [3]  => 288*q[1]^6 + 32*q[1]^4*q[2]^2 + 32*q[1]^4*q[3]^2 + 32*q[1]^4*q[5]^2 +
  [5]  => 20000*q[1]^10 + 2592*q[1]^8*q[2]^2 + 2592*q[1]^8*q[3]^2 + 2592*q[1]^8
  [10] => 5465008*q[1]^20 + 350352*q[1]^18*q[2]^2 + 350352*q[1]^18*q[3]^2 + 350

We get the following table of comparison.

Type degree first_run second_run
degree [3] => 288*q[1]^6… 0.044741 s(17.840 MiB) 0.000021 s ( 1.609 KiB)
degree [5] => 20000*q[1]^10… 0.209154 s( 129.200 MiB) 0.000021 s ( 1.609 KiB)
degree [8] => 906376*q[1]^16 … 1.768598 s( 1.113 GiB) 1.000021 s ( 1.609 KiB)
degree [10] => 5465008*q[1]^20 +… 5.453744 s(3.425 GiB) 0.000033 s ( 1.609 KiB)

similarly for the case of Feynman graph degree sum, we have:

julia> feynman_integral_degree_sum_cache(F, 3)
1792*q[1]^6 + 32*q[1]^4

To display the previous caching

julia> F.integral_cache[:sum]
Dict{Vector{Int64}, QQMPolyRingElem} with 5 entries:
  [8]  => 10246144*q[1]^16 + 3294720*q[1]^14 + 886656*q[1]^12 + 182272*q[1]^10 
  [3]  => 1792*q[1]^6 + 32*q[1]^4
  [5]  => 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4
  [11] => 145337600*q[1]^22 + 66497472*q[1]^20 + 27353088*q[1]^18 + 10246144*q[
  [10] => 66497472*q[1]^20 + 27353088*q[1]^18 + 10246144*q[1]^16 + 3294720*q[1]
Type degree normal_time cache_time
sum [3] => 1792*q[1]^6… 0.028567 s ( 23.850 MiB) 0.029917 s (23.852 MiB)sum
sum [10] => 66497472*q[1]^20 +… 12.292280 s (7.607 GiB 8.813801 s ( 5.439 GiB)
sum [11] => 145337600*q[1]^22+… 21.427653 s (13.190 ) 9.026728 s (5.583 GiB)