U
    ½mœdËW  ã                U   @   s8  d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZ d	d
dgZG dd	„ d	eƒZeg ƒZG dd„ deƒZdd„ ZG dd
„ d
eƒZdd„ Zdd„ ZG dd„ deƒ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+G d8d9„ d9eƒZ,d:g fd:g fd:g fd:d;gfd:g fd<g fd<g fd:g fd:g fd<g fd:g fd<g fd:g fd<g fd:d;gfd<d;gfd<d;gfd:d;gfd:g fd:d;d=gfd:d;d=gfd:d;d=gfd:d;d=gfd:d;d=gfd:d;gfd:d;d=gfd:d;d>gfd:d;gfd:d;d?d@gfd:d;dAgfd:dBgfd:dBgfd:dBdCgfd:dCdDgfd:dBgfd:d@dCdBgfd:dCgfd:d=dDdCgfd:g fd:g fd:g fd:g fd:d;d=dBgfd:d;d=dBgfd:d;d=d@dBdCgfd:d;d=d@dCdDgfd:d;d=dBgfd:d@dCd;d=dBgfd:d;d@dCgfd:d=dDd;d@dCgfd:d;dBgfd:d;d=dEgfd:d=dDd;dCgfd:d;dBdCgfd:d;gfd:d;d=d@dFdBdCdGdDdHdIg
fd:d;d=d@dFdBdCdGdDdHdIdEdJdKdLgfd:d;gfd:d;d=gfd:d;d=dBgfd<d;d=dBgfd<g fd:d;d=gfd:g d:d;d=gfd<dMgd:d;d=gfd<dMgd:d;d=gfd<dMdNdOgd:d;d=gfd<g d:g fd:dMgd:d;d=gfd:d;d=d@dDgfd:d;d=dBd@gfd:d=dBgfd:d;d=dDgfd:d;dBd@gfd:d;dDdEgfd:dBd@dEgfd:g fd<g fd:g fd<g fd:d;gfd:d;gfd:d;gfd<g fdPœTZ-dQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsg#Z.dtdu„ Z/dvdw„ Z0dxdy„ Z1dzd{„ Z2d|d}„ Z3dS )~é    )Úprint_functionN©Ú
PatsyError)Ú	ParseNodeÚTokenÚparse_formula)ÚEvalEnvironmentÚ
EvalFactor)Úuniqueify_list)Úrepr_pretty_delegateÚrepr_pretty_impl)Úno_picklingÚassert_no_picklingÚTermÚ	ModelDescÚ	INTERCEPTc                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ ZeZ	d
d„ Z
dd„ ZeZdS )r   a˜  The interaction between a collection of factor objects.

    This is one of the basic types used in representing formulas, and
    corresponds to an expression like ``"a:b:c"`` in a formula string.
    For details, see :ref:`formulas` and :ref:`expert-model-specification`.

    Terms are hashable and compare by value.

    Attributes:
    
    .. attribute:: factors

       A tuple of factor objects.
    c                 C   s   t t|ƒƒ| _d S ©N)Útupler
   Úfactors)Úselfr   © r   úC/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/patsy/desc.pyÚ__init__+   s    zTerm.__init__c                 C   s   t |tƒot|jƒt| jƒkS r   )Ú
isinstancer   Ú	frozensetr   ©r   Úotherr   r   r   Ú__eq__.   s    
ÿzTerm.__eq__c                 C   s
   | |k S r   r   r   r   r   r   Ú__ne__2   s    zTerm.__ne__c                 C   s   t tt| jƒfƒS r   )Úhashr   r   r   ©r   r   r   r   Ú__hash__5   s    zTerm.__hash__c                 C   s    |rt ‚t|| t| jƒgƒ d S r   )ÚAssertionErrorr   Úlistr   ©r   ÚpÚcycler   r   r   Ú_repr_pretty_9   s    zTerm._repr_pretty_c                 C   s$   | j rd dd„ | j D ƒ¡S dS dS )z+Return a human-readable name for this term.ú:c                 S   s   g | ]}|  ¡ ‘qS r   )Úname)Ú.0Úfr   r   r   Ú
