Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
181 views
unlisted
ubuntu2004
a

��c�P�@sfdZddlmZddlZddlmZddlmZddlmZddl	m
Z
dd	lmZdd
l
mZmZmZmZddlmZddlmZd
efdd�Zd
efdd�Zdd
efdd�Zd
efdd�Zefdd�Zdd�Zdd
defdd�Zdd
defdd�Zdd
defdd�Zdd
defd d!�Zdd
defd"d#�Z dd
defd$d%�Z!dd
defd&d'�Z"d(d)�Z#d,d*d+�Z$dS)-a�
Double ramification cycle

The main function to use to compute DR cycles are the following:

- :func:`DR_compute`
- :func:`DR_sparse`: same as ``DR_compute`` except that it returns the answer as a
  sparse vector
- :func:`DR_reduced`: same as ``DR_compute`` except that it only requires two
  arguments (g and dvector) and simplifies the answer using the 3-spin
  tautological relations.

EXAMPLES::

    sage: from admcycles.DR import DR_compute, DR_sparse, DR_reduced

To compute the genus 1 DR cycle with weight vector (2,-2)::

    sage: DR_compute(1,1,2,(2,-2))
    (0, 2, 2, 0, -1/24)

In the example above, the five classes described on R^1(Mbar_{1,2}) are:
kappa_1, psi_1, psi_2, delta_{12}, delta_{irr}.  (Here by delta_{irr} we mean
the pushforward of 1 under the gluing map Mbar_{0,4} -> Mbar_{1,2}, so twice
the class of the physical locus.)

Sparse version::

    sage: DR_sparse(1,1,2,(2,-2))
    [[1, 2], [2, 2], [4, -1/24]]

Reduced version::

    sage: DR_reduced(1,(2,-2))
    (0, 0, 0, 4, 1/8)
