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

��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]y}
d}td|�D]}|j|	|fdkrA|j|
|fdkrAd}nq)|sEq t|	g�}
d}|r�d}t|
�D]7}td|�D]/}|j||fdkr�td|�D]}|j||fdkr�||
vr�||	ks�||
kr�|
�|�d}qkq[qT|sN|
|
vr�|�|
|	g�q q|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_pairs5sB

$�
*
���	��r*cs|dkS)N�)rrrrr*�lenrr)rrrrrrr �nonsep_pairsr"r#r'�jlist�i�ilist�ii1�ii2�jj�count�iir�rr$r)�DR_coeff_is_knownUsr7c 
s�ttd|d��}t|||||���j����j���tdt|||||�f�}����fdd�}dd�}	t|||||�}
t	|
�dkr�|
dd|
ddddg}tdd�D]1}td�D]*}
|
||
|dkrq|
|d|
|d	<|
||
|dkr�|
|d|
|d<q[qU||�}|d}|d|d}|d|d|d}||	|||�9}n�t	|
�d	k�r�|
dd}|
dd}|
dd}|||g}||dg�||�}||dg}d
}td	�D]n����fdd�td��D�}t	|�dk�r|t
��d
|	d|�|�d�9}d}q�t	|�dk�rP�j��|dfd�j��d|dfddk�rP|t
��d|	d|�|�d�9}d}q�|�s�||dd
|dd
|dd
d|dd|dd|ddt
d�9}td��D�]K}
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]}�j||fdk�r�j||fdk�r|�|��q�t	|�dk�rQ�j||
fd}�j||
fd}|d9}|t
|���}|t
|��
�}|||d}||||g�dt
d�||d9}�q�t	|�dk�r"|d|
k�ra�q��j||dfd�j||dfd�j||dfd�j||dfdg}t|�}|dk�r�|t
��d
9}||||g�dd9}nv|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�r|t
��d9}||||g�dd9}�q�t	|�d	k�r�|d|
k�r2�q��j||dfd�j||dfd�j||dfd�j||dfd�j||dfd�j||dfdg}t|�}|dk�r�|t
��d 9}||||g�dd
9}n|dk�r�|t
��d!9}||||g�dd9}�q�t	|�dk�r�|d|
k�r��q�|t
��d"9}||||g�dd9}�q�|S)#Nrc
s(dd�|D�}td��D]�}�jd|fdkr�td��D]t}�j||fdkr�t|g�}d}|rpd}t|�D]7}td��D]/}�j||fdkrltd��D]}�j||fdkrk||vrk||vsd||vrk|�|�d}qMq=q6|s0t|�D]\}	}
|
|vr�||	��jd|fdd7<qtqq|S)NcSsg|]}d�qS�rr)�.0r"rrr)�
<listcomp>�sz-DR_coeff.<locals>.balance.<locals>.<listcomp>rrTF)rrrrr�	enumerate)r0Zbal�j1r'r%r&r(�j2Zi5�kkZikk)r�dvectorr rrr)�balance�s0
*
���	&�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������(�����p�T��Fr+)r�one)�a�b�crrr)�poly4�s��zDR_coeff.<locals>.poly4r+rrF�Fcs@g|]}�j��|fdkr�j��d|fdkr|�qS)rr�r�r9r$)r�cycle4�krr)r:�s
�
�zDR_coeff.<locals>.<listcomp>rET�
������)rFrrr)rrFrr)rrrFr)rrrrF�)rrrr)rrrr)rrrr)rrrri)rrrr)rrrrrHrA�ZiHi�	)rrrrrrrr
r*r,rrKr�	factorialZfactoial�sum) rrr�nr?rrr!r@rOr-�cycler/r$ZdbalrLrMrNr"r#r'Zdbal4�doner.r0�xr1r2r3�x1�x2�xvecr)rrSr?rTr rr)�DR_coeff�s

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


""8�<�

�rccCs|t|||||�}|j��}|j��}g}td|�D]E}	|j|	dft|j|	dfd�kr0dStd|�D](}
|j|	|
fddkrFdS|jd|
fdkr]|j|	|
fdkr]|�|	�q5qtd|�D]W}t|�}|�|�d}
|
r�d}
t	|�D]4}	|	|kr�qytd|�D]'}
|j|	|
fdkr�td|�D]}|j||
fdkr�||vr�|�|�d}
q�q�qy|
sst
|�|dkr�dSqddS)NrrTrFF)rrrrrr
rrrrr,)rrrrrrrr Zmarked_verticesr/r$r5r%r&r#rrr)�veto_for_DRsH

$$
��

����rdcCsbtt||||��D]%}t|||||�s.t|||||�s.t|�tt|||||�j�td�q	dS)Nz---------------------)rrrdr7�printrr)rrrrr/rrr)�
DR_uncomputed;s ��rfcCs`t|�}|D]'}tt|��D]}||dkr,||dkr*|t||||f�|8}nqq|S)Nr)rrr,r)�B�vec�vec2�rowr/rrr)�reduce_with_relsDs��rkcs�ttd|d��}t|||||���j��}�j���g}	g}
t��t|||||�}td|�D]Q}td�j|df�	�d�D]@�|t�j|df���
�}|t���
��j|df�}|d�j|df�9}|�d��j|df�9}q@q0���fdd�t|d�D�}
td��D]����fdd�td|�D�}�jd�fdk�rt|�dkr�|d}|d}�j|�fd}�j|�fd}n|d}|d}�j|�fd}�j|�fd}|	�|d|dg�|
�||d�|t|��
�t|��
�||d}q��j|d�fd}||�jd�fddtd�|t|��
�9}|
|dd|�jd�fdd7<q�|	|
|
|fS)NrrrWrFc	sNg|]#��d�j�ddfddt��fdd�td��D���qS)rFrrc�"g|]
}�j�d|d�qS�rrrQrR�rr/rr)r:^s�z-DR_coeff_setup.<locals>.<listcomp>.<listcomp>)rr[r�r9�r�kvalr �r/r)r:^s
.��z"DR_coeff_setup.<locals>.<listcomp>c�"g|]
}�j|�fdkr|�qSr8rQ�r9r/r6rr)r:a�
��
rrrrrrrrKr
�degreerZr,r)rrrr\r?rqrrr�	edge_list�exp_list�
scalar_factorr/�
given_weightsr0r"r#�exp1�exp2r�rr$rqr r)�DR_coeff_setupOsl

� "$�
�
�
�
��
�
���rcs�ttd|d��}t|||||�}|j��}	|j��}
t|||||||�\}}}
}ttdd�|D��t	d��|t
|�}|
|	|d}dt|�}t|d||d�}g}|D]t�d}tj�fdd�tt
|��D��D]T}t|
�}tt
|��D]}|||d||7<|||d||8<q{t�fdd�|D��r�qod}tt
|��D]}|||t	d�||9}q�||7}qo|�t|�|f��q[t||�}|jdd	�|S)
NrcSsg|]}t|��qSr)�absrtrrr)r:�sz DR_coeff_new.<locals>.<listcomp>rFrc�g|]}tt����qSr��listrrt��mrr)r:��c3��|]}|�VqdS�Nrrtr�rr)�	<genexpr>���zDR_coeff_new.<locals>.<genexpr>)r_)rrrrrrrrr[rr��	itertools�productr,r�anyrrr�subs)rrrr\r?rqrrrrr rxryr{rz�m0�h0�deg�mrangeZmvalues�total�weight_data�vertex_weightsr/�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]L�|t�j|
df���
�}|t���
��j|
df�}|d�j|
df�9}|�d�||dtd���j|
df�9}q@q0���fdd�t|	d�D�}td��D]Љ��fdd�td|	�D�}�jd�fdk�r t|�dkr�|d}|d}�j|�fd}�j|�fd}n|d}|d}�j|�fd}�j|�fd}|
�|d|dg�|�||d�|t|��
�t|��
�||d}q��j|d�fd}|�jd�fdd}|dk�rA||}||d|||dtd�|t|��
�9}||dd|�jd�fdd7<q�|
|||fS)	NrrrWrFrEc	sVg|]'��td��j�ddfdtd�t��fdd�td��D���qS)rFrrcrlrmrQrRrnrr)r:�s"z/DR_coeff_setup_m.<locals>.<listcomp>.<listcomp>)rrr[rrorprrr)r:�s
*��z$DR_coeff_setup_m.<locals>.<listcomp>crsr8rQrtr6rr)r:�rurv)r�rrrr\r?rqrrrrxryrzr/r{r0r"r#r|r}�dvalrr~r)�DR_coeff_setup_m�sz

� "���
�
�
�
�
��
���r�c	sfttd|d��}t|||||�}	|	j��}
|	j��}t�|||||||�\}}
}}||
|d}t��}t	j
�fdd�tt|��D��D]`}t|�}tt|��D]}|||d||7<|||d||8<qRt
�fdd�|D��r}qFd}tt|��D]}||}||d|��dtd�|
|9}q�||7}qF|�|}||9}|S)	Nrcr�rr�rtr�rr)r:�r�zDR_coeff_m.<locals>.<listcomp>rc3r�r�rrtr�rr)r��r�zDR_coeff_m.<locals>.<genexpr>rFrE)rrrrrrr�r�zeror�r�r,rr�)r�rrrr\r?rqrrrrr rxryr{rzr�r�r�r�r/r�r�rr�r)�
DR_coeff_m�s0

�$.
r�c	Cs\g}ttd|d��}tt||||��D]}|�t|||||||��qt|�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
    rrF)rrrrr�rr)	rrr\r?rqrr!rr/rrr)�
DR_compute�s
r�c
CsRg}ttd|d��}tt||||��D]}	|�t||	||||||��qt|�S)Nr)rrrrr�r)
r�rrr\r?rqrr!rr/rrr)�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�qSr8r)r9r/Zvecirrr)r:s zDR_sparse.<locals>.<listcomp>)r�r;)rrr\r?rqrrhrrr)�	DR_sparsesr�cCs�ddlm}ddlm}t||||d�}|}|d|d|kr6||||||�}|d7}|d|d|ks t��}|D]\}	}
||
||	|ttd|d���7}q<|d|S)Nr)�psi_multiple)�socle_evaluationrrPrF)	�algebrar��
evaluationr�r�rr�rr)rr\r?�	which_psir�r�rhrr�rLrMrrr)�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)
    rFcss�|]}t|�VqdSr�r)r9rLrrr)r�6r�zDR_reduced.<locals>.<genexpr>r)
rr,r[r�rrrrrrk)rr?r\rrqrh�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*r7rcrdrfrkrr�r�r�r�r�r�r�r�rrrr)�<module>s6% 6!	,0