<listcomp>@   s     zTerm.name.<locals>.<listcomp>Ú	InterceptN)r   Újoinr    r   r   r   r)   =   s    z	Term.nameN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r   Ú__repr__r'   r)   r   Ú__getstate__r   r   r   r   r      s   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_MockFactorc                 C   s
   || _ d S r   ©Ú_name)r   r)   r   r   r   r   I   s    z_MockFactor.__init__c                 C   s   | j S r   r6   r    r   r   r   r)   L   s    z_MockFactor.nameN)r/   r0   r1   r   r)   r   r   r   r   r5   H   s   r5   c                  C   s¼   t dddgƒjdkst‚t ddgƒt ddgƒks4t‚tt ddgƒƒtt ddgƒƒksXt‚tdƒ} tdƒ}t | |gƒ ¡ dks€t‚t || gƒ ¡ dks˜t‚t g ƒ ¡ dks¬t‚tt g ƒƒ d S )	Né   é   )r8   r9   ÚaÚbúa:bzb:ar-   )r   r   r"   r   r5   r)   r   )Úf1Úf2r   r   r   Ú	test_TermO   s    $r?   c                   @   s<   e Zd ZdZdd„ ZeZdd„ Zdd„ Ze	dd	„ ƒZ
eZd
S )r   aÂ  A simple container representing the termlists parsed from a formula.

    This is a simple container object which has exactly the same
    representational power as a formula string, but is a Python object
    instead. You can construct one by hand, and pass it to functions like
    :func:`dmatrix` or :func:`incr_dbuilder` that are expecting a formula
    string, but without having to do any messy string manipulation. For
    details see :ref:`expert-model-specification`.

    Attributes:

    .. attribute:: lhs_termlist
                   rhs_termlist

       Two termlists representing the left- and right-hand sides of a
       formula, suitable for passing to :func:`design_matrix_builders`.
    c                 C   s   t |ƒ| _t |ƒ| _d S r   )r
   Úlhs_termlistÚrhs_termlist)r   r@   rA   r   r   r   r   m   s    
zModelDesc.__init__c                 C   s&   |rt ‚t|| g d| jfd| jfgƒS )Nr@   rA   )r"   r   r@   rA   r$   r   r   r   r'   r   s    ÿþzModelDesc._repr_pretty_c                    s”   dd„ ‰ d  ‡ fdd„| jD ƒ¡}|r0|d7 }n|d7 }| jtgkrR|ˆ tƒ7 }n>g }t| jkrj| d¡ |‡ fd	d„| jD ƒ7 }|d  |¡7 }|S )
aÀ  Returns a human-readable representation of this :class:`ModelDesc`
        in pseudo-formula notation.

        .. warning:: There is no guarantee that the strings returned by this
           function can be parsed as formulas. They are best-effort
           descriptions intended for human users. However, if this ModelDesc
           was created by parsing a formula, then it should work in
           practice. If you *really* have to.
        c                 S   s   | t krdS |  ¡ S d S )NÚ1)r   r)   )Útermr   r   r   Ú	term_codeƒ   s    z%ModelDesc.describe.<locals>.term_codez + c                    s   g | ]}ˆ |ƒ‘qS r   r   ©r*   rC   ©rD   r   r   r,   ˆ   s     z&ModelDesc.describe.<locals>.<listcomp>z ~ z~ Ú0c                    s   g | ]}|t krˆ |ƒ‘qS r   ©r   rE   rF   r   r   r,   “   s    ÿ)r.   r@   rA   r   Úappend)r   ÚresultZ
term_namesr   rF   r   Údescribey   s    



zModelDesc.describec                 C   s:   t |tƒr|}nt|ƒ}tƒ j|dd�}t || ƒs6t‚|S )a$  Construct a :class:`ModelDesc` from a formula string.

        :arg tree_or_string: A formula string. (Or an unevaluated formula
          parse tree, but the API for generating those isn't public yet. Shh,
          it can be our secret.)
        :returns: A new :class:`ModelDesc`.
        F)Úrequire_evalexpr)r   r   r   Ú	EvaluatorÚevalr"   )ÚclsZtree_or_stringÚtreeÚvaluer   r   r   Úfrom_formula˜   s    	