�)�copyN)�ZZ��QQ)�ceil)�vector�)�	MODULI_ST)�R�
num_strata�single_stratum�autom_count)�interpolate)�FZ_rels�cCs>t|||||�}|j��}|j��}g}td|�D�]}	td|	�D]�}
d}td|�D]0}|j|	|fdkrT|j|
|fdkrTd}q�qT|s�qBt|	g�}
d}|�r d}t|
�D]p}td|�D]`}|j||fdkr�td|�D]>}|j||fdkr�||
vr�||	k�s
||
kr�|
�|�d}q�q�q�q�|
|
vrB|�|
|	g�qBq2|S)NrFrT)	r�M�nrows�ncols�range�set�tuple�add�append)�num�g�r�markings�moduli_type�G�nr�nc�answer�i1�i2Z
found_edge�j�S�
did_something�i3�i4rr�J/home/user/Introduction lectures/admcycles/DR/double_ramification_cycle.py�find_nonsep_pairs5s6

$
,
r*cs�|dkSt|�dk�r�|dd}|dd}	|dd}
g}td|�D]0�t��fdd�||	|
fD��dkrH|���qHt|�dkr�dS|D]2�||	|
fD]"}�j|�fddkr�dSq�q�d	S�]�g}
td|�D]$}�j|�fdk�r�|
�|��q�t|
�dk�r�q�|
d}|
d}g}td|�D]8}�j||fdk�r0�j||fdk�r0|�|��q0t|�dk�s�|d�k�r��q�t|�}||fD](}|D]}|�j||fd7}�q��q�|dk�r�dS�q�d	S)
N��Frr�cs"g|]}�j|�fdkrd�qS�rr�r��.0�i�rr$rr)�
<listcomp>e�z%DR_coeff_is_known.<locals>.<listcomp>T)rrrrr*�lenrr)rrrrrrr �nonsep_pairsr"r#r'�jlistr2�ilist�ii1�ii2�jj�count�iirr3r)�DR_coeff_is_knownUsX"(

r?c 
s�ttd|d��}t|||||���j����j���tdt|||||�f�}����fdd�}dd�}	t|||||�}
t	|
�dk�r\|
dd|
ddddg}tdd�D]b}td�D]T}
|
||
|dkr�|
|d|
|d	<|
||
|dkr�|
|d|
|d<q�q�||�}|d}|d|d}|d|d|d}||	|||�9}�n�t	|
�d	k�r|
dd}|
dd}|
dd}|||g}||dg�||�}||dg}d
}td	�D]މ���fdd�td��D�}t	|�dk�r(|t
��d
|	d|�|�d�9}d}n|t	|�dk�rȈj��|dfd�j��d|dfddk�r�|t
��d|	d|�|�d�9}d}�q�|�s||dd
|dd
|dd
d|dd|dd|ddt
d�9}td��D�]�}
g}td��D]$}�j||
fdk�r$|�|��q$t	|�dk�r��j|d|
fd}|t
|��
�}|��jd|
fddt
d�|9}�q||
v�r��q|d}|d}g}td��D]8}�j||fdk�r؈j||fdk�r�|�|��q�t	|�dk�r��j||
fd}�j||
fd}|d9}|t
|���}|t
|��
�}|||d}||||g�dt
d�||d9}�q�qt	|�dk�rR|d|
k�r̐q�j||dfd�j||dfd�j||dfd�j||dfdg}t|�}|dk�r^|t
��d
9}||||g�dd9}n�|dk�r�|t
��d9}||||g�dd
9}n�|dk�r|gd�gd�gd�gd�fv�r�|t
��d9}n^|gd�gd�gd�gd�fv�r
|t
��d9}n(|gd�gd�fv�r2|t
��d9}||||g�dd9}�q�qt	|�d	k�rf|d|
k�rr�q�j||dfd�j||dfd�j||dfd�j||dfd�j||dfd�j||dfdg}t|�}|dk�r,|t
��d 9}||||g�dd
9}n4|dk�r|t
��d!9}||||g�dd9}�qnJt	|�dk�r|d|
k�r��q|t
��d"9}||||g�dd9}�q|S)#Nrc
s(dd�|D�}td��D�]}�jd|fdkrtd��D]�}�j||fdkr:t|g�}d}|r�d}t|�D]n}td��D]^}�j||fdkr|td��D]<}�j||fdkr�||vr�||vs�||vr�|�|�d}q�q|qnq^t|�D]6\}	}
|
|vr�||	��jd|fdd7<q�q:q|S)NcSsg|]}d�qS�rr)r1r"rrr)r4�r5z-DR_coeff.<locals>.balance.<locals>.<listcomp>rrTF)rrrrr�	enumerate)r9Zbal�j1r'r%r&r(�j2Zi5�kkZikk)r�dvectorr rrr)�balance�s(
*
,zDR_coeff.<locals>.balancecSs�t��dd|d|d|dd|d||d||d||d||d||d|d|d|d|d|d|d|d|d|d|d|d|d|dd	|d|||d|||d||d
|d|d||d|d||d|d||d|d||d|d||d|d|d|d
|d|d|d
|d|d|d
|d|dS)Ni�i������(���r-�p�T��Fr+)r�one)�a�b�crrr)�poly4�szDR_coeff.<locals>.poly4r+rr-r,Fcs@g|]8}�j��|fdkr�j��d|fdkr|�qSr.r/�r1r$)r�cycle4�krr)r4�s0�zDR_coeff.<locals>.<listcomp>rKT�
������)r-rrr)rr-rr)rrr-r)rrrr-�)rrrr)rrrr)rrrr)rrrri)rrrr)rrrrrMrG�ZiHi�	)rrrrrrrr
r*r6rrPr�	factorialZfactoial�sum) rrr�nrErrr!rFrTr7�cycler2r$ZdbalrQrRrSr"r#r'Zdbal4�doner8r9�xr:r;r<�x1�x2�xvecr)rrVrErWr rr)�DR_coeff�s

��
�>�$&���
�
(
�((�


""8�<�

rfcCs�t|||||�}|j��}|j��}g}td|�D]�}	|j|	dft|j|	dfd�kr`dStd|�D]P}
|j|	|
fddkr�dS|jd|
fdkrj|j|	|
fdkrj|�|	�qjq2td|�D]�}t|�}|�|�d}
|
�rld}
t	|�D]t}	|	|k�rq�td|�D]X}
|j|	|
fdk�rtd|�D]2}|j||
fdk�r0||v�r0|�|�d}
�q0�qq�q�t
|�|dkr�dSq�dS)NrrTr-F)rrrrrr
rrrrr6)rrrrrrrr Zmarked_verticesr2r$r>r%r&r#rrr)�veto_for_DRs<

