U
    ½mœd8O  ã                   @   s˜  d dl mZ dgZd dlZzd dlmZ W n  ek
rJ   d dlmZ Y nX d dlZd dl	Z
d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZ d d	lmZ G d
d„ deƒZdd„ Zdd„ Zedddƒeddd ƒedddƒedddƒedddƒedddƒedddƒedddƒgZddgZ dd„ Z!dd„ Z"d d!„ Z#d"d#„ Z$G d$d%„ d%eƒZ%d&d'„ Z&d(d)„ Z'd*d+„ Z(d,d-d.d/d0d1d2d3d4d5g
Z)d6d7„ Z*dS )8é    )Úprint_functionÚLinearConstraintN)ÚMapping)Ú
PatsyError)ÚOrigin)Úatleast_2d_column_defaultÚrepr_pretty_delegateÚrepr_pretty_implÚno_picklingÚassert_no_pickling)ÚTokenÚOperatorÚinfix_parse)Ú_parsing_error_testc                   @   s6   e Zd ZdZd	dd„ZeZdd„ ZeZ	e
dd„ ƒZdS )
r   ap  A linear constraint in matrix form.

    This object represents a linear constraint of the form `Ax = b`.

    Usually you won't be constructing these by hand, but instead get them as
    the return value from :meth:`DesignInfo.linear_constraint`.

    .. attribute:: coefs

       A 2-dimensional ndarray with float dtype, representing `A`.

    .. attribute:: constants

       A 2-dimensional single-column ndarray with float dtype, representing
       `b`.

    .. attribute:: variable_names

       A list of strings giving the names of the variables being
       constrained. (Used only for consistency checking.)
    Nc                 C   sÞ   t |ƒ| _t tj|td�¡| _|d kr>tj| jjd td�}tj|td�}t	|ƒ| _
| j
jdksr| j
jd dkrztdƒ‚| jjdksš| jjd t|ƒkr¢tdƒ‚| jjd dkrºtdƒ‚| jjd | j
jd krÚtdƒ‚d S )	N©Údtyper   é   é   z1constants is not (convertible to) a column matrixzwrong shape for coefsz/must have at least one row in constraint matrixz*shape mismatch between coefs and constants)ÚlistÚvariable_namesÚnpZ
atleast_2dÚasarrayÚfloatÚcoefsÚzerosÚshaper   Ú	constantsÚndimÚ
ValueErrorÚlen)Úselfr   r   r   © r!   úI/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/patsy/constraint.pyÚ__init__2   s    

 zLinearConstraint.__init__c                 C   s    |rt ‚t|| | j| j| jgƒS ©N)ÚAssertionErrorr	   r   r   r   )r    ÚpÚcycler!   r!   r"   Ú_repr_pretty_C   s    ÿzLinearConstraint._repr_pretty_c                 C   sf   |st dƒ‚|d j}|D ]}|j|krt dƒ‚qt dd„ |D ƒ¡}t dd„ |D ƒ¡}| |||ƒS )a  Create a new LinearConstraint by ANDing together several existing
        LinearConstraints.

        :arg constraints: An iterable of LinearConstraint objects. Their
          :attr:`variable_names` attributes must all match.
        :returns: A new LinearConstraint object.
        zno constraints specifiedr   zvariable names don't matchc                 S   s   g | ]
}|j ‘qS r!   )r   ©Ú.0Úcr!   r!   r"   Ú
<listcomp>Y   s     z,LinearConstraint.combine.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r!   )r   r)   r!   r!   r"   r,   Z   s     )r   r   r   Z	row_stack)ÚclsÚconstraintsr   Ú
constraintr   r   r!   r!   r"   ÚcombineJ   s    	


zLinearConstraint.combine)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r   Ú__repr__r(   r
   Ú__getstate__Úclassmethodr0   r!   r!   r!   r"   r      s   
c                  C   sÚ  zddl m}  W n  tk
r0   ddlm}  Y nX tddgddgƒ}|jddgksVt‚| |jddggƒ | |jdggƒ tddgddgddggdd	gƒ}| |jddgddggƒ | |jdgd	ggƒ |jj	t
 	t¡ksÚt‚|jj	t
 	t¡ksðt‚td
