a
    p=ic                     @   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   d/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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u 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u 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   s    
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 u 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J |tju rbt |tr.t|dks2J t |d tsDJ t |d ttfs^J |n|tju rt |trt|dksJ t |d tsJ t |d ttfsJ |nj|tj	u rt |trt|dksJ nB|tj
u r`t |trt|dksJ t |d tr<|d d d t|d d  dv s@J t |d ttfs J |n|tju rt|d us J n|tjtjfv rt |tsJ tdd |D s J |n\|tjtjfv rt |ts J n6|tju rTt |trt|dksJ t|d d us*J t |d ts>J t |d ts J n|tju rt |trzt|dks~J t|d d us J n|tju rt |trt|dks J n^|tjtjfv rt |ts J n:|tju rt |trt|dks J 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>       z Expr.__init__.<locals>.<genexpr>r,   z$unknown op or missing sanity check: )rl   r   r   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u 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v r&tt| j }n8| j tju 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ur&| jj|jjk S | jtjtjfv r\tt| j	
 tt|j	
 k S | jtju 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__  rq   zExpr.__le__c                 C   s
   | |k S r]   r   r~   r   r   r   __gt__  rq   zExpr.__gt__c                 C   s
   | |k  S r]   r   r~   r   r   r   __ge__  rq   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v 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	u rd
 fdd| jD }d	| d
 }tj}n| j tju rtj}t| j}n| j tju r| jd }| jd dkr| jd d | }tj}n\| j tju r:d
 fdd| jD }d| d }tj}n| j tju 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u rg }	g }
t| j D ]\}}d}|dkrp|jtj d}n tju r|tddv r|jtj d}d
|g| }nX|tddv 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u r8| j\}}}|tju r tju 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u r| jd } fd d| jdd! D }| dd
| d}tj}n| j tju r fd"d| jD }d#
|}tj}n| j tj u rz fd$d| jD \}}} tju rd	| d%| d&| d
}nb tj!u r6d	| d'| d(| d
}n< tj"u r\d)| d| d| d
}nt#d*| j  d+  tj}n| j tj$u rd,| jjtj% d }tj%}n| j tj&u rd-| jjtj% d }tj%}n| j tj'u rH| j\}}}|t(j)t(j*fv 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expfactornameargskwargsnumerdenomcondexpr1expr2ropleftrightr   rj   r   rI     s.   






















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u r| jtjtjfv r^t| jd |jd  t	| jd |jd S | jtj
u r| j\}}|j\}}t|| || S | jtju rt| jt| j}|j D ]\}}t|j|| qt|S | jtj
u r|jtjtjfv r| t| S | jtjtjfv r4|jtj
u r4t| | S | jtju rf|jtju rf| t|| jd d S | jtju r|jtju 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u rN| jtjtjfv r`t| jd |jd  t	| jd |jd S | jtj
u r| j\}}|j\}}t|| ||  || ||  S | jtju rt| jt| j}|j D ]\}}t|j|| qt|S | jtju rNt| ji }| j D ]6\}	}
|j D ] \}}t|j|	| |
|  q qt|S | jtj
u r||jtjtjfv r|| t| S |jtj
u r| jtjtjfv rt| | S | jtju r|jtju r| t|| jd d S | jtju r|jtju rt| |jd d| S | jtju r(| t| S |jtju 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u r|jd }|dkr8tdS |dkrD| S |dkr| jtju 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 | gtt|R i tdd | D S )Nc                 s   s   | ]\}}|t |fV  qd S r]   r   r   r   r   r   rp   6  rq   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u rh | }|du r"| S td| j}|rd| \}}|dv rPt|S |dksdJ ||f|S | j tj	tj
tjfv r| S | j tjtjfv rt| j t fdd| jD S | j tju rtt| j t fdd| jD S | j tju rVd}| j D ]6\}}|du r"| | }n|| | 7 }q |du rRtd td	S |S | j tju rd}| j D ]6\}	}
|du r|	 |
 }n||	 |
 9 }qr|du rtd
 tdS |S | j tju r>| j\}}}t|tr| }t fdd|D }t fdd| D }tt| j |||fS | j tju r| jd	 }t|trl| }t fdd| jdd D }tt| j |f| S | j tju rt fdd| jD }tt| j |S | j tjtjfv rtt| j | j S | j tju 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  rq   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     rq   c                 3   s   | ]}|  V  qd S r]   r   r   r   r   r   rp     rq   zsubstitute method for z: )!r{   r   r!   r^   rematchr|   groupsas_arrayr   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  | g R i }|dur"|S | j tjtjtjtjfv r@| S | j tjtjtjtj	fv rt
