o
    –h@C  ã                   @   sî   d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
 d dlT e jje jjgZd'dd„Zd(d	d
„Zd(dd„Zd(dd„Zd(dd„Zd(dd„Zd(dd„Zd(dd„Zd(dd„Zdd„ Zdd„ Zd(dd„Zd(dd „Zd!d"„ Zd#d$„ Zd%d&„ ZdS ))é    N)Úparse_transitions)ÚSimpleModelÚUNARY_LIMIT)ÚTransitionSchemeÚShiftÚCloseConstituentÚOpenConstituent)Ú*é   c                    s\   g d¢‰g d¢‰ ‡ ‡fdd„t |ƒD ƒ}|  |¡}t|ƒ|ks!J ‚tdd„ |D ƒƒs,J ‚|S )N)ÚUnbanÚMoxÚOpal)ÚVBÚNNPr   c                    s   g | ]	}t tˆˆ ƒƒ‘qS © )ÚlistÚzip)Ú.0Ú_©ÚtagsÚwordsr   úk/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/tests/constituency/test_parse_transitions.pyÚ
<listcomp>   s    z'build_initial_state.<locals>.<listcomp>c                 s   s    | ]}|j d kV  qdS )r   N)Únum_transitions)r   Ústater   r   r   Ú	<genexpr>   s   € z&build_initial_state.<locals>.<genexpr>)ÚrangeÚinitial_state_from_wordsÚlenÚall)ÚmodelÚ
num_statesÚ	sentencesÚstatesr   r   r   Úbuild_initial_state   s   
r%   c                 C   s’   | d u rt ƒ } t| ƒ}t|ƒdksJ ‚|d }|jdksJ ‚|jdks%J ‚t|jƒdks.J ‚t|jƒdks7J ‚t|jƒdks@J ‚|jdksGJ ‚d S )Nr
   r   é   é   )	r   r%   r   Úsentence_lengthÚ	num_opensÚ
word_queueÚconstituentsÚtransitionsÚword_position)r!   r$   r   r   r   r   Útest_initial_state   s   r.   c                 C   s.  | d u rt ƒ } t| ƒd }t d¡}| || ¡}t d¡}| || ¡}t ¡ }| || ¡s/J ‚t|jƒdks8J ‚|j	dks?J ‚| || ¡}t|jƒdksNJ ‚t|j
ƒdksWJ ‚t|jƒdks`J ‚| || ¡shJ ‚|j	dksoJ ‚| ¡ ruJ ‚| || ¡}t|jƒdks„J ‚t|j
ƒdksJ ‚t|jƒdks–J ‚| || ¡sžJ ‚|j	dks¥J ‚| ¡ r«J ‚| || ¡}t|jƒdksºJ ‚t|j
ƒdksÃJ ‚t|jƒdksÌJ ‚| || ¡rÔJ ‚|j	d	ksÛJ ‚| ¡ sáJ ‚|j
}|  |¡jd jd
ksñJ ‚| ¡ }|  |¡jd jdksJ ‚| ¡ }|  |¡jd jdksJ ‚d S )Nr   ÚROOTÚSr'   é   r
   é   é   r&   r   r   r   )r   r%   r   r   Úapplyr   Úis_legalr   r*   r-   r+   r,   Úempty_word_queueÚget_top_constituentÚchildrenÚlabelÚpop)r!   r   Úopen_transitionÚshiftr+   r   r   r   Ú
test_shift$   sL   

 r=   c                 C   sp   | d u rt ƒ } t| ƒd }t dd¡}|jdksJ ‚| || ¡r"J ‚t d¡}|jdks.J ‚| || ¡r6J ‚d S )Nr   r/   ÚVP)r/   r>   )r>   )r   r%   r   ÚCompoundUnaryr9   r5   )r!   r   Úunaryr   r   r   Útest_initial_unaryR   s   
rA   c                 C   sä   | d u rt ƒ } t| ƒd }t ¡ }| || ¡}t dd¡}| || ¡s%J ‚| || ¡}| || ¡r3J ‚|  |j¡}|j	dks@J ‚t
|jƒdksIJ ‚|jd }|j	dksUJ ‚t
|jƒdks^J ‚|jd }|j	dksjJ ‚| ¡ spJ ‚d S )Nr   r0   r>   r
   r   )r   r%   r   r   r4   r?   r5   r7   r+   r9   r   r8   Úis_preterminal)r!   r   r<   r@   Útreer   r   r   Ú
test_unary`   s$   

