U
    ;vf                     @   s  d Z dgZddlZddlZddlmZ ddlmZ G dd deZG dd	 d	eZ	G d
d deZ
G dd deZG dd deZG dd deZefZeefZdd ZG dd deZdd ZG dd dZdd Zdd Zdd Zd[d d!Zd\d"d#Zd]d$d%Zd^d'd(Zd)d* Zd_d+d,Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCdD Z,dEdF Z-dGdH Z.dIdJ Z/e/ Z0dKdL Z1dMdN Z2dOdP Z3dQdR Z4dSdT Z5ej6fdUdVZ7G dWdX dXZ8G dYdZ dZZ9dS )`z{Fortran/C symbolic expressions

References:
- J3/21-007: Draft Fortran 202x. https://j3-fortran.org/doc/year/21/21-007.pdf
Expr    N)Enum)gcdc                   @   s   e Zd ZdZdZdZdZdS )Languagez2
    Used as Expr.tostring language argument.
    r         N)__name__
__module____qualname____doc__PythonFortranC r   r   7/tmp/pip-unpacked-wheel-sdaoq5e2/numpy/f2py/symbolic.pyr      s   r   c                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )Opz$
    Used as Expr op attribute.
    
               (   d            i,  i  i  i  i  N)r   r	   r
   r   INTEGERREALCOMPLEXSTRINGARRAYSYMBOLTERNARYAPPLYINDEXINGCONCAT
RELATIONALTERMSFACTORSREFDEREFr   r   r   r   r   &   s    r   c                   @   sH   e Zd ZdZdZdZdZdZdZdZ	e
ejfdd	Zejfd
dZdS )RelOpzH
    Used in Op.RELATIONAL expression to specify the function part.
    r   r               c                 C   sR   |t jkr0tjtjtjtjtjtjd|	  S tjtjtjtjtjtjd| S )N).eq..ne..lt..le..gt..ge.)==!=<<=>>=)
r   r   r+   EQNELTLEGTGElower)clsslanguager   r   r   
fromstringF   s     
    zRelOp.fromstringc                 C   sb   |t jkr6tjdtjdtjdtjdtjdtjdi|  S tjdtjdtjd	tjd
tjdtjdi|  S )Nr0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   )	r   r   r+   r<   r=   r>   r?   r@   rA   selfrE   r   r   r   tostringO   s2    
            zRelOp.tostringN)r   r	   r
   r   r<   r=   r>   r?   r@   rA   classmethodr   r   rF   rI   r   r   r   r   r+   ;   s   r+   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ArithOpzC
    Used in Op.APPLY expression to specify the function part.
    r   r   r,   r-   r.   r/      N)r   r	   r
   r   POSZNEGZADDZSUBZMULDIVPOWr   r   r   r   rK   Y   s   rK   c                   @   s   e Zd ZdS )OpErrorNr   r	   r
   r   r   r   r   rP   f   s   rP   c                   @   sD   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdS )
Precedencez4
    Used as Expr.tostring precedence argument.
    r   r   r   r,   r-   r/   rL      r         r   r   N)r   r	   r
   r   ATOMPOWERUNARYPRODUCTSUMr>   r<   ZLANDZLORr"   ZASSIGNTUPLENONEr   r   r   r   rR   j   s   rR   c                 C   s<   |  |}|d kr|| |< n|| }|r2|| |< n| |= d S N)get)dkvcr   r   r   
_pairs_add   s    


rc   c                   @   s   e Zd ZdS )ExprWarningNrQ   r   r   r   r   rd      s   rd   c                 C   s   t j| tdd d S )Nr   )
stacklevel)warningswarnrd   )messager   r   r   ewarn   s    ri   c                   @   s$  e Zd ZdZeejfddZdd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd ZejejfddZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$d8d9 Z%d:d; Z&d<d= Z'd>d? Z(d@dA Z)dBS )Cr   zfRepresents a Fortran expression as a op-data pair.

    Expr instances are hashable and sortable.
    c                 C   s   t | |dS )z.Parse a Fortran expression to a Expr.
        rE   )rF   )rD   rE   r   r   r   parse   s    z