t| j t fdd| jD S | j tjtjfv ri }| j D ]d\}}|jg R i }t|tr|jg R i n|}||v r || | }|||< qt
t| j |S | j tju r| jd }t|trV|jg R i n|}	t fdd| jd D }
t fdd| jd  D }t
t| j |	|
|fS | j tju r.| jd }t|tr|jg R i n|}t fd	d| jdd D }t
t| j |f| S | j tjtjfv rht
t| j | jjg R i S | j tju r| j\}}}|jg R i }|jg R i }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 g R i V  qd S r]   traverserm   r   r   visitr   r   rp     s   z Expr.traverse.<locals>.<genexpr>r   c                 3   s&   | ]}|j g R i V  qd S r]   r   rn   operandr  r   r   rp     s   r   c                 3   s.   | ]&\}}||j g R i fV  qd S r]   r   r   r  r   r   rp     s   r   c                 3   s&   | ]}|j g R i 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u 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u r&| jD ]}|  q| S | j tjtjfv r<d S | j tju rt| jd t	r| jd t	j
u r| jd d   | S d S | j tjtjfv r| S ||  | j tjtjfv 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  axr   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u ri }| j D ]p\}}|dkr:q(|jtju rZ|dkrZ|| }d}|jtju 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u rd}i }| j D ]\}}|dkrq |jtju rPt |trP|dkrP|||d   }d}|jtjtjfv r|dkr~||jd 9 }n*|dkr||jd | 9 }nt||| nf|jtju r|dkrt |tr|j D ]\}	}
t||	|
|  qnt||| nt||| q t	|dks,|dkrDt |ts<J 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u r| jd tju r| jd \}}t|\}}t|\}}t |trDt |trDt||}|| ||  }}n|| d }}|jtju r|jd tju r|jd d | }|jd d | | }ttj||S |jtju r|jd tju 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v r|jd dkr|S ttj||S | jtju r| jd g}| jdd D ]}|d }|jtju r|jtju r|jd d dv 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u rt t| j\}}}|jtju 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   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  e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v 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u 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u rR| S | jtju 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     rq   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    r1  c                 C   s   t tj| S )z/Return object as dereferencing expression.
    )r   r   r*   r0  r   r   r   as_deref  s    r2  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r<   r   r   r   r   r   as_eq  s    r4  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r=   r3  r   r   r   as_ne  s    r5  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r>   r3  r   r   r   as_lt  s    r6  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r?   r3  r   r   r   as_le  s    r7  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   r@   r3  r   r   r   as_gt  s    r8  c                 C   s   t tjtj| |fS r]   )r   r   r&   r+   rA   r3  r   r   r   as_ge  s    r9  c                 C   s   t | trt| } | jtju r"| S | jtju rPttjtd| jd | jd iS | jtj	u 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u r"| S | jtju 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u r| jd tju 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,  r:  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u r8td| jd | jd fS | jtju r^t	d| jd | jd fS | jtj
u rt| jdkr| j \\}}||fS | jtju r| jd tju 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v rB| tdfS | jtju r| jd tju r| jd stt| jd \}}|d |d  |d |d  fS | tdfS | jtju 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v r|jd dk r| |  }}||fS | jtju 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  sR     