rD   c                 C   sf  | d u r
t tjd} t| ƒd }t d¡}| || ¡sJ ‚| || ¡}t ¡ }| || ¡s/J ‚| || ¡}| || ¡s=J ‚| || ¡}| || ¡sKJ ‚| || ¡}| || ¡rYJ ‚t 	¡ }| || ¡seJ ‚| || ¡}| || ¡rsJ ‚| || ¡r{J ‚t 
d¡}| || ¡rˆJ ‚t 
d¡}| || ¡s•J ‚| | ¡rœJ ‚| || ¡}| || ¡rªJ ‚| | ¡s±J ‚d S )N©Útransition_schemer   r0   ÚNPr/   )r   r   ÚTOP_DOWN_UNARYr%   r   r   r5   r4   r   r   r?   Úfinished)r!   r   r;   r<   Úclose_transitionÚnp_unaryÚ
root_unaryr   r   r   Útest_unary_requires_rootx   s6   


rM   c                 C   s  | d u rt ƒ } t| ƒd }t ¡ }| || ¡}| || ¡}|jdks$J ‚t d¡}| || ¡s1J ‚| || ¡}| || ¡s?J ‚|jdksFJ ‚tdƒD ]}| || ¡}qJ| || ¡r[J ‚|jdksbJ ‚t| ƒd }| || ¡}| || ¡}| || ¡}| || ¡r‚J ‚d S )Nr   r>   r
   é   é   )	r   r%   r   r   r4   r)   r   r5   r   )r!   r   r<   r;   Úir   r   r   Ú	test_openš   s*   
rQ   c                 C   s*  | d u rt ƒ } t| ƒd }t dd¡}| || ¡sJ ‚t ¡ }t ¡ }| || ¡}| || ¡}| || ¡}| || ¡}| || ¡}|  |j	¡}|j
dksNJ ‚t|jƒdksWJ ‚|jd }|j
dkscJ ‚t|jƒdkslJ ‚|jd jd j
dksyJ ‚|jd jd j
dks†J ‚|jd jd j
d	ks“J ‚d S )
Nr   r/   r0   r
   r&   r   r   r2   r   )r   r%   r   r   r5   r   r   r4   r7   r+   r9   r   r8   )r!   r   r;   r<   rJ   rC   r   r   r   Útest_compound_open·   s*   
rR   c                 C   sÂ  | d u r	t tjƒ} t| ƒd }t ¡ }| || ¡sJ ‚| || ¡}| || ¡r)J ‚t d¡}| || ¡s6J ‚| || ¡}| || ¡rDJ ‚t 	¡ }| || ¡sPJ ‚| || ¡}t d¡}| || ¡scJ ‚| || ¡}| || ¡rqJ ‚t d¡}| || ¡r~J ‚t d¡}| || ¡s‹J ‚| || ¡}| || ¡s™J ‚| || ¡r¡J ‚| || ¡}| || ¡s¯J ‚| || ¡}| || ¡s½J ‚| || ¡}| || ¡sËJ ‚| || ¡}| || ¡sÙJ ‚| || ¡}d S )Nr   r>   r0   r/   rG   )
r   r   ÚIN_ORDERr%   r   r   r5   r4   r   r   )r!   r   r<   Úopen_vpÚclose_transÚopen_sÚ	open_rootÚopen_npr   r   r   Útest_in_order_openÑ   sD   




rY   c                  C   sÂ   t tjƒ} t| ƒd }t ¡ }| || ¡sJ ‚| || ¡}t d¡}t 	¡ }t
tƒD ]}| || ¡s4J ‚| || ¡}| || ¡sBJ ‚| || ¡}q*| || ¡sQJ ‚| || ¡}| || ¡r_J ‚dS )zÆ
    This tests rejecting Close at the start of a sequence after too many unary transitions

    The model should reject doing multiple "unaries" - eg, Open then Close - in an IN_ORDER sequence
    r   rG   N©r   r   rS   r%   r   r   r5   r4   r   r   r   r   ©r!   r   r<   rX   rU   r   r   r   r   Útest_too_many_unaries_close   s   