Expr.parsec                 C   s0  t |tst|tjkrbt |tr.t|dks2tt |d tsDtt |d ttfs^t|n|tjkrt |trt|dkstt |d t	stt |d ttfst|nj|tj
krt |trt|dkstnB|tjkr`t |trt|dkstt |d tr<|d d d t|d d  dks@tt |d ttfs t|n|tjkrt|d k	s tn|tjtjfkrt |tsttdd |D s t|n\|tjtjfkrt |ts tn6|tjkrTt |trt|dkstt|d d k	s*tt |d ts>tt |d ts tn|tjkrt |trzt|dks~tt|d d k	s tn|tjkrt |trt|dks tn^|tjtjfkrt |ts tn:|tjkrt |trt|dks tntd| || _|| _d S )	Nr   r   r   )z""z''z@@c                 s   s   | ]}t |tV  qd S r]   )
isinstancer   .0itemr   r   r   	<genexpr>   s     z Expr.__init__.<locals>.<genexpr>r,   z$unknown op or missing sanity check: )rl   r   AssertionErrorr   tuplelenintstrr   floatr   r   r!   hashr    r%   allr'   r(   dictr#   r$   r"   r)   r*   r   r&   NotImplementedErroropdata)rH   r{   r|   r   r   r   __init__   sV    


     zExpr.__init__c                 C   s"   t |to | j|jko | j|jkS r]   )rl   r   r{   r|   rH   otherr   r   r   __eq__   s
    


zExpr.__eq__c                 C   sl   | j tjtjfkr&tt| j }n8| j tjkrX| jd d tt| jd   }n| j}t	| j |fS Nr   )
r{   r   r'   r(   rr   sortedr|   itemsr#   rw   )rH   r|   r   r   r   __hash__   s    &zExpr.__hash__c                 C   s   t |tr| j|jk	r&| jj|jjk S | jtjtjfkr\tt| j	
 tt|j	
 k S | jtjkr| j	d d |j	d d kr| j	d d |j	d d k S tt| j	d 
 tt|j	d 
 k S | j	|j	k S tS r   )rl   r   r{   valuer   r'   r(   rr   r   r|   r   r#   NotImplementedr~   r   r   r   __lt__   s    
zExpr.__lt__c                 C   s   | |kp| |k S r]   r   r~   r   r   r   __le__      zExpr.__le__c                 C   s
   | |k S r]   r   r~   r   r   r   __gt__  r   zExpr.__gt__c                 C   s
   | |k  S r]   r   r~   r   r   r   __ge__  r   zExpr.__ge__c                 C   s    t | j d| j d| jdS N(, ))typer   r{   r|   rH   r   r   r   __repr__  s    zExpr.__repr__c                 C   s   |   S r]   )rI   r   r   r   r   __str__
  s    zExpr.__str__c                    sv  | j tjtjfkr`| jd dk r&tjntj}t| jd | jd dkrVd| jd  nd }n| j tj	krd
 fdd| jD }d	| d
 }tj}n| j tjkrtj}t| j}n| j tjkr| jd }| jd dkr| jd d | }tj}n\| j tjkr:d
 fdd| jD }d| d }tj}n| j tjkr$g }t| j D ]\}}|dk rxd}| }nd}|dkr|jtj d}n2|tdkrt|}n| d|jtj d }|r|| n|dkr|d || qZd
|pd}|rtjntj}n4| j tjkrg }	g }
t| j D ]\}}d}|dkrp|jtj d}n tjkr|tddkr|jtj d}d
|g| }nX|tddkr|jtj d}|
|g|  7 }
qHn"|jtj d}d| d| d
}n|jtj dd|  }|	r2|	| |	| qH|
rl|	sV|	dg7 }	|	dd	d
|
d
g7 }	d
|	pzd}|	rtjntj}n| j tjkr8| j\}}}|tjkr tjkr fdd|D \}}| d| }tj}nD fdd|D }|dd | D 7 }| d	d
| d
}tj}n | j tjkr| jd } fd d| jdd! D }| dd
| d}tj}n| j tjkr fd"d| jD }d#
|}tj}n| j tj krz fd$d| jD \}}} tjkrd	| d%| d&| d
}nb tj!kr6d	| d'| d(| d
}n< tj"kr\d)| d| d| d
}nt#d*| j  d+  tj}n| j tj$krd,| jjtj% d }tj%}n| j tj&krd-| jjtj% d }tj%}n| j tj'krH| j\}}}|t(j)t(j*fkrtj)ntj+}|j| d}|j| d}|j d}| d.| d.| }nt#d/| j  |j,|j,k rrd	| d
 S |S )0z0Return a string representation of Expr.
        r   r   r-   _ r   c                 3   s   | ]}|j tj d V  qdS rj   NrI   rR   r[   rm   rj   r   r   rp     s   z Expr.tostring.<locals>.<genexpr>r   r   c                 3   s   | ]}|j tj d V  qdS r   r   rm   rj   r   r   rp   $  s   []z -  + rj    * -0r   r   izpow(z ** 1/c                    s   g | ]}|j tj d qS rj   rI   rR   rY   rn   argrj   r   r   