zModelDesc.from_formulaN)r/   r0   r1   r2   r   r   r3   r'   rK   ÚclassmethodrR   r   r4   r   r   r   r   r   [   s   
c                  C   s   t dƒ} t dƒ}ttt| gƒgt| gƒt| |gƒgƒ}|jtt| gƒgksNt‚|jt| gƒt| |gƒgksnt‚t| ¡ ƒ | ¡ dksŠt‚t	|ƒ tg g ƒ ¡ dks¨t‚ttgg ƒ ¡ dksÀt‚ttgtgƒ ¡ dksÚt‚ttgtt|gƒgƒ ¡ dksüt‚d S )Nr:   r;   z1 + a ~ 0 + a + a:bz~ 0z1 ~ 0z1 ~ 1z1 ~ b)
r5   r   r   r   r@   r"   rA   ÚprintrK   r   )r=   r>   Úmr   r   r   Útest_ModelDesc«   s    & ÿrV   c                  C   sV   dt dƒfD ]D} t | ¡}|jttdƒgƒgks4t‚|jtttdƒgƒgkst‚qd S )Nzy ~ xÚyÚx)	r   r   rR   r@   r   r	   r"   rA   r   )ÚinputÚmdr   r   r   Útest_ModelDesc_from_formula¼   s    
r[   c                   @   s(   e Zd ZdZdd„ ZeZdd„ ZeZ	dS )ÚIntermediateExprzFThis class holds an intermediate result while we're evaluating a tree.c                 C   sD   || _ || _|| _tt|ƒƒ| _| j r0| js0t‚| j r@| jr@t‚d S r   )Ú	interceptÚintercept_originÚintercept_removedr   r
   Útermsr"   )r   r]   r^   r_   r`   r   r   r   r   Ä   s    
zIntermediateExpr.__init__c                 C   s$   |rt ‚t|| | j| j| j| jgƒS r   )r"   r   r]   r^   r_   r`   r$   r   r   r   Ú_pretty_repr_Î   s     ÿÿzIntermediateExpr._pretty_repr_N)
r/   r0   r1   r2   r   r   r3   ra   r   r4   r   r   r   r   r\   Â   s
   	r\   c                 C   s   | rt f| S |S d S r   rH   )Zdoitr`   r   r   r   Ú_maybe_add_interceptÖ   s    
rb   c                    sv   ‡ fdd„|j D ƒ}t|ƒdkr6| dtdd dg ƒ¡ t|ƒdksFt‚tt|d j|d jƒt|d j	 |d jƒƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   ©rN   ©r*   Úarg©Ú	evaluatorr   r   r,   Ý   s     z#_eval_any_tilde.<locals>.<listcomp>r8   r   FTr9   )
ÚargsÚlenÚinsertr\   r"   r   rb   r]   r`   r_   ©rg   rP   Úexprsr   rf   r   Ú_eval_any_tildeÜ   s    ÿÿrm   c                 C   s~   |   |jd ¡}|jd jdkr0tdd d|jƒS |   |jd ¡}|jr^td|jd|j|j ƒS t|j|j|j|j|j ƒS d S )Nr   r8   ÚZEROFT©rN   rh   Útyper\   r`   r]   r^   r_   )rg   rP   Ú	left_exprÚ
right_exprr   r   r   Ú_eval_binary_plusè   s    

ÿ
ýrs   c                    s¦   |   |jd ¡}|jd jdkr6td|jd d|jƒS |jd jdkrVtdd d|jƒS |   |jd ¡‰ ‡ fdd„|jD ƒ}ˆ jrŽtdd d|ƒS t|j|j|j|ƒS d S )	Nr   r8   rn   TFÚONEc                    s   g | ]}|ˆ j kr|‘qS r   )r`   rE   ©rr   r   r   r,     s    
ÿz&_eval_binary_minus.<locals>.<listcomp>ro   )rg   rP   rq   r`   r   ru   r   Ú_eval_binary_minusø   s     ÿýrv   c                 C   s   | j rtd| jƒ‚d S )Nz1intercept term cannot interact with anything else)r]   r   r^   )Úexprr   r   r   Ú_check_interactable  s    ÿrx   c                 C   sV   | |fD ]}t |ƒ qg }| jD ]&}|jD ]}| t|j|j ƒ¡ q*q tdd d|ƒS )NF)rx   r`   rI   r   r   r\   )rq   rr   rw   r`   Zl_termZr_termr   r   r   Ú_interaction  s    


ry   c                    s<   ‡ fdd„|j D ƒ}tdd d|d j|d j t|Ž j ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   rc   rd   rf   r   r   r,     s     z%_eval_binary_prod.<locals>.<listcomp>Fr   r8   )rh   r\   r`   ry   rk   r   rf   r   Ú_eval_binary_prod  s    ÿþÿrz   c                 C   s†   |   |jd ¡}|   |jd ¡}t|jƒ}t|ƒ g }|jD ]}|t|jƒ7 }q<tdd dt|ƒgƒ}|tt||ƒjƒ7 }tdd d|ƒS )Nr   r8   F)	rN   rh   r#   r`   rx   r   r\   r   ry   )rg   rP   rq   rr   r`   Zleft_factorsrC   Zleft_combined_exprr   r   r   Ú_eval_binary_div(  s    