r\   c                  C   sî   t tjƒ} t| ƒd }t ¡ }| || ¡sJ ‚| || ¡}t d¡}t 	¡ }| || ¡s.J ‚| || ¡}| || ¡r<J ‚| || ¡sDJ ‚| || ¡}t
tƒD ]}| || ¡sXJ ‚| || ¡}| || ¡sfJ ‚| || ¡}qN| || ¡ruJ ‚dS )zÆ
    This tests rejecting Open in the middle of a sequence after too many unary transitions

    The model should reject doing multiple "unaries" - eg, Open then Close - in an IN_ORDER sequence
    r   rG   NrZ   r[   r   r   r   Útest_too_many_unaries_open  s$   

r]   c                 C   sR  | d u rt ƒ } t| ƒd }t d¡}| || ¡sJ ‚| || ¡}|jdks'J ‚t ¡ }| || ¡s3J ‚| || ¡}t d¡}| || ¡sFJ ‚| || ¡}|jdksSJ ‚| || ¡s[J ‚| || ¡}| || ¡siJ ‚| || ¡}| || ¡rwJ ‚|jdks~J ‚t ¡ }| || ¡sŠJ ‚| || ¡}|jdks—J ‚| || ¡sŸJ ‚| || ¡}|jdks¬J ‚| || ¡r´J ‚|  	|j
¡}|jdksÁJ ‚t|jƒdksÊJ ‚|jd }|jdksÖJ ‚t|jƒdksßJ ‚|jd  ¡ sèJ ‚|jd  ¡ sñJ ‚|jd jd jdksþJ ‚|jd jd jdksJ ‚t|j
ƒdksJ ‚| | ¡|||||||gks'J ‚d S )Nr   r>   r
   rG   r2   r   r   )r   r%   r   r   r5   r4   r)   r   r   r7   r+   r9   r   r8   rB   Úall_transitions)r!   r   Úopen_transition_vpr<   Úopen_transition_nprJ   rC   r   r   r   Ú
test_close9  sP   


&ra   c                 C   s†  | du r
t tjd} t| ƒd }t d¡}t ¡ }| || ¡s!J ‚| || ¡r)J ‚| || ¡}t 	d¡}| || ¡s<J ‚| || ¡rDJ ‚| || ¡}|j
dksQJ ‚| || ¡sYJ ‚| || ¡raJ ‚| || ¡}| || ¡soJ ‚| || ¡rwJ ‚| || ¡}t ¡ }| || ¡s‰J ‚| || ¡}|j
dks–J ‚| || ¡ržJ ‚| || ¡s¦J ‚| || ¡}| || ¡r´J ‚|  |j¡}|jdksÁJ ‚dS )zM
    Test the Finalize transition is only legal at the end of a sequence
    NrE   r   r/   rG   r
   )r   r   ÚIN_ORDER_COMPOUNDr%   r   ÚFinalizer   r5   r4   r   r)   r   r7   r+   r9   )r!   r   Úfinalizer<   r;   rJ   rC   r   r   r   Útest_in_order_compound_finalizeo  s:   

re   c                  C   s®  t ƒ } t ¡ }|| vsJ ‚|  |¡ || v sJ ‚t ¡ }|| v s"J ‚tdƒD ]}|  |¡ q&t| ƒdks6J ‚t d¡}|| vsAJ ‚|  |¡ || v sLJ ‚t dd¡}|| vsXJ ‚|  |¡ |  |¡ |  |¡ t dd¡}|| v ssJ ‚t d¡}|| vs~J ‚|  |¡ || v s‰J ‚|  |¡ |  |¡ t| ƒdks›J ‚t d¡| v s¤J ‚t ¡ }|| vs®J ‚|  |¡ |  |¡ |  |¡ || v sÃJ ‚t ¡ }|| v sÍJ ‚t| ƒdksÕJ ‚d S )Nr'   r
   ÚasdfÚzzzzr1   )	Úsetr   r   Úaddr   r   r?   r   r   )r,   r<   rP   r@   ÚocÚccr   r   r   Útest_hashes˜  sL   












rl   c                  C   s’   g } |   t ¡ ¡ |   t ¡ ¡ |   t d¡¡ |   t dd¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ t| ƒ}t|ƒ}|| ksGJ ‚d S )NrG   r>   ÚmoxÚopalÚunban)Úappendr   r   r   r?   r   rh   Úsorted)Úexpectedr,   r   r   r   Ú	test_sortÇ  s   rs   c                  C   s²   t ƒ tƒ tdƒtdƒh} t ƒ tƒ tdƒtdƒh}t | |d¡ t ƒ tƒ tddƒh}t | |d¡ t t¡ t ƒ tƒ tddƒh}t | |d¡ W d  ƒ dS 1 sRw   Y  dS )zW
    Test that check_transitions passes or fails a couple simple, small test cases
    rG   r>   ÚtestÚZPN)r   r   r   r   Úcheck_transitionsÚpytestÚraisesÚRuntimeError)r,   Úotherr   r   r   Útest_check_transitionsÖ  s   "þr{   )r
   )N) rw   Ústanza.models.constituencyr   Ú%stanza.models.constituency.base_modelr   r   Ú,stanza.models.constituency.parse_transitionsr   r   r   r   Ústanza.testsÚmarkÚpipelineÚtravisÚ
pytestmarkr%   r.   r=   rA   rD   rM   rQ   rR   rY   r\   r]   ra   re   rl   rs   r{   r   r   r   r   Ú<module>   s,    




.


"

/

6)/