B
    }|U)                 @   s   d dl mZ d dlmZ G dd de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S )    )print_function)no_picklingc               @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	Z
dS )_ExpandedFactorzA factor, with an additional annotation for whether it is coded
    full-rank (includes_intercept=True) or not.

    These objects are treated as immutable.c             C   s   || _ || _d S )N)includes_interceptfactor)selfr   r    r   /lib/python3.7/site-packages/patsy/redundancy.py__init__6   s    z_ExpandedFactor.__init__c             C   s   t t| j| jfS )N)hashr   r   r   )r   r   r   r	   __hash__:   s    z_ExpandedFactor.__hash__c             C   s"   t |to |j| jko |j| jkS )N)
isinstancer   r   r   )r   otherr   r   r	   __eq__=   s    
z_ExpandedFactor.__eq__c             C   s
   | |k S )Nr   )r   r   r   r   r	   __ne__B   s    z_ExpandedFactor.__ne__c             C   s   | j rd}nd}d| j|f S )N+-z%r%s)r   r   )r   suffixr   r   r	   __repr__E   s    z_ExpandedFactor.__repr__N)__name__
__module____qualname____doc__r
   r   r   r   r   r   __getstate__r   r   r   r	   r   1   s   r   c               @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
eZdS )_SubtermzAlso immutable.c             C   s   t || _d S )N)	frozensetefactors)r   r   r   r   r	   r
   P   s    z_Subterm.__init__c             C   s&   t | jt |j dko$| j|jS )N   )lenr   
issuperset)r   r   r   r   r	   
can_absorbS   s    z_Subterm.can_absorbc             C   sX   | j |j }t|dkstt|d }|jr4tt|j }|td|j	 t
|S )Nr   r   T)r   
differencer   AssertionErrorlistr   setaddr   r   r   )r   r   ZdiffZefactorZnew_factorsr   r   r	   absorbX   s    

z_Subterm.absorbc             C   s   t t| jfS )N)r   r   r   )r   r   r   r	   r   a   s    z_Subterm.__hash__c             C   s   t |to| j| jkS )N)r   r   r   )r   r   r   r   r	   r   d   s    
z_Subterm.__eq__c             C   s
   | |k S )Nr   )r   r   r   r   r	   r   h   s    z_Subterm.__ne__c             C   s   d| j jt| jf S )Nz%s(%r))	__class__r   r#   r   )r   r   r   r	   r   k   s    z_Subterm.__repr__N)r   r   r   r   r
   r    r&   r   r   r   r   r   r   r   r   r   r	   r   N   s   	r   c          	   C   sf   g }x\| D ]T}g }x<|D ]4}|d dks,t |t|d dk|d d  qW |t| q
W |S )N)r   r   r   )r"   appendr   r   )Zshort_subtermssubtermssubtermfactorsZfactor_namer   r   r	   _expand_test_abbrevss   s    

r-   c              C   s   t ddggd } t dddggd }t g gd }t ddggd }t dggd }t dggd }t ddggd }x$|||||fD ]}| |rtqW | |st| ||kstd S )Nza-zb-r   zc-zd-za+zb+)r-   r    r"   r&   )Zs_abZs_abcZs_nullZs_cdZs_aZs_apZs_abpZbadr   r   r	   test__Subterm~   s    r.   c             c   sZ   dd }t t| }t ||}|  |jtd x |D ]}tdd |D V  q:W d S )Nc             s   sD   | sdV  n4| d }x*t | dd  D ]}|V  |f| V  q&W d S )Nr   r   r   )_subsets_sorted)seqobjsubsetr   r   r	   helper   s    z_subsets_sorted.<locals>.helper)keyc             S   s   g | ]\}}|qS r   r   ).0idxr1   r   r   r	   
<listcomp>   s    z#_subsets_sorted.<locals>.<listcomp>)r#   	enumeratesortr   tuple)Ztuplr3   expandedZexpanded_subsetsr2   r   r   r	   r/      s    

r/   c            	   C   s`   t tdddddgkstt tdddddddddgks@ttt ttd	d
ks\td S )N)r      r   )r   )r<   )r   r<      )r=   )r   r=   )r<   r=          )r#   r/   r"   r   ranger   r   r   r	   test__subsets_sorted   s    
rA   c             C   sn   xht | D ]\\}}xRt | |d d  D ]:\}}||r(||}|| |d | < | | dS q(W q
W dS )Nr   TF)r8   r    r&   pop)r*   Zshort_iZshort_subtermZlong_iZlong_subtermZnew_subtermr   r   r	   _simplify_one_subterm   s    


rC   c             C   s   xt | rqW d S )N)rC   )r*   r   r   r	   _simplify_subterms   s    
rD   c              C   sf   dd } | dgdg | ddgdg | ddddgdg | dddgddg | dddgdd	g d S )
Nc             S   s6   t | } t |}td| d| t|  | |ks2td S )Nztesting if:z->)r-   printrD   r"   )ZgivenZexpectedr   r   r	   t   s
    z"test__simplify_subterms.<locals>.t)za-r   )za+)zb-)za-zb-)za+zb+)za-zb+r   )rF   r   r   r	   test__simplify_subterms   s    rG   c       
         s    fdd| j D }g }x4t|D ](}tdd |D }||kr"|| q"W || t| g }x6|D ].}i }x|jD ]}	|	j||	j< qzW || qjW |S )Nc                s   g | ]}| kr|qS r   r   )r5   f)numeric_factorsr   r	   r7      s    z+pick_contrasts_for_term.<locals>.<listcomp>c             S   s   g | ]}t d |qS )F)r   )r5   rH   r   r   r	   r7      s    )	r,   r/   r   r)   updaterD   r   r   r   )
ZtermrI   Zused_subtermsZcategorical_factorsr*   r2   r+   Zfactor_codingsZfactor_codingr;   r   )rI   r	   pick_contrasts_for_term   s    

rK   c              C   s   ddl m}  t }t| g t |}|i gks2tt| ddgtdg|}|ddigks^tt| ddgt |}|dddgkstt|}t| d	d
gt |}|d
didddgkstt| d
d	gt |}|d	didddgkstd S )Nr   )TermaxFbT)rM   rO   cd)rP   rQ   )Z
patsy.descrL   r$   rK   r"   )rL   ZusedZcodingsZused_snapshotr   r   r	   test_pick_contrasts_for_term   s    rR   N)Z
__future__r   Z
patsy.utilr   objectr   r   r-   r.   r/   rA   rC   rD   rG   rK   rR   r   r   r   r	   <module>+   s   %!