$$


rgcCsbtt||||��D]J}t|||||�st|||||�st|�tt|||||�j�td�qdS)Nz---------------------)rrrgr?�printrr)rrrrr2rrr)�
DR_uncomputed;s
 ricCs`t|�}|D]N}tt|��D]<}||dkr||dkrT|t||||f�|8}qqq|S)Nr)rrr6r)�B�vec�vec2�rowr2rrr)�reduce_with_relsDsrncs�ttd|d��}t|||||���j��}�j���g}	g}
t��t|||||�}td|�D]�}td�j|df�	�d�D]��|t�j|df���
�}|t���
��j|df�}|d�j|df�9}|�d��j|df�9}q�q`���fdd�t|d�D�}
td��D�]z���fdd�td|�D�}�jd�fdk�r,t|�dk�r�|d}|d}�j|�fd}�j|�fd}n4|d}|d}�j|�fd}�j|�fd}|	�|d|dg�|
�||d�|t|��
�t|��
�||d}nz�j|d�fd}||�jd�fddtd�|t|��
�9}|
|dd|�jd�fdd7<�q,|	|
|
|fS)NrrrZr-c	sNg|]F��d�j�ddfddt��fdd�td��D���qS)r-rrcs"g|]}�j�d|d�qS�rrr/rU�rr2rr)r4^s�z-DR_coeff_setup.<locals>.<listcomp>.<listcomp>)rr^r�r1�r�kvalr �r2r)r4^s�.�z"DR_coeff_setup.<locals>.<listcomp>cs"g|]}�j|�fdkr|�qSr@r/r0r3rr)r4as��
rrrrrrrrPr
�degreer]r6r)rrrr_rErsrrr�	edge_list�exp_list�
scalar_factorr2�
given_weightsr9r"r#�exp1�exp2r�rr$rsr r)�DR_coeff_setupOsj