ÿr{   c                    s   ‡ fdd„|j D ƒ}t|Ž S )Nc                    s   g | ]}ˆ   |¡‘qS r   rc   rd   rf   r   r   r,   8  s     z)_eval_binary_interact.<locals>.<listcomp>)rh   ry   rk   r   rf   r   Ú_eval_binary_interact7  s    r|   c                 C   sÀ   |   |jd ¡}t|ƒ d}|jd jdkr\|jd jj}zt|ƒ}W n tk
rZ   Y nX |dk rttd|jd ƒ‚|j	}|}t
t|j	ƒ|ƒ}td|ƒD ]}t||ƒ}||j	 }q˜tdd d|ƒS )Nr   éÿÿÿÿr8   )rt   ÚNUMBERz '**' requires a positive integerF)rN   rh   rx   rp   ÚtokenÚextraÚintÚ
ValueErrorr   r`   Úminri   Úrangery   r\   )rg   rP   rq   Úpowerrw   Z	all_termsZbig_exprÚir   r   r   Ú_eval_binary_power;  s$    
r‡   c                 C   s   |   |jd ¡S )Nr   )rN   rh   ©rg   rP   r   r   r   Ú_eval_unary_plusP  s    r‰   c                 C   sL   |j d jdkr td|jdg ƒS |j d jdkr>tdd dg ƒS td|ƒ‚d S )Nr   rn   TFrt   z)Unary minus can only be applied to 1 or 0)rh   rp   r\   Úoriginr   rˆ   r   r   r   Ú_eval_unary_minusS  s
    r‹   c                 C   s   t dd dg ƒS )NFT)r\   rˆ   r   r   r   Ú
_eval_zero[  s    rŒ   c                 C   s   t d|jdg ƒS )NTF)r\   rŠ   rˆ   r   r   r   Ú	_eval_one^  s    r�   c                 C   s   t d|ƒ‚d S )Nz4numbers besides '0' and '1' are only allowed with **r   rˆ   r   r   r   Ú_eval_numbera  s    ÿrŽ   c                 C   s(   t |jj|jd�}tdd dt|gƒgƒS )N)rŠ   F)r	   r   r€   rŠ   r\   r   )rg   rP   Úfactorr   r   r   Ú_eval_python_expre  s    r�   c                   @   s&   e Zd Zdd„ Zdd„ Zd	dd„ZdS )
rM   c                 C   sÔ   i | _ |  ddt¡ |  ddt¡ |  ddt¡ |  ddt¡ |  ddt¡ |  ddt¡ |  ddt¡ |  d	dt¡ |  ddt	¡ |  ddt
¡ |  d
dt¡ |  ddt¡ |  ddt¡ |  ddt¡ i | _d S )Nú~r9   r8   ú+ú-Ú*ú/r(   z**rn   r   rt   r~   ZPYTHON_EXPR)Ú_evaluatorsÚadd_oprm   rs   rv   rz   r{   r|   r‡   r‰   r‹   rŒ   r�   rŽ   r�   Ústashr    r   r   r   r   j  s     zEvaluator.__init__c                 C   s   || j ||f< d S r   )r–   )r   ÚopÚarityrg   r   r   r   r—   …  s    zEvaluator.add_opTc                 C   s‚   d }t |tƒst‚|jt|jƒf}|| jkr@td|jf |jƒ‚| j| | |ƒ}|r~t |t	ƒs~t |t
ƒrttd|ƒ‚n
td|ƒ‚|S )Nz/I don't know how to evaluate this '%s' operatorz2~ can only be used once, and only at the top levelzBcustom operator returned an object that I don't know how to handle)r   r   r"   rp   ri   rh   r–   r   r   r\   r   )r   rP   rL   rJ   Úkeyr   r   r   rN   ˆ  s&    
ÿþ
þþzEvaluator.evalN)T)r/   r0   r1   r   r—   rN   r   r   r   r   rM   i  s   rM   Tr:   Fr;   znp.log(a, base=10)zI(b)ÚczI(b + c))r:   r;   )r:   rœ   )r;   rœ   )r:   r;   rœ   Úd)r:   r�   )r;   r�   )rœ   r�   )r:   r;   r�   )r:   rœ   r�   )r;   rœ   r�   rW   Úz)rW   rž   )TÚ ú z 
 r:   rB   rG   z- 1z- 0z+ 1z+ 0z0 + 1z1 + 0z1 - 0z0 - 1z1 + az0 + aza - 1za - 0z1 - aúa + bz(a + b)za + ((((b))))za + ((((+b))))za + ((((b - a))))z	a + a + aza + (b - a)za + np.log(a, base=10)z0a + np.log(a, base=10) - np . log(a , base = 10)za + (I(b) + c)za + I(b + c)r<   za:b:az	a:(b + c)z	(a + b):cz	a:(b - c)zc + a:c + a:(b - c)z	(a - b):czb + b:c + (a - b):cz	a:b - a:bz	a:b - b:az1 - (a + b)za + b - (a + b)za * bz	a * b * aza * (b + c)z(a + b) * cza * (b - c)zc + a:c + a * (b - c)z(a - b) * czb + b:c + (a - b) * cza/bz	(a + b)/czb + b:c + (a - b)/cz	a/(b + c)za ** 2z(a + b + c + d) ** 2z(a + b + c + d) ** 3za + +az~ a + bz~ a*bz	~ a*b + 0z~ -1z	0 ~ a + bz	1 ~ a + bz	y ~ a + bz0 + y ~ a + bz0 + y * z ~ a + bz-1 ~ 1z1 + y ~ a + bz	a + b * cz	a * b + cz	a * b - az	a + b / cz	a / b + cza*b:cza:b*cz~ 1 + 1 + 0 + 1z~ 0 + 1 + 0z~ 0 - 1 - 1 + 0 + 1z~ 1 - 1z~ 0 + a + 1z~ 1 + (a + 0)z~ 0 + (a + 1)z~ 1 - (a + 1)za <+>za + <(>z
b + <(-a)>za:<1>z(a + <1>)*bza + <2>z	a + <1.0>za ** <b>za ** <(1 + 1)>z
a ** <1.5>za + b <# asdf>z<)>za + <)>z<*> aza + <*>za + <foo[bar>za + <foo{bar>za + <foo(bar>z
a + <[bar>z
a + <{bar>za + <{bar[]>za + foo<]>barza + foo[]<]>barza + foo{}<}>barza + foo<)>barza + b<)>z(a) <.>z<(>a + bz<y ~ a> ~ bzy ~ <(a ~ b)>z	<~ a> ~ bz~ <(a ~ b)>z1 + <-(a + b)>z<- a>za + <-a**2>c                 C   s~   |rdg| }t | ƒt |ƒks"t‚t| |ƒD ]L\}}t|tƒrlt|tƒrN|f}|jtdd„ |D ƒƒksxt‚q,||ks,t‚q,d S )Nr   c                 S   s   g | ]}t |ƒ‘qS r   )r	   )r*   Úsr   r   r   r,   Q  s     z'_assert_terms_match.<locals>.<listcomp>)ri   r"   Úzipr   r   Ústrr   r   )r`   Zexpected_interceptÚ	expectedsrC   Úexpectedr   r   r   Ú_assert_terms_matchI  s    