gdggƒ}| |jdggƒ dd l}| ttd
gddgg¡ | ttd
gdggg¡ | ttd
gddggddg¡ | ttd
dgddggddg¡ | ttd
gdggg g¡ | ttd
dgg ¡ | ttd
dgt
 d¡¡ t|ƒ d S )Nr   ©Úassert_equalZfooÚbarr   r   é   é
   é   Úaé   Úb©r   r   )Únumpy.testingr9   ÚImportErrorÚnumpy.testing.utilsr   r   r%   r   r   r   r   r   ÚpytestÚraisesr   r   r   )r9   ÚlcrE   r!   r!   r"   Útest_LinearConstraint]   s4      ÿrH   c                  C   sâ   t  t ddgddgƒt ddgddgdgƒg¡} | jddgks@t‚zddlm} W n  tk
rp   ddlm} Y nX || jddgddggƒ || j	dgdggƒ dd l
}| tt jg ¡ | tt jt dgdgƒt dgdgƒg¡ d S )Nr>   r@   r   r   r8   )r   r0   r   r%   rB   r9   rC   rD   r   r   rE   rF   r   )Úcombr9   rE   r!   r!   r"   Útest_LinearConstraint_combine‚   s    ÿ
ÿrJ   ú,r   iœÿÿÿú=ú+r   éd   ú-Ú*éÈ   ú/ÚNUMBERÚVARIABLEc                    s   ‡ ‡fdd„}|S )Nc                    s.   ˆdkr|}nˆ}t |tˆ f| j ¡ žŽ |ƒS )NÚ__OP__)r   r   ÚmatchÚspan)ÚscannerZtoken_stringZactual_type©ÚstringÚtyper!   r"   Ú
make_token¤   s    þz _token_maker.<locals>.make_tokenr!   )r[   rZ   r\   r!   rY   r"   Ú_token_maker£   s    r]   c                 C   sÖ   d}d}d  dd„ tD ƒ¡}d}d}t|tdd	�}d  d
d„ |D ƒ¡}|ttj| ƒf|ttj| ƒf|td| ƒf|td| ƒf|td| ƒf|d fg}t 	|¡}	|	 
| ¡\}
}|rÒt| ƒt|ƒ }tdt| ||d ƒƒ‚|
S )Nz\(z\)ú|c                 S   s   g | ]}t  |j¡‘qS r!   )ÚreÚescapeÚ
token_type)r*   Úopr!   r!   r"   r,   ±   s     z(_tokenize_constraint.<locals>.<listcomp>z&[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?z\s+T)ÚkeyÚreversec                 S   s   g | ]}t  |¡‘qS r!   )r_   r`   )r*   Únr!   r!   r"   r,   ·   s     rU   rT   rS   z unrecognized token in constraintr   )ÚjoinÚ_opsÚsortedr   r]   r   ÚLPARENÚRPARENr_   ÚScannerÚscanr   r   )rZ   r   Z	lparen_reZ	rparen_reZop_reZnum_reZwhitespace_reZvariable_reÚlexiconrX   ÚtokensÚleftoverÚoffsetr!   r!   r"   Ú_tokenize_constraint®   s,    ú	
ÿrq   c               
   C   sv  d} t | dddgƒ}ddtjddd	fd