� "&
�
�
�
��
�
���
r~cs�ttd|d��}t|||||�}|j��}	|j��}
t|||||||�\}}}
}ttdd�|D��t	d��|t
|�}|
|	|d}dt|�}t|d||d�}g}|D]�d}tj�fdd�tt
|��D��D]�}t|
�}tt
|��D]<}|||d||7<|||d||8<q�t�fdd�|D���rNq�d}tt
|��D]"}|||t	d�||9}�q^||7}q�|�t|�|f��q�t||�}|jdd	�|S)
NrcSsg|]}t|��qSr)�absr0rrr)r4�r5z DR_coeff_new.<locals>.<listcomp>r-rcsg|]}tt����qSr��listrr0��mrr)r4�r5c3s|]}|�VqdS�Nrr0r�rr)�	<genexpr>�r5zDR_coeff_new.<locals>.<genexpr>)rb)rrrrrrr~rr^rr�	itertools�productr6r�anyrrr�subs)rrrr_rErsrrrrr rwrxrzry�m0�h0�deg�mrangeZmvalues�total�weight_data�vertex_weightsr2�term�mpolyrr�r)�DR_coeff_new{s8

�*$ 

r�cs�ttd|d��}t|||||���j��}	�j���g}
g}t��t|||||�}td|	�D]�}
td�j|
df�	�d�D]��|t�j|
df���
�}|t���
��j|
df�}|d�j|
df�9}|�d�||dtd���j|
df�9}q�q`���fdd�t|	d�D�}td��D�]����fdd�td|	�D�}�jd�fdk�rDt|�dk�r�|d}|d}�j|�fd}�j|�fd}n4|d}|d}�j|�fd}�j|�fd}|
�|d|dg�|�||d�|t|��
�t|��
�||d}n��j|d�fd}|�jd�fdd}|dk�r�||}||d|||dtd�|t|��
�9}||dd|�jd�fdd7<�qD|
|||fS)	NrrrZr-rKc	sVg|]N��td��j�ddfdtd�t��fdd�td��D���qS)r-rrcs"g|]}�j�d|d�qSror/rUrprr)r4�r5z/DR_coeff_setup_m.<locals>.<listcomp>.<listcomp>)rrr^rrqrrrtr)r4�s�*�z$DR_coeff_setup_m.<locals>.<listcomp>cs"g|]}�j|�fdkr|�qSr@r/r0r3rr)r4�s�ru)r�rrrr_rErsrrrrwrxryr2rzr9r"r#r{r|�dvalrr}r)�DR_coeff_setup_m�sx

� "��

�
�
�
�
��
���
r�c	shttd|d��}t|||||�}	|	j��}
|	j��}t�|||||||�\}}
}}||
|d}t��}t	j
�fdd�tt|��D��D]�}t|�}tt|��D]<}|||d||7<|||d||8<q�t
�fdd�|D��r�q�d}tt|��D]:}||}||d|��dtd�|
|9}�q
||7}q�|�|}||9}|S)	Nrcsg|]}tt����qSrr�r0r�rr)r4�r5zDR_coeff_m.<locals>.<listcomp>rc3s|]}|�VqdSr�rr0r�rr)r��r5zDR_coeff_m.<locals>.<genexpr>r-rK)rrrrrrr�r�zeror�r�r6rr�)r�rrrr_rErsrrrrr rwrxrzryr�r�r�r�r2r�r�rr�r)�
DR_coeff_m�s0

�$0
r�c	Cs\g}ttd|d��}tt||||��D]}|�t|||||||��q(t|�td�|S)a�
    INPUT:

    g : integer
      the genus
    r : integer
      cohomological degree (set to g for the actual DR cycle, should give
      tautological relations for r > g)
    n : integer
      number of marked points
    dvector : integer vector
      weights to place on the marked points, should have sum zero in the case
      of the DR cycle
    kval : integer (0 by default)
      if set to something else than 0 then the result is the twisted DR
      cycle by copies of the log canonical bundle (e.g. 1 for differentials)
    moduli_type : a moduli type
      MODULI_ST by default (moduli of stable curves), can be set to moduli
      spaces containing less of the boundary (e.g.  MODULI_CT for compact type)
      to compute there instead
    rr-)rrrrr�rr)	rrr_rErsrr!rr2rrr)�
DR_compute�s
r�c
CsRg}ttd|d��}tt||||��D] }	|�t||	||||||��q(t|�S)Nr)rrrrr�r)
r�rrr_rErsrr!rr2rrr)�DR_compute_ms
r�cCs$t||||||�}dd�t|�D�S)z�
    Same as :func:`DR_compute` except that it returns the answer as a
    sparse vector.

    EXAMPLES::

        sage: from admcycles.DR import DR_sparse
        sage: DR_sparse(1,1,2,(2,-2))
        [[1, 2], [2, 2], [4, -1/24]]
    cSs g|]\}}|dkr||g�qSr@r)r1r2Zvecirrr)r4r5zDR_sparse.<locals>.<listcomp>)r�rA)rrr_rErsrrkrrr)�	DR_sparsesr�cCs�ddlm}ddlm}t||||d�}|}|d|d|krZ||||||�}|d7}q,t��}|D]*\}	}
||
||	|ttd|d���7}qf|d|S)Nr)�psi_multiple)�socle_evaluationrr,r-)	�algebrar��
evaluationr�r�rr�rr)rr_rE�	which_psir�r�rkrr�rQrRrrr)�DR_psi_checks
$r�cCsxt|�}t|�}|}tt|�d|d|�}t|||||�}ttdd�|D��}t||ttd|d���}t	||�S)a*
    Same as :func:`DR_compute` except that it only requires two arguments
    (g and dvector) and simplifies the answer using the 3-spin
    tautological relations.

    EXAMPLES::

        sage: from admcycles.DR import DR_reduced
        sage: DR_reduced(1,(2,-2))
        (0, 0, 0, 4, 1/8)
    r-css|]}t|�VqdSr�r)r1rQrrr)r�6r5zDR_reduced.<locals>.<genexpr>r)
rr6r^r�rrrrrrn)rrEr_rrsrk�relsrrr)�
DR_reduced%sr�)r)%�__doc__rr��sage.rings.integer_ringr�sage.rings.rational_fieldr�sage.functions.otherr� sage.modules.free_module_elementr�modulir	�graphr
rrr
�utilsr�	relationsrr*r?rfrgrirnr~r�r�r�r�r�r�r�r�rrrr)�<module>s4% 6!	,0