$

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|vs6J d	|vsBJ | 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SINGLE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_quotedrC  rB  )r   subformat)rD   rI  Znew_sr   rH  r   eliminate_quotes  s    
rM  c                 C   sD   |  D ]6\}}|d|d }|r.|d7 }| ||| } q| S )z!Inverse of eliminate_quotes.
    NrD  r   )r   findreplace)rD   r_   r`   ra   r   r   r   r   insert_quotes  s    rP  c                 C   s6  d\}}t | }dD ]2\}}| |}|dkr0q||k r|}|| }}q|du 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   {rQ  @__f2py_PARENTHESIS_r   rD  )rs   rN  count
ValueErrorrE  rF  replace_parenthesis)rD   r   r   Zmn_iZleft_Zright_r=  r>  rG  r`   ra   r   r_   r   r   r   rX    s.    

$rX  c                 C   s    |  dsJ | | dd S )NrU  r   r-   )
startswithsplit)rD   r   r   r   _get_parenthesis_kind  s    r[  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   rT  rQ  )r   r   rS  r   r   r   }rR  )r   r[  ry   rO  )rD   r_   r`   ra   rG  r   r   r   r   r   unreplace_parenthesis  s    r]  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   rW  )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]   r3  )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 )r^  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]   )rP  ra  )rH   rD   r   r   r   finalize_string  s    z!_FromStringWorker.finalize_stringc                 C   s   || _ t|\}| _| |S r]   )r`  rM  ra  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sDJ t||ft|\}| }fddd|v rȈ|d} dkrt|S  dkrt	|dkrt
| S td	  d
| td|}|r& dksJ  | \}}}|}|}|}t|||S jtju rFtd|tj}ntd|}|r| \}	}
}jtju 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~J ||8 }q>|S jtju rd|v rʈ|d}ttjt|S tdjtju r|n
|dd}t	|dkr|}jtjur"dd |D }|d }t|ddd |ddd D ]F\}}|}| }|dkr|||9 }n|dksJ || }qN|S |ds|d rtjtj d!|d  }|dd }t||S jtjurNd|v 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+|v rt't(|d+d,|pd-S t't(||p(d&S |j)v r`|d|*d. }t+j)| |p\dS |v rt,|}| |d/krdnd}|d/krt |tr|S |d0v rt |tr|f}t-|S td1|}|r| \}}}|}|dd2 d}t |ts*|f}|d/krnt.d3d |D }td4d |D }t/|g|R i |S |d5ks|J || S td6|}|rt0|S 1|}t2d7|d8j3 d9 t0|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]   )rc  )rn   Zs_)contextrH   r   r   rp   )  rq   z,_FromStringWorker.process.<locals>.<genexpr>c                    s*   t | ttfr t| t| S t|  S r]   )rl   listrr   r   r   r]  )r   )raw_symbols_maprestorer   r   rh  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 )rm  rl  )rO  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      rD  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     rq   r   z\A\w[\w\d_]*\Zzfromstring: treating z as symbol (original=r   )4rl   rf  rr   r   ru   rX  striprZ  rc  rs   r   rz   r   r   r   r/  rE   r   r   Ir+   rF   r   r   r&   r_  zipr%   r   rO  rY  r*   r)   reversedrL  isdigitrt   r.  rB   r   rv   ra  rN  r  r[  r   ry   r   r+  rb  ri   r`  )rH   rD   re  r   r   r   operr   r   r   r   r   keynamer   r  r{   r  r   r   r   r   r   r   r   r   )re  rg  rh  rH   r   rc    s2   



&


&









z_FromStringWorker.processN)r	  )	r   r	   r
   r   r   r}   rb  rk   rc  r   r   r   r   r^    s   r^  )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/  r1  r2  r4  r5  r6  r7  r8  r9  r   r   r  r  r@  rE  rM  rP  rX  r[  r]  r   rF   r_  r^  r   r   r   r   <module>   sn   	    ~ 





-+