o
    #e1p                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZ d d
lT d dlmZmZmZm Z  d dl!m"Z" erjd dl#Z#dd Z$i d dfddZ%i d dfddZ&	d>ddZ'e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' Z0d(d) Z1d*d+ Z2d,d- Z3d.d/ Z4d0d1 Z5d2d3 Z6d4d5 Z7d6d7 Z8d8d9 Z9d:d; Z:d<d= Z;dS )?    N
PatsyError)DesignMatrix
DesignInfo)EvalEnvironment)	ModelDescTerm	INTERCEPT)C)Helmert)balancedLookupFactor)design_matrix_buildersbuild_design_matrices)*)have_pandashave_pandas_categoricalhave_pandas_categorical_dtypepandas_Categorical_from_codes)Originc           
      C   s
  t ||sJ |jj|ksJ |d ur%t ||sJ |jj|ks$J n|d u s+J |d u s1J | rm|d u r@t|jg|\}nt|j|jg|\}	}t |	|sSJ |	jj|ks[J t ||scJ |jj|kskJ d S |jjd u suJ |d u s|jjd u sJ d S d S N)npallclosedesign_infocolumn_namesr   terms)
expect_full_designslhsrhsdataexpected_rhs_valuesexpected_rhs_namesexpected_lhs_valuesexpected_lhs_namesZnew_rhsZnew_lhs r$   4lib/python3.10/site-packages/patsy/test_highlevel.pycheck_result   s*    r&   matrixc                 C   &   d}t |tr|d7 }t| |||dS N	dataframe   return_type)
isinstanceintdmatrixformula_liker   depthr-   r$   r$   r%   dmatrix_pandas:      
r4   c                 C   r(   r)   )r.   r/   	dmatricesr1   r$   r$   r%   dmatrices_pandas@   r5   r7   c              
      s  t |tr	|d7 } fdd}t | tjttf s*t | tr%t | d ts*t| drW|d u r>t| ||}	d }
t	|	g \}nt
| ||}t	| \}
}t||
| |||| nttt
| | ttt| | tg}tg}try|t |t |d u r|D ]}||  |}t|d | |||| q|D ]}z	||  | W t ty   Y qw d S |D ]}z	||  | W t ty   Y qw |D ]}||  |\}
}t||
| |||| qd S )Nr+   c                      s
   t  gS r   iterr$   r   r$   r%   data_iter_makerL   s   
zt.<locals>.data_iter_makerr   __patsy_get_model_desc__)r.   r/   sixZstring_typesr   r   tuplehasattrincr_dbuilderr   incr_dbuildersr&   pytestraisesr   r0   r6   r   appendr4   r7   AssertionError)r2   r   r3   r   r    r!   r"   r#   r;   builderr   r   buildersZ
one_mat_fsZ
two_mat_fsfr$   r:   r%   tF   sx   





rI   c              	   C   s\   t |tr	|d7 }ttg}tr|ttg7 }|D ]}z	|| || W t |y+   Y qw d S )Nr+   )r.   r/   r0   r6   r   r4   r7   rE   )r2   r   r3   excZfsrH   r$   r$   r%   	t_invalid   s   
rK   c               
      s	  t g dg dgi ddg dg dgg d t d g dg dgfi ddg dg dgg d t tg dg dgi ddg dg dgg d t d tg dg dgfi ddg dg dgg d tg dg dgdd} t | i ddg dg dgg d t d | fi ddg dg dgg d t d	d