<listcomp>d  s   z!Expr.tostring.<locals>.<listcomp>z / c                    s   g | ]}|j tj d qS r   r   r   rj   r   r   r   j  s   c                 S   s$   g | ]\}}|d  | tj qS )=)rI   rR   r\   rn   r`   ra   r   r   r   r   l  s   c                    s   g | ]}|j tj d qS r   r   r   rj   r   r   r   r  s   Nc                    s   g | ]}|j tj d qS r   r   r   rj   r   r   r   w  s   z // c                    s   g | ]}|j tj d qS r   r   rn   arj   r   r   r   |  s   ?:z if z else zmerge(ztostring for z and &* ztostring for op )-r{   r   r   r   r|   rR   rZ   rV   ru   r   joinr!   r   r    r'   r   r   rI   	as_numberrY   appendr(   r   r   ranger[   rW   r#   rK   rN   r$   r%   r"   r   r   rz   r)   rX   r*   r&   r+   r<   r=   r>   r   )rH   Zparent_precedencerE   
precedencerZtermstermcoeffr{   ZfactorstailbaseexpZfactornameargskwargsnumerdenomcondexpr1expr2ropleftrightr   rj   r   rI     s0   






 















zExpr.tostringc                 C   s   | S r]   r   r   r   r   r   __pos__  s    zExpr.__pos__c                 C   s   | d S )Nr   r   r   r   r   __neg__  s    zExpr.__neg__c           	      C   s  t |}t|tr| j|jkr| jtjtjfkr^t| jd |jd  t	| jd |jd S | jtj
kr| j\}}|j\}}t|| || S | jtjkrt| jt| j}|j D ]\}}t|j|| qt|S | jtj
kr|jtjtjfkr| t| S | jtjtjfkr4|jtj
kr4t| | S | jtjkrf|jtjkrf| t|| jd d S | jtjkr|jtjkrt| |jd d| S t| t| S tS Nr   r   )kind)as_exprrl   r   r{   r   r   r   r   r|   maxr   
as_complexr'   ry   r   rc   	normalizeas_realas_termsr   )	rH   r   r1i1r2i2r   r`   ra   r   r   r   __add__  s6    

""zExpr.__add__c                 C   s   t |trt||  S tS r]   rl   number_typesr   r   r~   r   r   r   __radd__  s    
zExpr.__radd__c                 C   s
   | |  S r]   r   r~   r   r   r   __sub__  s    zExpr.__sub__c                 C   s   t |trt||  S tS r]   r   r~   r   r   r   __rsub__  s    
zExpr.__rsub__c                 C   sV  t |}t|trR| j|jkrN| jtjtjfkr`t| jd |jd  t	| jd |jd S | jtj
kr| j\}}|j\}}t|| ||  || ||  S | jtjkrt| jt| j}|j D ]\}}t|j|| qt|S | jtjkrNt| ji }| j D ]6\}	}
|j D ] \}}t|j|	| |
|  q qt|S | jtj
kr||jtjtjfkr|| t| S |jtj
kr| jtjtjfkrt| | S | jtjkr|jtjkr| t|| jd d S | jtjkr|jtjkrt| |jd d| S | jtjkr(| t| S |jtjkrBt| | S t| t| S tS r   )r   rl   r   r{   r   r   r   r   r|   r   r   r   r(   ry   r   rc   r   r'   r   r   
as_factorsr   )rH   r   r   r   r   r   r   r`   ra   t1c1t2c2r   r   r   __mul__  sH    