ddtjdddfddg	}t||ƒD ]X\}}t|tƒs^t‚|j|d kspt‚|jt	| |d |d ƒksŽt‚|j
|d ksHt‚qHdd l}| tt ddg¡ t ddgƒ ddgddgfD ]:}t d|ƒ}t|ƒdksöt‚dd„ |D ƒdddgksØt‚qØt ddgƒ}t|ƒdk�s2t‚dd„ |D ƒdd d!d"gk�sRt‚d#d„ |D ƒd$d dd"gk�srt‚d S )%Nz2 * (a + b) = qr>   r@   Úq)rS   r   r   Ú2)rP   r   r;   rP   r?   é   ú()rT   rt   é   r>   )rM   é   é   rM   )rT   é	   r<   r@   r<   é   ú))rL   é   é   rL   )rT   é   é   rr   r   r   r   r;   z1 + @bz@bZaaza aa ac                 S   s   g | ]
}|j ‘qS r!   ©Úextra©r*   Útr!   r!   r"   r,   ç   s     z-test__tokenize_constraint.<locals>.<listcomp>z2 * a[1,1],za[1,1]c                 S   s   g | ]
}|j ‘qS r!   )r[   r‚   r!   r!   r"   r,   ì   s     rS   rP   rT   rK   c                 S   s   g | ]
}|j ‘qS r!   r€   r‚   r!   r!   r"   r,   í   s     rs   )rq   r   ri   rj   ÚzipÚ
isinstancer%   r[   Úoriginr   r�   rE   rF   r   r   )Úcodern   Ú	expectedsÚgotÚexpectedrE   Únamesr!   r!   r"   Útest__tokenize_constraintË   s8    ø	
 rŒ   c                 C   s   t t| |ƒttƒS r$   )r   rq   rg   Ú_atomic)rZ   r   r!   r!   r"   Úparse_constraintï   s    
 ÿrŽ   c                   @   sv   e Z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ddd„ZdS )Ú_EvalConstraintc                 C   sD   || _ t|ƒ| _| j| j| j| j| j| j| j	| j
| j| jdœ
| _d S )N)
)rT   r   )rS   r   )rM   r   )rO   r   )rM   r   )rO   r   )rP   r   )rR   r   )rL   r   )rK   r   )Ú_variable_namesr   Ú_NÚ_eval_variableÚ_eval_numberÚ_eval_unary_plusÚ_eval_unary_minusÚ_eval_binary_plusÚ_eval_binary_minusÚ_eval_binary_multiplyÚ_eval_binary_divÚ_eval_binary_eqÚ_eval_binary_commaÚ	_dispatch)r    r   r!   r!   r"   r#   ô   s    
öz_EvalConstraint.__init__c                 C   s   t  |d | j… dk¡S ©Nr   )r   Úallr‘   )r    r   r!   r!   r"   Úis_constant  s    z_EvalConstraint.is_constantc                 C   s2   |j j}tj| jd ftd�}d|| j |¡< |S )Nr   r   )Útokenr�   r   r   r‘   r   r�   Úindex)r    ÚtreeÚvarr   r!   r!   r"   r’     s    z_EvalConstraint._eval_variablec                 C   s*   t j| jd ftd�}t|jjƒ|d< |S )Nr   r   éÿÿÿÿ)r   r   r‘   r   r    r�   )r    r¢   r   r!   r!   r"   r“     s    z_EvalConstraint._eval_numberc                 C   s   |   |jd ¡S r�   ©ÚevalÚargs©r    r¢   r!   r!   r"   r”     s    z _EvalConstraint._eval_unary_plusc                 C   s   d|   |jd ¡ S )Nr¤   r   r¥   r¨   r!   r!   r"   r•     s    z!_EvalConstraint._eval_unary_minusc                 C   s    |   |jd ¡|   |jd ¡ S ©Nr   r   r¥   r¨   r!   r!   r"   r–      s    z!_EvalConstraint._eval_binary_plusc                 C   s    |   |jd ¡|   |jd ¡ S r©   r¥   r¨   r!   r!   r"   r—   #  s    z"_EvalConstraint._eval_binary_minusc                 C   sF   |   |jd ¡}|   |jd ¡}|  |¡s:td|jd ƒ‚||d  S )Nr   r   z1Can't divide by a variable in a linear constraintr¤   ©r¦   r§   rŸ   r   ©r    r¢   ÚleftÚrightr!   r!   r"   r™   &  s    
ÿz _EvalConstraint._eval_binary_divc                 C   sZ   |   |jd ¡}|   |jd ¡}|  |¡r6|d | S |  |¡rL||d  S td|ƒ‚d S )Nr   r   r¤   z=Can't multiply one variable by another in a linear constraintrª   r«   r!   r!   r"   r˜   .  s    