r§   c                 C   s~   t  | ¡D ]n\}}t|ƒdkr*dg f| }t |¡}tt|ƒƒ t|ƒ t|ƒ |\}}}}t|j||ƒ t|j	||ƒ q
d S )Nr9   F)
ÚsixÚ	iteritemsri   r   rR   rT   Úreprr§   r@   rA   )ÚtestsÚcoderJ   Z
model_descZlhs_interceptr@   Zrhs_interceptrA   r   r   r   Ú_do_eval_formula_testsU  s     
 ÿ ÿr­   c                   C   s   t tƒ d S r   )r­   Ú_eval_testsr   r   r   r   Útest_eval_formulac  s    r¯   c                  C   s"   ddl m}  dd„ }| |tƒ d S )Nr   )Ú_parsing_error_testc                 S   s
   t  | ¡S r   )r   rR   )Zformular   r   r   Ú<lambda>h  ó    z3test_eval_formula_error_reporting.<locals>.<lambda>)Úpatsy.parse_formular°   Ú_eval_error_tests)r°   Zparse_fnr   r   r   Ú!test_eval_formula_error_reportingf  s    rµ   c                  C   s^   ddl m}  t d¡}|jd jd j| dddƒks8t‚|jd jd j| dddƒksZt‚d S )Nr   )ÚOriginr¡   r8   r9   é   é   )Zpatsy.originr¶   r   rR   rA   r   rŠ   r"   )r¶   Údescr   r   r   Útest_formula_factor_origink  s    

ÿ
ÿrº   )4Ú
__future__r   r¨   Zpatsyr   r³   r   r   r   Z
patsy.evalr   r	   Z
patsy.utilr
   r   r   r   r   Ú__all__Úobjectr   r   r5   r?   r   rV   r[   r\   rb   rm   rs   rv   rx   ry   rz   r{   r|   r‡   r‰   r‹   rŒ   r�   rŽ   r�   rM   r®   r´   r§   r­   r¯   rµ   rº   r   r   r   r   Ú<module>	   sb  
*P	6











    þ
      ü



‘tË8