"""zExpr.__mul__c                 C   s   t |trt||  S tS r]   r   r~   r   r   r   __rmul__  s    
zExpr.__rmul__c                 C   s   t |}t|tr|jtjkr|jd }|dkr8tdS |dkrD| S |dkr| jtjkrt| ji }| j	 D ]\}}|| |j|< qnt
|S | | |d   S |dkr| |  d S ttj| |iS ttj| |S tS )Nr   r   r   )r   rl   r   r{   r   r   r|   r   r(   r   r   as_applyrK   rO   r   )rH   r   exponentr   r`   ra   r   r   r   __pow__  s(    

zExpr.__pow__c                 C   s(   t |}t|tr$tttj| |S tS r]   )r   rl   r   r   r   rK   rN   r   r~   r   r   r   __truediv__  s    
zExpr.__truediv__c                 C   s   t |}t|tr||  S tS r]   r   rl   r   r   r~   r   r   r   __rtruediv__  s    
zExpr.__rtruediv__c                 C   s*   t |}t|tr&tttj| |fS tS r]   )r   rl   r   r   r   r%   r   r~   r   r   r   __floordiv__!  s    
zExpr.__floordiv__c                 C   s   t |}t|tr||  S tS r]   r   r~   r   r   r   __rfloordiv__)  s    
zExpr.__rfloordiv__c                 O   s(   t | ftt|tdd | D S )Nc                 s   s   | ]\}}|t |fV  qd S r]   r   r   r   r   r   rp   6  s     z Expr.__call__.<locals>.<genexpr>)r   mapr   ry   r   )rH   r   r   r   r   r   __call__/  s    zExpr.__call__c                 C   sF   t |}t|ts|f}t|dkr4td| d ttj| f| S )Nr   z/C-index should be a single expression but got ``)r   rl   rr   rs   ri   r   r   r$   )rH   indexr   r   r   __getitem__8  s    
zExpr.__getitem__c                    sb  | j tjkrh | }|dkr"| S td| j}|rd| \}}|dkrPt|S |dksdt	||f|S | j tj
tjtjfkr| S | j tjtjfkrt| j t fdd| jD S | j tjkrtt| j t fdd| jD S | j tjkrVd}| j D ]6\}}|dkr"| | }n|| | 7 }q |dkrRtd td	S |S | j tjkrd}| j D ]6\}	}
|dkr|	 |
 }n||	 |
 9 }qr|dkrtd
 tdS |S | j tjkr>| j\}}}t|tr| }t fdd|D }t fdd| D }tt| j |||fS | j tjkr| jd	 }t|trl| }t fdd| jdd D }tt| j |f| S | j tjkrt fdd| jD }tt| j |S | j tjtjfkrtt| j | j S | j tj krH| j\}}}| }| }tt| j |||fS t!d| j  d| dS )zRecursively substitute symbols with values in symbols map.

        Symbols map is a dictionary of symbol-expression pairs.
        Nz$\A(@__f2py_PARENTHESIS_(\w+)_\d+@)\ZROUNDDIVSQUAREROUNDc                 3   s   | ]}|  V  qd S r]   
substituterm   symbols_mapr   r   rp   V  s   z"Expr.substitute.<locals>.<genexpr>c                 3   s   | ]}|  V  qd S r]   r   rm   r   r   r   rp   Y  s   z?substitute: empty TERMS expression interpreted as int-literal 0r   zAsubstitute: empty FACTORS expression interpreted as int-literal 1r   c                 3   s   | ]}|  V  qd S r]   r   r   r   r   r   rp   w  s     c                 3   s    | ]\}}||  fV  qd S r]   r   r   r   r   r   rp   x  s   c                 3   s   | ]}|  V  qd S r]   r   r   r   r   r   rp     s     c                 3   s   | ]}|  V  qd S r]   r   r   r   r   r   rp     s     zsubstitute method for z: )"r{   r   r!   r^   rematchr|   groupsas_arrayrq   r   r   r   r    r   r   rr   r%   r   r'   r   r   ri   r   r(   r#   rl   ry   r$   r"   r)   r*   r&   rz   )rH   r   r   mr   parenr   r   r   r   r   targetr   r   funcoperandsr   r   r   r   r   r   r   B  s    








 

zExpr.substitutec                    s  | f }|dk	r|S | j tjtjtjtjfkr:| S | j tjtjtjtj	fkr|t
t| j t fdd| jD S | j tjtjfkri }| j D ]V\}}|jf }t|tr|jf n|}||kr|| | }|||< qt
t| j |S | j tjkr| jd }t|tr<|jf n|}	t fdd| jd D }
t fdd| jd  D }t
t| j |	|
|fS | j tjkr| jd }t|tr|jf n|}t fd	d| jdd D }t
t| j |f| S | j tjtjfkrBt
t| j | jjf S | j tjkr| j\}}}|jf }|jf }t
t| j |||fS td
| j  dS )aB  Traverse expression tree with visit function.

        The visit function is applied to an expression with given args
        and kwargs.

        Traverse call returns an expression returned by visit when not
        None, otherwise return a new normalized expression with
        traverse-visit sub-expressions.
        Nc                 3   s    | ]}|j f V  qd S r]   traverserm   r   r   visitr   r   rp     s   z Expr.traverse.<locals>.<genexpr>r   c                 3   s    | ]}|j f V  qd S r]   r   rn   operandr  r   r   rp     s   r   c                 3   s(   | ] \}}||j f fV  qd S r]   r   r   r  r   r   rp     s   r   c                 3   s    | ]}|j f V  qd S r]   r   )rn   r   r  r   r   rp     s   ztraverse method for )r{   r   r   r   r   r!   r   r    r%   r"   r   r   rr   r|   r'   r(   r   r   rl   r#   ry   r$   r)   r*   r&   rz   )rH   r  r   r   resultr|   r`   ra   objr   r   Z
kwoperandsindicesr   r   r   r   r  r   r     sl    



zExpr.traversec                    s*   g }|f fdd	}|  | t|dkS )z&Check if self contains other.
        c                    s"   |r| S |  kr| d | S d S )Nr   )r   exprfoundr   r   r   r    s
    
zExpr.contains.<locals>.visitr   )r   rs   )rH   r   r
  r  r   r  r   contains  s    
zExpr.containsc                 C   s    t  }|fdd}| | |S )z3Return a set of symbols contained in self.
        c                 S   s   | j tjkr||  d S r]   )r{   r   r!   addr  r   r   r   r    s    zExpr.symbols.<locals>.visitsetr   )rH   r
  r  r   r   r   symbols  s    
zExpr.symbolsc                    s$   t  }|f fdd	 |   |S )zFReturn a set of expressions used as atoms in polynomial self.
        c                    s   | j tjkr&| jD ]}|  q| S | j tjtjfkr<d S | j tjkrt| jd t	r| jd t	j
kr| jd d   | S d S | j tjtjfkr| S ||  | j tjtjfkr| S d S Nr   r   )r{   r   r(   r|   r   r'   r   r#   rl   rK   rO   r   r   r  r$   )r	  r
  br  r   r   r    s     

z$Expr.polynomial_atoms.<locals>.visitr  )rH   r
  r   r  r   polynomial_atoms  s    
zExpr.polynomial_atomsc                 C   sz   |  |tdi}| | }| |tdi}t|| | \}}|tdkrrtd| d| d| d| d|  
||fS )zReturn a, b such that a * symbol + b == self.

        If self is not linear with respect to symbol, raise RuntimeError.
        r   r   znot a z-linear equation: r   r   z == )r   r   as_numer_denomRuntimeError)rH   symbolr  Zaxr   Zzeror   r   r   r   linear_solve  s    &zExpr.linear_solveN)*r   r	   r
   r   staticmethodr   r   rk   r}   r   r   r   r   r   r   r   r   rR   r\   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   r      sJ   B	
 )	
K8c                 C   s"  t | ts| S | jtjkri }| j D ]p\}}|dkr:q(|jtjkrZ|dkrZ|| }d}|jtjkr|j D ]\}}t||||  qpq(t||| q(t	|dkrt
dS t	|dkr| \\}}|dkr|S ttj|S | jtjkrd}i }| j D ]\}}|dkrq |jtjkrPt |trP|dkrP|||d   }d}|jtjtjfkr|dkr~||jd 9 }n*|dkr||jd | 9 }nt||| nf|jtjkr|dkrt |tr|j D ]\}	}
t||	|
|  qnt||| nt||| q t	|dks,|dkrDt |ts<tt
|S t	|dkr| \\}}|dkrp|}nttj|}|dkr|S ttj||iS |dkrttj|S ttjttj||iS | jtjkr| jd tjkr| jd \}}t|\}}t|\}}t |trDt |trDt||}|| ||  }}n|| d }}|jtjkr|jd tjkr|jd d | }|jd d | | }ttj||S |jtjkr|jd tjkr|jd d | | }|jd d | }ttj||S tt|j}t|j D ]\}}t|||  qi i  }}| D ](\}}|dkrb|||< n
| ||< qFtttj|| }tttj|| }|jtjtjfkr|jd dkr|S ttj||S | jtjkr| jd g}| jdd D ]}|d }|jtjkr|jtjkr|jd d dkr|jd d |jd d krt|jd dd |jd dd  t|jd |jd }||d< n
|| qt	|dkr|d S ttjt|S | jtj krt!t| j\}}}|jtjkr|jd r|S |S ttj |||fS | S )z7Normalize Expr and apply basic evaluation methods.
    r   r   Nr   z"')"rl   r   r{   r   r'   r|   r   r   rc   rs   r   r(   integer_typesr   r   r   rq   r#   rK   rN   as_term_coeffr   r   ry   r   r   r%   r   	as_stringr   r   rr   r"   r   )r  r_   trb   r   r   r   r  eZb1e1ZdividendZdivisorr   r   gr   r   lstrD   lastZnew_lastr   r   r   r   r   r   r     s    

$




 
  


$

$
r   c                 C   s\   t | trt| j| jS t | tr*t| S t | tr@tt	| S t | t
rXt
tt| S | S )z.Convert non-Expr objects to Expr objects.
    )rl   complexr   realimagr   r   ru   r  reprrr   r   r   r  r   r   r   r     s    



r   c                 C   s   t tj| S )zJReturn object as SYMBOL expression (variable or unparsed expression).
    )r   r   r!   r'  r   r   r   	as_symbol  s    r(  r-   c                 C   sh   t | trttj| |fS t | tr4ttj| |fS t | trT| jtjtjfkrT| S td|  ddS )z/Return object as INTEGER or REAL constant.
    cannot convert z to INTEGER or REAL constantN)	rl   rt   r   r   r   rv   r   r{   rP   r  r   r   r   r   r     s    


r   c                 C   sH   t | trttj| |fS t | tr4| jtjkr4| S td|  ddS )z'Return object as INTEGER constant.
    r)  z to INTEGER constantN)rl   rt   r   r   r   r{   rP   r*  r   r   r   
as_integer  s    

r+  c                 C   s   t | trttjt| |fS t | tr8ttj| |fS t | trx| jtjkrR| S | jtjkrxttjt| jd |fS t	d|  ddS )z$Return object as REAL constant.
    r   r)  z to REAL constantN)
rl   rt   r   r   r   rv   r{   r   r|   rP   r*  r   r   r   r     s    


r   r   c                 C   s   t tj| |fS )zBReturn object as STRING expression (string literal constant).
    )r   r   r   r*  r   r   r   r    s    r  c                 C   s   t | tr| f} ttj| S )z8Return object as ARRAY expression (array constant).
    )rl   r   r   r    r'  r   r   r   r     s    
r   c                 C   s   t tjt| t|fS )zDReturn object as COMPLEX expression (complex literal constant).
    )r   r   r   r   )r$  r%  r   r   r   r     s    r   c                 O   s.   t tj| ttt|tdd | D fS )zIReturn object as APPLY expression (function call, constructor, etc.)
    c                 s   s   | ]\}}|t |fV  qd S r]   r   r   r   r   r   rp     s     zas_apply.<locals>.<genexpr>)r   r   r#   rr   r   r   ry   r   )r   r   r   r   r   r   r     s
    r   c                 C   s   t tj| ||fS )z<Return object as TERNARY expression (cond?expr1:expr2).
    )r   r   r"   )r   r   r   r   r   r   
as_ternary  s    r,  c                 C   s   t tj| S )z-Return object as referencing expression.
    )r   r   r)   r	  r   r   r   as_ref  s    r.  c                 C   s   t tj| S )z/Return object as dereferencing expression.
    )r   r   r*   r-  r   r   r   as_deref  s    r/  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r<   r   r   r   r   r   as_eq  s    r1  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r=   r0  r   r   r   as_ne  s    r2  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r>   r0  r   r   r   as_lt  s    r3  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r?   r0  r   r   r   as_le  s    r4  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r@   r0  r   r   r   as_gt  s    r5  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   rA   r0  r   r   r   as_ge  s    r6  c                 C   s   t | trt| } | jtjkr"| S | jtjkrPttjtd| jd | jd iS | jtj	kr~ttjt
d| jd | jd iS ttj| diS tdt|  ddS )z+Return expression as TERMS expression.
    r   r   r)   to terms ExprN)rl   r   r   r{   r   r'   r   r+  r|   r   r   rP   r   r'  r   r   r   r     s    
""r   c                 C   s   t | trt| } | jtjkr"| S | jtjkr~t| jdkr~| j	 \\}}|dkrdttj|diS ttj|dt
|diS | jtjkr| jd tjkr| jd sttj| jd d d| jd d diS ttj| diS tdt|  ddS )z-Return expression as FACTORS expression.
    r   r   r   r   r)  r7  N)rl   r   r   r{   r   r(   r'   rs   r|   r   numberr#   rK   rN   rP   r   )r  r   r   r   r   r   r   +  s$    
(r   c                 C   s   t | trt| } | jtjkr8td| jd | jd fS | jtjkr^t	d| jd | jd fS | jtj
krt| jdkr| j \\}}||fS | jtjkr| jd tjkrt| jd d \}}ttj|| jd d |fS | dfS tdt|  ddS )z0Return expression as term-coefficient pair.
    r   r   r)  z to term and coeffN)rl   r   r   r{   r   r   r+  r|   r   r   r'   rs   r   r#   rK   rN   r  r   rP   r   )r  r   r   r  rb   r   r   r   r  @  s    
r  c                 C   sN  t | tr6t| } | jtjtjtjtjtj	tj
fkrB| tdfS | jtjkr| jd tjkr| jd stt| jd \}}|d |d  |d |d  fS | tdfS | jtjkrg g  }}| j D ]0\}}t|\}}|| }|| || qtdtd }}tt|D ]L}	||	 }tt|D ]}
|	|
kr2|||
 9 }q2||7 }|||	 9 }q|jtjtjfkr|jd dk r| |  }}||fS | jtjkr6tdtd }}| j D ]`\}}t|\}}|dkr||| 9 }||| 9 }n&|dk r|||  9 }|||  9 }q||fS tdt|  ddS )z+Return expression as numer-denom pair.
    r   r   r   r)  z to numer and denomN)rl   r   r   r{   r   r   r   r   r!   r$   r"   r   r#   r|   rK   rN   r   r  r'   r   r   r   rs   r(   rP   r   )r  ZnumersZdenomsr   r   nr_   r   r   ijr  r  ZbnumerZbdenomr   r   r   r  U  sT      


$

r  c                  c   s   d} | d7 } | V  qd S r  r   )counterr   r   r   _counter  s    r=  c                    sJ   i   fdd}t djdddd|| }d|ks6td	|ksBt| fS )
zgReplace quoted substrings of input string.

    Return a new string and a mapping of replacements.
    c                    s\   |   d d \}}|r$|d d }ddd|d  }| d| dt  d	}| |< |S )
Nr   r   ZSINGLEZDOUBLE)'"r   z@__f2py_QUOTES_r   @)r   COUNTER__next__)r   r   r   pr`   r_   r   r   repl  s    zeliminate_quotes.<locals>.replz+({kind}_|)({single_quoted}|{double_quoted})z
\w[\w\d_]*z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))r   single_quotedZdouble_quotedr?  r>  )r   subformatrq   )rD   rE  Znew_sr   rD  r   eliminate_quotes  s    
 rI  c                 C   sD   |  D ]6\}}|d|d }|r.|d7 }| ||| } q| S )z!Inverse of eliminate_quotes.
    Nr@  r   )r   findreplace)rD   r_   r`   ra   r   r   r   r   insert_quotes  s    rL  c                 C   s6  d\}}t | }dD ]2\}}| |}|dkr0q||k r|}|| }}q|dkrX| i fS |}| ||}| ||d || ||d |kr| ||d }|dkrhtd||  d| qhdd	d
dd| }d| dt  d}	| |t | | }
t| |t | d \}}|
||	< | d| |	 | |fS )zzReplace substrings of input that are enclosed in parenthesis.

    Return a new string and a mapping of replacements.
    )NN))(//)z()z{}z[]r   Nr   zMismatch of z parenthesis in r   r   CURLYr   )r   r   {rM  @__f2py_PARENTHESIS_r   r@  )rs   rJ  count
ValueErrorrA  rB  replace_parenthesis)rD   r   r   Zmn_iZleft_Zright_r:  r;  rC  r`   ra   r   r_   r   r   r   rT    s.    

$rT  c                 C   s    |  dst| | dd S )NrQ  r   r-   )
startswithrq   split)rD   r   r   r   _get_parenthesis_kind  s    rW  c                 C   sZ   |  D ]L\}}t|}tddddd| }tdddd	d| }| ||| | } q| S )
z$Inverse of replace_parenthesis.
    r   r   rP  rM  )r   r   rO  r   r   r   }rN  )r   rW  ry   rK  )rD   r_   r`   ra   rC  r   r   r   r   r   unreplace_parenthesis  s    rY  c                 C   s8   t |d| }t|tr|S td|  d| ddS )zCreate an expression from a string.

    This is a "lazy" parser, that is, only arithmetic operations are
    resolved, non-arithmetic operations are treated as symbols.
    rj   zfailed to parse `z` to Expr instance: got `r   N)_FromStringWorkerrk   rl   r   rS  )rD   rE   r   r   r   r   rF     s    
rF   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_Pairc                 C   s   || _ || _d S r]   r0  )rH   r   r   r   r   r   r}     s    z_Pair.__init__c                 C   s@   | j | j }}t|tr"||}t|tr6||}t||S r]   )r   r   rl   r   r   r[  )rH   r   r   r   r   r   r   r     s    



z_Pair.substitutec                 C   s    t | j d| j d| j dS r   )r   r   r   r   r   r   r   r   r     s    z_Pair.__repr__N)r   r	   r
   r}   r   r   r   r   r   r   r[    s   r[  c                   @   s4   e Zd ZejfddZdd Zdd Zddd	Zd
S )rZ  c                 C   s   d | _ d | _|| _d S r]   )original
quotes_maprE   rG   r   r   r   r}     s    z_FromStringWorker.__init__c                 C   s   t || jS r]   )rL  r]  )rH   rD   r   r   r   finalize_string  s    z!_FromStringWorker.finalize_stringc                 C   s   || _ t|\}| _| |S r]   )r\  rI  r]  process)rH   inpZunquotedr   r   r   rk     s    z_FromStringWorker.parser	  c                    s  t |ttfr*t| fdd|D S t |tsDtt||ft|\}| }fddd|krȈ|d} dkrt	|S  dkrt
|dkrt	| S td	  d
| td|}|r& dkst | \}}}	|}	|}	|}t|||S jtjkrFtd|tj}ntd|}|r| \}	}
}jtjkrd|
 d }
	|	|f\}	}tj|
jd}
ttj|
|	|fS td|}|r| \}}|}t|	|S td|}t
|dkr	|d pd}t|ddd |ddd D ]J\}}	|}| }|dkrp||7 }n|dks~t||8 }q>|S jtjkrd|krʈ|d}ttjt	|S tdjtjkr|n
|dd}t
|dkr|}jtjk	r"dd |D }	|d }t|ddd |ddd D ]F\}}	|}| }|dkr|||9 }n|dkst|| }qN|S |ds|d rtj tj!d!|d  }	|dd }t||S jtjk	rNd|krNtt"|d}	|d }|dd D ]}	|}|| }q0|S td"j#d#d$d%|}|r| \}}}|r|$ rt%|}t&t%||pd&S td'j#d(d)d$d*|}|r,| \}}}}|r|$ rt%|}|' }d+|krt(t)|d+d,|pd-S t(t)||p(d&S |j*kr`|d|+d. }t,j*| |p\dS |krt-|}	| |d/krdnd}|d/krt |tr|S |d0krt |tr|f}t.|S td1|}|r~| \}}}	|}	|dd2 d}t |ts*|f}|d/krht/d3d |D }td4d |D }t0|f||S |d5ksvt|| S td6|}|rt1|S 2|}t3d7|d8j4 d9 t1|S ):a  Parse string within the given context.

        The context may define the result in case of ambiguous
        expressions. For instance, consider expressions `f(x, y)` and
        `(x, y) + (a, b)` where `f` is a function and pair `(x, y)`
        denotes complex number. Specifying context as "args" or
        "expr", the subexpression `(x, y)` will be parse to an
        argument list or to a complex number, respectively.
        c                 3   s   | ]} | V  qd S r]   )r_  )rn   Zs_)contextrH   r   r   rp   )  s     z,_FromStringWorker.process.<locals>.<genexpr>c                    s*   t | ttfr t| t| S t|  S r]   )rl   listrr   r   r   rY  )r   )raw_symbols_maprestorer   r   rd  1  s    z*_FromStringWorker.process.<locals>.restore,r   r	  r   z&parsing comma-separated list (context=z): z\A([^?]+)[?]([^:]+)[:](.+)\Zz+\A(.+)\s*[.](eq|ne|lt|le|gt|ge)[.]\s*(.+)\Zz7\A(.+)\s*([=][=]|[!][=]|[<][=]|[<]|[>][=]|[>])\s*(.+)\Z.rj   z\A(\w[\w\d_]*)\s*[=](.*)\Zz((?<!\d[edED])[+-])r   r   r   N+r   z//z(?<=[@\w\d_])\s*([*]|/)**@__f2py_DOUBLE_STAR@c                 S   s   g | ]}| d dqS )ri  rh  )rK  r  r   r   r   r   ~  s   z-_FromStringWorker.process.<locals>.<listcomp>r   r   r   )r   r   z\A({digit_string})({kind}|)\Zz\d+z_(\d+|\w[\w\d_]*))Zdigit_stringr   r-   z7\A({significant}({exponent}|)|\d+{exponent})({kind}|)\Zz[.]\d+|\d+[.]\d*z[edED][+-]?\d+)Zsignificantr   r   r_   r     r@  r   r   z4\A(.+)\s*(@__f2py_PARENTHESIS_(ROUND|SQUARE)_\d+@)\Zr   c                 s   s$   | ]}t |tr|j|jfV  qd S r]   )rl   r[  r   r   r   r   r   r   rp     s    
c                 s   s   | ]}t |ts|V  qd S r]   )rl   r[  r   r   r   r   rp     s     
 r   z\A\w[\w\d_]*\Zzfromstring: treating z as symbol (original=r   )5rl   rb  rr   r   ru   rq   rT  striprV  r_  rs   r   rz   r   r   r   r,  rE   r   r   Ir+   rF   r   r   r&   r[  zipr%   r   rK  rU  r*   r)   reversedrH  isdigitrt   r+  rB   r   rv   r]  rJ  r  rW  r   ry   r   r(  r^  ri   r\  )rH   rD   ra  r   r   r   operr   r   r   r   r   keynamer   r  r{   r  r   r   r   r   r   r   r   r   )ra  rc  rd  rH   r   r_    s8   



   &


&









z_FromStringWorker.processN)r	  )	r   r	   r
   r   r   r}   r^  rk   r_  r   r   r   r   rZ    s   rZ  )r-   )r-   )r-   )r   )r   ):r   __all__r   rf   enumr   mathr   r   r   r+   rK   	ExceptionrP   rR   rt   r  rv   r   rc   UserWarningrd   ri   r   r   r   r(  r   r+  r   r  r   r   r   r,  r.  r/  r1  r2  r3  r4  r5  r6  r   r   r  r  r=  rA  rI  rL  rT  rW  rY  r   rF   r[  rZ  r   r   r   r   <module>   sn   	    ~ 





-+