o
    h                     @   s   d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ e ZedZe	jfdd	Zd
d Zdd Ze	jfddZe	jdfddZdd ZdddZdd Zedkrde  dS dS )zw
Build a transition sequence from parse trees.

Supports multiple transition schemes - TOP_DOWN and variants, IN_ORDER
    N)utils)ShiftCompoundUnaryOpenConstituentCloseConstituentTransitionSchemeFinalize)
read_trees)get_tqdmzstanza.constituency.trainerc                 c   sJ   |   rt V  dS |  rdS |tju rRt| jdkrRg }|   s@t| jdkr@|| j | jd } |   s@t| jdks*t	| |D ]}|V  qEt
| V  dS |tju r| jg}t| jdkr| jd   s| jd } || j t| jdkr| jd   rit| V  nt| jV  | jD ]}t	||D ]}|V  qqt V  dS )aj  
    For tree (X A B C D), yield Open(X) A B C D Close

    The details are in how to treat unary transitions
    Three possibilities handled by this method:
      TOP_DOWN_UNARY:    (Y (X ...)) -> Open(X) ... Close Unary(Y)
      TOP_DOWN_COMPOUND: (Y (X ...)) -> Open(Y, X) ... Close
      TOP_DOWN:          (Y (X ...)) -> Open(Y) Open(X) ... Close Close
    N   r   )is_preterminalr   is_leafr   TOP_DOWN_UNARYlenchildrenappendlabelyield_top_down_sequencer   TOP_DOWN_COMPOUNDr   r   )treetransition_schemelabels
transitionchild r   i/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/constituency/transition_sequence.pyr      s<   






r   c                 c   s|    |   rt V  dS |  rdS t| jd D ]}|V  qt| jV  | jdd D ]}t|D ]}|V  q1q+t V  dS )z;
    For tree (X A B C D), yield A Open(X) B C D Close
    Nr   r   )r   r   r   yield_in_order_sequencer   r   r   r   )r   r   r   r   r   r   r   ;   s   r   c                 #   st     fdd t | jdkrtdt | jdkr%td|  | jd D ]}|V  q,t| jV  d S )Nc                 3   s"   |   rd S g }t| jdkr*|  s*|| j | jd } t| jdkr*|  r|  r?t V  t|dkr=t| V  d S  | jd D ]}|V  qFtj	u rXt
| jV  n|| j t
| V  | jdd  D ]} |D ]}|V  qpqjt V  tj	u rt|dkrt| V  d S d S d S )Nr   r   )r   r   r   r   r   r   r   r   r   IN_ORDER_UNARYr   r   )r   r   r   r   helperr   r   r   r   T   s6   



z0yield_in_order_compound_sequence.<locals>.helperr   z Cannot build {} on an empty treer   z<Cannot build {} with a tree that has two top level nodes: {})r   r   
ValueErrorformatr   r   )r   r   tr   r   r    yield_in_order_compound_sequenceS   s   !r#   c                 C   sF   |t ju rtt| S |t ju s|t ju rtt| |S tt| |S )zU
    Turn a single tree into a list of transitions based on the TransitionScheme
    )r   IN_ORDERlistr   IN_ORDER_COMPOUNDr   r#   r   )r   r   r   r   r   build_sequence   s   


r'   Fc                    s(   |r fdd| D S  fdd| D S )zi
    Turn each of the trees in the treebank into a list of transitions based on the TransitionScheme
    c                    s   g | ]	}t |  qS r   )r'   reverse.0r   r   r   r   
<listcomp>   s    z"build_treebank.<locals>.<listcomp>c                    s   g | ]}t | qS r   )r'   r)   r+   r   r   r,      s    r   )treesr   r(   r   r+   r   build_treebank   s   r.   c                 C   s"   t  }| D ]}|| qt|S )z_
    Given a list of transition lists, combine them all into a list of unique transitions.
    )setupdatesorted)transition_liststransitions
trans_listr   r   r   all_transitions   s   r5   c                 C   sR   t | dkr
g g fS td| t tjkrt| } t| ||}t|}||fS )z
    Wrap both build_treebank and all_transitions, possibly with a tqdm

    Converts trees to a list of sequences, then returns the list of known transitions
    r   z Building %s transition sequences)	r   loggerinfogetEffectiveLevelloggingINFOtqdmr.   r5   )r-   treebank_namer   r(   	sequencesr3   r   r   r   convert_trees_to_sequences   s   r>   c                  C   s,   d} t | d }t| t|}t| dS )z9
    Convert a sample tree and print its transitions
    z[( (SBARQ (WHNP (WP Who)) (SQ (VP (VBZ sits) (PP (IN in) (NP (DT this) (NN seat))))) (. ?)))r   N)r	   printr'   )textr   r3   r   r   r   main   s
   rA   __main__)F)__doc__r9   stanza.models.commonr   ,stanza.models.constituency.parse_transitionsr   r   r   r   r   r   &stanza.models.constituency.tree_readerr	   stanza.utils.get_tqdmr
   r;   	getLoggerr6   r   r   r   r#   r'   r.   r5   r>   rA   __name__r   r   r   r   <module>   s&     
),	
	