ÿz%_EvalConstraint._eval_binary_multiplyc                 C   sÔ   t |jƒ}g }t|ƒD ]8\}}|jdkr| | j|dd�¡ |jd|  ||< q|  |d ¡}|  |d ¡}|d | j… |d | j…  }t |dk¡r t	d|ƒ‚|d  |d  }	t
| j||	ƒ}
| |
¡ t
 |¡S )NrL   T©r/   r   r   z!no variables appear in constraintr¤   )r   r§   Ú	enumerater[   Úappendr¦   r‘   r   rž   r   r   r�   r0   )r    r¢   r§   r.   ÚiÚargr¬   r­   r   Zconstantr/   r!   r!   r"   rš   9  s    



z_EvalConstraint._eval_binary_eqc                 C   s6   | j |jd dd�}| j |jd dd�}t ||g¡S )Nr   Tr®   r   )r¦   r§   r   r0   r«   r!   r!   r"   r›   M  s    z"_EvalConstraint._eval_binary_commaFc                 C   s°   |j t|jƒf}|| jkst‚| j| |ƒ}|r”t|tƒr>|S |j| jd ksRt‚t	 
|d | j… dk¡rttd|ƒ‚t| j|d | j… |d  ƒS nt|tƒr¨td|ƒ‚|S d S )Nr   r   z#term is constant, with no variablesr¤   zunexpected constraint object)r[   r   r§   rœ   r%   r…   r   Úsizer‘   r   rž   r   r�   )r    r¢   r/   rc   Úvalr!   r!   r"   r¦   R  s$    
ÿþ

z_EvalConstraint.evalN)F)r1   r2   r3   r#   rŸ   r’   r“   r”   r•   r–   r—   r™   r˜   rš   r›   r¦   r!   r!   r!   r"   r�   ó   s   r�   c                 C   sÒ  t | tƒr*| j|kr&td| j|f ƒ‚| S t | tƒrötjt| ƒt|ƒftd�}t t| ƒ¡}t	ƒ }t
t | ¡ƒD ]x\}\}}||kr�| |¡}n t |tjƒr¢|}ntd|f ƒ‚||krÊtd|| f ƒ‚| |¡ d|||f< |||< qpt|||ƒS t | tƒ�r| g} t | tƒ�r„| �r„t | d tƒ�r„g }	| D ]F}
t |
tƒ�sPtd|
f ƒ‚t|
|ƒ}t|ƒ}|	 |j|dd	�¡ �q2t |	¡S t | tƒ�rºt| ƒd
k�r¦tdƒ‚| \}}t|||ƒS tj| td�}t||ƒS )zaThis is the internal interface implementing
    DesignInfo.linear_constraint, see there for docs.z?LinearConstraint has wrong variable_names (got %r, expected %r)r   z#unrecognized variable name/index %rzduplicated constraint on %rr   r   zexpected a string, not %rTr®   r   z#constraint tuple must have length 2)r…   r   r   r   r   r   r   r   r   Úsetr¯   ÚsixÚ	iteritemsr¡   Úinteger_typesÚaddÚstrr   rŽ   r�   r°   r¦   r0   Útupler   )Zconstraint_liker   r   r   Úusedr±   ÚnameÚvalueÚidxr.   r‡   r¢   Z	evaluatorZcoefr!   r!   r"   Úlinear_constrainth  sh    

ÿþ
ÿÿÿ

ÿþ

rÀ   c                 C   s²   zddl m} W n  tk
r0   ddlm} Y nX t| |ƒ}td|ƒ t|||ƒ}td|ƒ ||j|jƒ ||j|jƒ ||j	|j	ƒ ||jj
t 
t¡ƒ ||j	j
t 
t¡ƒ d S )Nr   r8   r‰   rŠ   )rB   r9   rC   rD   rÀ   Úprintr   r   r   r   r   r   r   )ÚinputÚvarnamesr   r   r9   r‰   rŠ   r!   r!   r"   Ú_check_lincon¦  s    