gg dg dgfi ddg dg dgg dd	gd
ggdg t d	gd
ggg dg dgfi ddg dg dgg dd	gd
ggdg t td	d
gtg dg dgfi ddg dg dgg dd	gd
ggdg t td	gd
ggtg dg dgfi ddg dg dgg dd	gd
ggdg tg dg dgdd}td	d
gdd}t ||fi ddg dg dgg dd	gd
ggdg tg dg dg dgfi d tg dgfi d tg dgg dgg dgfi d tr_t tdg dii ddd	gd
gdggdg t tjg dddi ddd	gd
gdggdg t tdg ditdg difi ddd	gd
gdggdgdgdgdggdg t tjg dddtjg dddfi ddd	gd
gdggdgdgdgdggdg t tg dgtjg dgg ddfi ddg dgg dg dgg d t tg di ddd	gd
gdggdg ttjd	ggd	gdtjd	ggd
gdfi d G dd dt	}| }t |d	d
gd	d
gddggdddd	d
gddggd d!gd	gd
ggd"g G d#d$ d$t	}t| i d t d%d	d
gddgd&ddd	dgd	dggd'dgd	gd
ggdg t d(d	d
gddgd&ddd	dgd	dggd'dg t d)d	d
gddgd&ddg d*g d+gg d, t
js*t td%d	d
gddgd&ddd	dgd	dggd'dgd	gd
ggdg d-d.}t|tsJ tjtt||d	d
gid/ tg ttdgg}t |dg d0iddd1gd2gd3ggdg tg tg ttdgg}t |dg d0iddd	d1gd	d2gd	d3ggd'dg tttdggtg ttdgg}t |g d0g d4d5ddd	d1gd	d2gd	d3ggd'dgd6gd7gd8ggdg g ttdggtg ttdggf}t|d9d: dd;}	t |	d |	d
 fdg d4iddd	d6gd	d7gd	d8ggd'dg t |	d
 dg d4iddd	d6gd	d7gd	d8ggd'dg t |	d	 |	d
 fdg d4iddd	d6gd	d7gd	d8ggd'dgd6gd7gd8ggdg g d}
t d<i ddd	d	gd	d
gd	dggd'd=g t d<d=g d4iddd	d6gd	d7gd	d8ggd'd=g td<i d	ttfd> d?d@ }|  td	 td<i  ttfd> td  fdAdB}|  d S )CNr+                  r   F)x0x1x2foo)Zdefault_column_prefix)Zfoo0Zfoo1Zfoo2r+   rM   y0barZbar0xrN   asdf)nameyrP   rQ   rR   )      	   )columns)Zx7Zx8Zx9)rW   Zy1Zy2rS   )indexc                   @      e Zd Zdd ZdS )z.test_formula_likes.<locals>.ForeignModelSourcec                 S   s"   t ttdggttdggS )NYX)r   r   r   selfr   r$   r$   r%   r<      s   zGtest_formula_likes.<locals>.ForeignModelSource.__patsy_get_model_desc__N__name__
__module____qualname__r<   r$   r$   r$   r%   ForeignModelSource       rk   )rc   rd   TX[0]X[1]rc   c                   @   rb   )z1test_formula_likes.<locals>.BadForeignModelSourcec                 S   s   |S r   r$   re   r$   r$   r%   r<      s   zJtest_formula_likes.<locals>.BadForeignModelSource.__patsy_get_model_desc__Nrg   r$   r$   r$   r%   BadForeignModelSource   rl   ro   y ~ x)r\   rY   	Interceptz~ xx + y)r+   rN   r+   )r+   rP   rM   )rq   rY   r\   u   Ã©zutf-8r:   )      ?      @      @rs   rt   ru   
         rY   r\   rw   rx   ry   c                   S   s   t dg digS )NrY   rL   r8   r$   r$   r$   r%   <lambda>+  s    z$test_formula_likes.<locals>.<lambda>)Zeval_env