rÄ   c                  C   sØ  dd l } ddlm} t}|tddgddgƒddgddggdggƒ |  tttddgddgƒddg¡ |ddiddgddggdggƒ ||dd	gƒddgddgddggdgdggƒ ||dd	gƒddgddgddggdgdggƒ |ddiddgddggdggƒ ||d
dgƒddgddgddggdgdggƒ ||ddgƒddgddgddggdgdggƒ |  ttddiddg¡ |  ttdddœddg¡ |t 	ddg¡ddgddggdggƒ |t 	ddgddgg¡ddgddgddggdgdggƒ |dddgddggdggƒ |dddgddggdggƒ |dddgddggdggƒ |dddgddggdggƒ |dddgddgddggdgdggƒ |dddgddgddggdgdggƒ |ddgddgddgddggdgdggƒ |  ttdddigddg¡ |dddgddggdggƒ |dddgddggdggƒ |dddgddgddggdgdggƒ |dddgddgddgddggdgdgdggƒ |dddgddggdggƒ |d ddgddggdggƒ |d!ddgddggdggƒ |d"ddgddgddggdgdggƒ |d#ddgddgddggdgdggƒ |d$ddd%gdddgdddgdddggdgdgdggƒ |d&dd'gddggdggƒ |d(d)gd*gfddgd(d)ggd*ggƒ |d(d)gd)d+ggd*gd,ggfddgd(d)gd)d+ggd*gd,ggƒ |  ttddgdgdgfddg¡ |  ttddgfddg¡ |d(d)gddgd(d)ggdggƒ |d(d)gd)d+ggddgd(d)gd)d+ggdgdggƒ |t 	d(d)g¡ddgd(d)ggdggƒ |t 	d(d)gd)d+gg¡ddgd(d)gd)d+ggdgdggƒ |  ttd ddg¡ d S )-Nr   )ÚOrderedDictr>   r@   r   r;   r   )r>   r   )r@   r;   rA   )r   r;   rr   )r>   r   r?   rt   za = 2za - 2z	a + 1 = 3z	a + b = 3za = 2, b = 3zb = 3, a = 2zb = 3z#2 * (a + b/3) + b + 2*3/4 = 1 + 2*3gªªªªªªú?g      @z+2 * -aéþÿÿÿza - b, a + b = 2r¤   za = 1, a = 2, a = 3za * 2z-a = 1z(2 + a - a) * bz	a = 1 = bza = (1 = b)za = 1, a = b = cr+   z	a + 1 = 2za + 1r<   r=   é   é(   é#   )
rE   Zpatsy.compatrÅ   rÄ   r   rF   r   rÀ   r   Úarray)rE   rÅ   rƒ   r!   r!   r"   Útest_linear_constraint¶  s˜    *þ   
ÿ  
ÿ .  
ÿ&8&&*
 ÿ&
 ÿ&& ÿ&" 
ÿ ÿ 2& 
ÿrË   z	a + <f>ooza = 1, <1 = 1>, b = 1za = 1, <b * 2 - b + (-2/2 * b)>za = 1, <1>, b = 2za = 1, <2 * b = b + b>, cza + <a * b> + cza + 2 / <b> + cza = 1, 2 * <(a = b)>, cza = 1, a + <(a = b)>, cza = 1, <(a, b)> + 2, cc                  C   s   dd„ } t | tƒ d S )Nc                 S   s   t | dddgƒS )Nr>   r@   r+   )rÀ   )Zbad_coder!   r!   r"   Údoit  s    ztest_eval_errors.<locals>.doit)r   Ú_parse_eval_error_tests)rÌ   r!   r!   r"   Útest_eval_errors  s    rÎ   )+Ú
__future__r   Ú__all__r_   Úcollections.abcr   rC   Úcollectionsr¶   Únumpyr   Zpatsyr   Zpatsy.originr   Z
patsy.utilr   r   r	   r
   r   Zpatsy.infix_parserr   r   r   Zpatsy.parse_formular   Úobjectr   rH   rJ   rg   r�   r]   rq   rŒ   rŽ   r�   rÀ   rÄ   rË   rÍ   rÎ   r!   r!   r!   r"   Ú<module>   s\   A%







õ$u>Nò