~ x_in_envx_in_env)rJ   c               	   S   s0   d} t di ddddgddgddggddg d S )	NrZ   r|   r+   TrM   rN   rq   r}   rI   r}   r$   r$   r%   check_nested_callF  
   z-test_formula_likes.<locals>.check_nested_callc               	      s0   d} t di  dddgddgddggddg d S )	NrZ   r|   Tr+   rM   rN   rq   r}   r~   r   er$   r%   check_nested_call_2P  r   z/test_formula_likes.<locals>.check_nested_call_2)rI   r   asarrayr   rK   r   pandasZ	DataFrameSeriesobjectr=   ZPY3Zunicodedecoder.   rB   rC   r   r0   r   r   r   r   	NameErrorr   Zcapture)ZdmZx_dmZy_dmrk   Zforeign_modelro   ZeacuteZdescZ	termlistsrG   r}   r   r   r$   r   r%   test_formula_likes   sz   (, $



r   c                  C   s  t sd S tjg ddg dd} tjg ddg dd}tddd	}t|d
d
gd
dgd
dggs3J t|jddgs>J |jj	ddgksHJ t|j
g dsSJ tddd	\}}t|dgdgdggsiJ t|jdgssJ |jj	dgks|J t|j
g dsJ t|d
d
gd
dgd
dggsJ t|jddgsJ |jj	ddgksJ t|j
g dsJ t| dd	}t|d
gdgdggsJ t|jdgsJ |jj	dgksJ t|j
g dsJ t|| fdd	\}}t|dgdgdggsJ t|jdgsJ |jj	dgksJ t|j
g ds$J t|d
gdgdggs3J t|jdgs>J |jj	dgksHJ t|j
g dsTJ t| g dfdd	\}}	t|j
| j
skJ t|	j
| j
svJ tg d| fdd	\}
}t|
j
| j
sJ t|j
| j
sJ dd l}|jj }z)d|j_ tjttddd
giddd	 tjttdd
gdgdddd	 W ||j_ d S ||j_ w )NrL   ZAArv   )r[   ra   rO   ZBBs1r*   r,   r+   rM   rN   rq   zs2 ~ s1rP   rQ   rR   s2)rw         r   FrY   rp   rz   )r   r   r   r0   r   r   array_equalr`   r   r   ra   r6   patsy.highlevelZ	highlevelrB   rC   r   )r   r   Zdf1Zdf2Zdf3Zdf4Zdf5Zdf6Zdf7Zdf8Zdf9Zdf10patsyZ
had_pandasr$   r$   r%   test_return_pandasW  sd   ""r   c                  C   sj   t ddd} td| }|jjg dksJ |jjddgksJ t|jjdks)J |jjd tks3J d S )NrM   aba:b)rq   b[T.b2]za[T.a2]:b[b1]za[T.a2]:b[b2]rq   r   )r   r0   r   r   
term_nameslenr   r	   )r   r   r$   r$   r%   test_term_info  s   
r   c                  C   s  g dg dt jg dt jdg dg dtg dtg dt jg dtdd} td| d	d
dgdgdggdg td| d	d
dgdgdggdg td| d	d
dgdgdggdg td| d	d
d	dgdd	gd	dggddg td| d	d
g dg dg dgg d td| d	d
g dg dg dgg d td| d	d
g dg dg dgg d td| d	d
g dg dg dgg d  d S )!NrL   )g      ?g       @g      @)Zdtype)TFT)rV   rX   Zbaz)rV   r+   )r+   hi)r   r   cdr   rH   ghz~ 0 + ar   Tr+   rM   rN   r   z~ 0 + br   z~ 0 + cr   z~ 0 + dzd[False]zd[True]z~ 0 + e)r   r   r+   )r+   r   r   )r   r+   r   )ze[bar]ze[baz]ze[foo]z~ 0 + f)zf[1]zf[2]zf[3]z~ 0 + g)zg[bar]zg[baz]zg[foo]z~ 0 + h)zh[1]zh[foo]zh[(1, 'hi')])r   r   Zfloat32r
   Zarrayr   rI   r:   r$   r$   r%   test_data_types  sD   


	






r   c               
   C   s  t ddd} td| ddddgddgddgddggddg td	| ddddgddgddgddggdd
g td| ddddgddgddgddggddg td| ddg dg dg dg dgg d td| ddg dg dg dg dgg d td| ddg dg dg dg dgg d t| d t| d< td| ddddgddgddgddggddg td| ddddgddgddgddggddg td| ddddgddgddgddggddg d S ) NrM   r   z~ C(a)r   Tr+   rq   z
C(a)[T.a2]z~ C(a, levels=['a2', 'a1'])zC(a, levels=['a2', 'a1'])[T.a1]z~ C(a, Treatment(reference=-1))z#C(a, Treatment(reference=-1))[T.a1]za*b)r+   r   r   r   )r+   r   r+   r   )r+   r+   r   r   )r+   r+   r+   r+   )rq   a[T.a2]r   za[T.a2]:b[T.b2]z0 + a:b)r   r   r+   r   )r   r+   r   r   )r   r   r   r+   )za[a1]:b[b1]za[a2]:b[b1]za[a1]:b[b2]za[a2]:b[b2]z1 + a + a:b)r+   r+   r   r+   )rq   r   za[a1]:b[T.b2]za[a2]:b[T.b2]r   za[H.a2]zC(a, Treatment)zC(a, Treatment)[T.a2])r   rI   r
   r   r:   r$   r$   r%   test_categorical  sn    	   r   c                  C   s   g dg dg dd} t d| dddgd	gd
gdgdgdggdg t d| ddddgddgddggddg t d| ddddgddgddggddg d S )NrL   rO   rv   )rY   r\   za b cz0 + I(x + y)r   Tr+   rM   rN   rP   rQ   rR   zI(x + y)z
Q('a b c')rw   rx   ry   rq   z	center(x)r   r~   r:   r$   r$   r%   test_builtins  s    r   c               
      s  g dg ddg dg ddg t g d} t | t |  }|t | } fdd}td	|}t| d
 \}}|jjdgksGJ |jjg dksQJ t |d
gd
gd
ggs_J t |t 	g dg d|dd  fsuJ t
d|}t|g d
 \}|jjg dksJ t |d
gd
gd
ggsJ t |t 	g dg d|dd  fsJ ttt
d| tttd| d S )N)a2r   r   rL   )r   rY   )r   r   a1rO   )r+   rM   rN   rP   rQ   rR   c                      s   t  S r   r8   r$   Zdatasr$   r%   r;        z)test_incremental.<locals>.data_iter_makerz!1 ~ a + center(np.sin(center(x)))r+   rq   )rq   r   zcenter(np.sin(center(x))))r+   r+   r+   )r+   r+   r   rN   z~ a + center(np.sin(center(x)))zx ~ xrY   )r   r   sinZmeanrA   r   r   r   r   Zcolumn_stackr@   rB   rC   r   )rY   Zsin_center_xZx_colr;   rG   r   r   rF   r$   r   r%   test_incremental  sD   

r   c                   C   sF   t ddg didddtdgdtdgdtdggd	d
g d S )Nz~ np.sin(x)rY   rL   r   Tr+   rM   rN   rq   z	np.sin(x))rI   r   r   r$   r$   r$   r%   test_env_transform  s
   &r   c                     s   t ddd tddd d<  d d  d<  fdd	} | d
g d | dg d | dg d | dg d | dg d | dg d d S )NrM   r   r   r+   rP   rT   rU   c                    s   t |  }|jj|ksJ d S r   )r0   r   r   )formulaZordermr:   r$   r%   t_terms3  s   
z test_term_order.<locals>.t_termsza + b + x1 + x2)rq   r   r   rT   rU   zb + a + x2 + x1)rq   r   r   rU   rT   z0 + x1 + a + x2 + b + 1z0 + a:b + a + b + 1)rq   r   r   r   za + a:x1 + x2 + x1 + b)rq   r   r   rT   a:x1rU   z@0 + a:x1:x2 + a + x2:x1:b + x2 + x1 + a:x1 + x1:x2 + x1:a:x2:a:b)r   zx1:x2za:x1:x2zx2:x1:bz	x1:a:x2:brU   rT   r   )r   r   Zlinspace)r   r$   r:   r%   test_term_order.  s   r   c                 C   sJ   ddd}t d|d}| rt|dggsJ d S t|dggs#J d S )NrQ   rM   rz   z0 + I(x / y)r+   rt   )r0   r   r   )Zexpect_true_divisionr   r   r$   r$   r%   _check_divisionD  s
   
r   c                   C   s(   t j tjk r
d S td td d S )NFz6from __future__ import division
_check_division(True)
)
__future__ZdivisionZgetMandatoryReleasesysversion_infor   execr$   r$   r$   r%   test_futureO  s   r   c                  C   sp   ddgddgddggddgddggd} t d| d	d
g dg dgg d t d| d	d
g dg dgg d d S )Nr   r   r+   rM   rN   rP   )r   rd   rc   zX*Yr   T)	r+   r+   rM   r+   rN   r+   rM   rN   rR   )	r+   rN   rP   rM   rP   rR   r^   r      )	rq   rm   rn   Y[0]Y[1]z	X[0]:Y[0]z	X[1]:Y[0]z	X[0]:Y[1]z	X[1]:Y[1]za:X + Y)r+   r+   r   rM   r   r+   rN   )r+   r   rN   r   rP   rM   rP   )rq   z
a[a1]:X[0]z
a[a2]:X[0]z
a[a1]:X[1]z
a[a2]:X[1]r   r   r~   r:   r$   r$   r%   test_multicolumnY  s$   r   c                  C   s   g d} g d}t tdddgddgddggsJ td\}}t |dgd	gd
ggs/J t |ddgddgddggs@J d S )NrL   rO   rY   r+   rM   rN   rp   rP   rQ   rR   )r   r   r0   r6   )rY   r\   r   r   r$   r$   r%   test_dmatrix_dmatrices_no_datam  s   &&r   c                  C   sJ   t dg dg dg dd\} }| j dksJ |j dks#J d S )Nz	y ~ x + arL   rO   )r   r   a3)r\   rY   r   r\   z	1 + a + x)r6   r   Zdescribe)r   r   r$   r$   r%   test_designinfo_describeu  s   
r   c               
   C   s   dd } d}zt |g dg dd W n  ty4 } z|jt|d|dks*J W Y d }~nd }~ww J z	t d
di i W n; ty{ } z/tjd dkrbt|tsVJ |jtd
ddksaJ nt|t	siJ W Y d }~d S W Y d }~d S d }~ww J )Nc                 S   s   t d)NZWHEEEEEEr   )rY   r$   r$   r%   raise_patsy_error  r   z2test_evalfactor_reraise.<locals>.raise_patsy_errorzraise_patsy_error(X) + YrL   rO   )rd   rc   r    Fz1 + x[1]rY   rN   rP   r^   )
r0   r   originr   ra   	Exceptionr   r   r.   KeyError)r   r   r   r$   r$   r%   test_evalfactor_reraise|  s(   (r   c               	   C   s  dddt jgt jdddgd} dg}tr|d	 |D ]}td
| |d}t |g dg dgs2J |d	krC|jt	ddgsCJ t
jttd
| |dd td| |d\}}t |dgdggscJ t |ddgddggsqJ |d	kr|jt	ddgsJ |jt	ddgsJ t
jttd| |dd td| |d\}}t |dgdgdggsJ t |dgdgdggsJ |d	kr|jt	g dsJ |jt	g dsJ t
jttd| |dd qd S )Nr+   rM   rN   rx   ry   (   rz   r'   r*   rr   )r   r-   )r+   rM   rx   )r+   rN   ry   raise)r   r-   Z	NA_actionrp   zy ~ 1rL   )r   nanr   rD   r0   r   ra   Zequalsr   ZIndexrB   rC   r   r6   )r   Zreturn_typesr-   matZlmatZrmatr$   r$   r%   test_dmatrix_NA_action  sH   

r   c                  C   s   dddd} dg dgfdg dgffD ]A\}}t || }t||s%J tt|jg| d	 |s4J trUt| }tt |||sFJ tt|jg|d	 |sUJ qd S )
N皙?333333?r   )rT   rU   r   zx1 + x2)r+   r   r   zC(a, levels=('a1', 'a2')) + x1)r+   r   r   r   )r0   r   r   r   r   r   r   r   )Zdata_0dr   Zexpectedr   Zdata_seriesr$   r$   r%   test_0d_data  s2   

r   c                  C   s:   g d} t di }g d} t |ji }t||sJ d S )NrL   r}   rv   )r0   r   r   r   )r}   Zdesign_matrixZdesign_matrix2r$   r$   r%   test_env_not_saved_in_builder  s
   
r   c                  C   s   t sd S tg dddgg} tr| t| d  | D ]V}d|i}ttd|ddgddgddggs6J ttd|ddgddgddggsJJ ttd|ddgddgddggs^J ttd	|ddgddgddggsrJ qd S )
N)r+   r   r+   r   r   r   objr+   zC(obj)zC(obj, levels=['b', 'a'])zC(obj, levels=['a', 'b']))	r   r   r   rD   r   r   r   r   r0   )Zobjsr   r   r$   r$   r%   test_C_and_pandas_categorical  s@   
r   )NN)<r   r   r=   Znumpyr   rB   r   r   Zpatsy.design_infor   r   Z
patsy.evalr   Z
patsy.descr   r   r	   Zpatsy.categoricalr
   Zpatsy.contrastsr   Zpatsy.user_utilr   r   Zpatsy.buildr   r   r   Z
patsy.utilr   r   r   r   Zpatsy.originr   r   r&   r4   r7   rI   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   sX   	
? D7	4(
'	