
    gV                        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 g dZ G d d	e      Z eg       Z G d
 de      Zd Z G d de      Zd Zd Z G d d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( G d# d$e      Z)i d%d&g fd'd&g fd(d&g fd)d&d)gfd*d&g fd+d,g fd-d,g fd.d&g fd/d&g fd0d,g fd1d&g fd2d,g fd3d&g fd4d,g fd5d&d)gfd6d,d)gfd7d,d)gfi d8d&d)gfd9d&g fd:d&d)d;gfd<d&d)d;gfd=d&d)d;gfd>d&d)d;gfd?d&d)d;gfd@d&d)gfdAd&d)d;gfdBd&d)dCgfdDd&d)gfdEd&g dFfdGd&d)dHgfdId&dJgfdKd&dJgfdLd&dJdMgfdNd&dMdOgfi dPd&dJgfdQd&g dRfdSd&dMgfdTd&g dUfdVd&g fdWd&g fdXd&g fdYd&g fdZd&g d[fd\d&g d[fd]d&g d^fd_d&g d`fdad&g d[fdbd&g dcfddd&g defdfd&g dgfdhd&d)dJgfi did&g djfdkd&g dlfdmd&g dnfdod&d)gfdpd&g dqfdrd&g dsfdtd&d)gfdud&d)d;gfdvd&g d[fdwd,g d[fdxd,g fdyd&d)d;gfdzd&g d&d)d;gfd{d,d|gd&d)d;gfd}d,d|gd&d)d;gfd~d,g dd&d)d;gfdd,g d&g fi dd&d|gd&d)d;gfdd&g dfdd&g dfdd&d;dJgfdd&g dfdd&g dfdd&g dfdd&g dfdd&g fdd,g fdd&g fdd,g fdd&d)gfdd&d)gfdd&d)gfdd,g fZ*g dZ+d Z,d Z-d Z.d Z/d Z0y)    
PatsyError)	ParseNodeTokenparse_formula)EvalEnvironment
EvalFactor)uniqueify_list)repr_pretty_delegaterepr_pretty_impl)no_picklingassert_no_pickling)Term	ModelDesc	INTERCEPTc                   <    e Zd ZdZd Zd Zd Zd ZeZ	d Z
d ZeZy)	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                 6    t        t        |            | _        y N)tupler
   factors)selfr   s     G/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/patsy/desc.py__init__zTerm.__init__*   s    ^G45    c                 |    t        |t              xr+ t        |j                        t        | j                        k(  S r   )
isinstancer   	frozensetr   r   others     r   __eq__zTerm.__eq__-   s5    %& 
9U]]+CyLLH
 ,
 	
r   c                     | |k(   S r    r   s     r   __ne__zTerm.__ne__2   s    5=  r   c                 J    t        t        t        | j                        f      S r   )hashr   r   r   r   s    r   __hash__zTerm.__hash__5   s    T9T\\2344r   c                 N    |rJ t        || t        | j                        g       y r   )r   listr   r   pcycles      r   _repr_pretty_zTerm._repr_pretty_:   s"    yD4#5"67r   c                     | j                   r7dj                  | j                   D cg c]  }|j                          c}      S yc c}w )z+Return a human-readable name for this term.:	Intercept)r   joinname)r   fs     r   r2   z	Term.name>   s5    <<88t||<!QVVX<== =s   AN)__name__
__module____qualname____doc__r   r    r#   r'   r   __repr__r-   r2   r   __getstate__r"   r   r   r   r      s3    6

!5 $H8 Lr   r   c                       e Zd Zd Zd Zy)_MockFactorc                     || _         y r   _name)r   r2   s     r   r   z_MockFactor.__init__L   s	    
r   c                     | j                   S r   r=   r&   s    r   r2   z_MockFactor.nameO   s    zzr   N)r4   r5   r6   r   r2   r"   r   r   r;   r;   K   s    r   r;   c                     t        g d      j                  dk(  sJ t        ddg      t        ddg      k(  sJ t        t        ddg            t        t        ddg            k(  sJ t        d      } t        d      }t        | |g      j	                         dk(  sJ t        || g      j	                         dk(  sJ t        g       j	                         d	k(  sJ t        t        g              y )
N)      rA   )rA   rB   rA   rB   aba:bzb:ar0   )r   r   r%   r;   r2   r   )f1f2s     r   	test_TermrH   S   s    	?""f,,,A<4A<'''aVdAq6l!3333	S	B	S	BR> E)))R> E)))8==?k)))tBx r   c                   :    e Zd ZdZd ZeZd Zd Ze	d        Z
eZy)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                 D    t        |      | _        t        |      | _        y r   )r
   lhs_termlistrhs_termlist)r   rK   rL   s      r   r   zModelDesc.__init__s   s    *<8*<8r   c                 Z    |rJ t        || g d| j                  fd| j                  fg      S )NrK   rL   )r   rK   rL   r*   s      r   r-   zModelDesc._repr_pretty_y   s>    yd//0>4CTCT2UV	
 	
r   c                    d }dj                  | j                  D cg c]
  } ||       c}      }|r|dz  }n|dz  }| j                  t        gk(  r| |t              z  }|S g }t        | j                  vr|j	                  d       || j                  D cg c]  }|t        k7  s ||       c}z  }|dj                  |      z  }|S c c}w c c}w )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                 6    | t         k(  ry| j                         S )N1)r   r2   )terms    r   	term_codez%ModelDesc.describe.<locals>.term_code   s    y yy{"r   z + z ~ z~ 0)r1   rK   rL   r   append)r   rR   rQ   result
term_namess        r   describezModelDesc.describe   s    	# 9J9JKYt_KLeOFdNF+i	**F  J 1 11!!#&,0,=,=$(AR	$ J ejj,,F Ls   CC(
Cc                     t        |t              r|}nt        |      }t               j	                  |d      }t        ||       sJ |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eval)clstree_or_stringtreevalues       r   from_formulazModelDesc.from_formula   sI     ni0!D 0D   >%%%%r   N)r4   r5   r6   r7   r   r   r8   r-   rW   classmethodr`   r   r9   r"   r   r   r   r   `   s9    $9 $H
 D    Lr   r   c                     t        d      } t        d      }t        t        t        | g      gt        | g      t        | |g      g      }|j                  t        t        | g      gk(  sJ |j
                  t        | g      t        | |g      gk(  sJ t        |j                                |j                         dk(  sJ t        |       t        g g       j                         dk(  sJ t        t        gg       j                         dk(  sJ t        t        gt        g      j                         dk(  sJ t        t        gt        t        |g      g      j                         dk(  sJ y )NrC   rD   z1 + a ~ 0 + a + a:bz~ 0z1 ~ 0z1 ~ 1z1 ~ b)	r;   r   r   r   rK   rL   printrW   r   )rF   rG   ms      r   test_ModelDescre      s8   	S	B	S	B9dB4j)D"Jb"X+GHA>>ird4444>>dB4j$Bx.9999	!**,::<0000qR%%'5000i["%..0G;;;i[9+.779WDDDi[9dB4j"9:CCEPPPr   c                      dt        d      fD ]f  } t        j                  |       }|j                  t	        t        d      g      gk(  sJ |j                  t        t	        t        d      g      gk(  rfJ  y )Nzy ~ xyx)r   r   r`   rK   r   r	   rL   r   )inputmds     r   test_ModelDesc_from_formulark      s|    =12 G##E**S/"##
 
 	
 
 9dJsO3D.E"FFFFGr   c                   $    e Zd ZdZd ZeZd ZeZ	y)IntermediateExprzFThis class holds an intermediate result while we're evaluating a tree.c                     || _         || _        || _        t        t	        |            | _        | j                   r| j                  sJ | j                   r| j                  rJ y y r   )	interceptintercept_originintercept_removedr   r
   terms)r   ro   rp   rq   rr   s        r   r   zIntermediateExpr.__init__   sZ    " 0!2>%01
>>((((NNt'='=>>'=Nr   c                 |    |rJ t        || | j                  | j                  | j                  | j                  g      S r   )r   ro   rp   rq   rr   r*   s      r   _pretty_repr_zIntermediateExpr._pretty_repr_   s=    y^^T22D4J4JDJJW
 	
r   N)
r4   r5   r6   r7   r   r   r8   rt   r   r9   r"   r   r   rm   rm      s    L? $H
 Lr   rm   c                     | r
t         f|z   S |S r   )r   )doitrr   s     r   _maybe_add_interceptrw      s    |e##r   c           	      ~   |j                   D cg c]  }| j                  |       }}t        |      dk(  r|j                  dt	        dd dg              t        |      dk(  sJ t        t        |d   j                  |d   j                        t        |d   j                   |d   j                              S c c}w )NrA   r   FTrB   )
argsr[   leninsertrm   r   rw   ro   rr   rq   	evaluatorr^   argexprss       r   _eval_any_tilder      s    ,0II6SY^^C 6E6
5zQ 	Q(dB?@u:??U1X//q@q!;!;;U1X^^L  7s   B:c                    | j                  |j                  d         }|j                  d   j                  dk(  rt        dd d|j                        S | j                  |j                  d         }|j
                  r/t        d|j                  d|j                  |j                  z         S t        |j
                  |j                  |j                  |j                  |j                  z         S )Nr   rA   ZEROFTr[   ry   typerm   rr   ro   rp   rq   )r}   r^   	left_expr
right_exprs       r   _eval_binary_plusr      s    tyy|,Iyy|F"tT9??CC^^DIIaL1
#++*"2"22	  $##**++*"2"22	 r   c                 J   | j                  |j                  d         }|j                  d   j                  dk(  r%t        d|j                  d   d|j                        S |j                  d   j                  dk(  rt        dd d|j                        S | j                  |j                  d         }|j                  D cg c]  }||j                  vs| }}|j
                  rt        dd d|      S t        |j
                  |j                  |j                  |      S c c}w )Nr   rA   r   TFONEr   )r}   r^   r   r   rQ   rr   s         r   _eval_binary_minusr     s    tyy|,Iyy|F"diilE9??KK	1		e	#tT9??CC^^DIIaL1
"+//R$TAQAQ5QRR#E4u==###**++	 	 Ss    D D c                 H    | j                   rt        d| j                        y )Nz1intercept term cannot interact with anything else)ro   r   rp   )exprs    r   _check_interactabler   *  s'    ~~B!!
 	
 r   c                     | |fD ]  }t        |        g }| j                  D ]D  }|j                  D ]3  }|j                  t        |j                  |j                  z                5 F t        dd d|      S )NF)r   rr   rT   r   r   rm   )r   r   r   rr   l_termr_terms         r   _interactionr   2  s    J' "D!"E// @ && 	@FLLfnnv~~=>?	@@ E466r   c           	          |j                   D cg c]  }| j                  |       }}t        dd d|d   j                  |d   j                  z   t	        | j                  z         S c c}w )NFr   rA   )ry   r[   rm   rr   r   r|   s       r   _eval_binary_prodr   <  sb    ,0II6SY^^C 6E6tUE!HNNU1X^^;lE>R>X>XX  7s   A'c                    | j                  |j                  d         }| j                  |j                  d         }t        |j                        }t	        |       g }|j                  D ]  }|t        |j
                        z  } t        dd dt        |      g      }|t        t        ||      j                        z  }t        dd d|      S )Nr   rA   F)	r[   ry   r)   rr   r   r   rm   r   r   )r}   r^   r   r   rr   left_factorsrQ   left_combined_exprs           r   _eval_binary_divr   K  s    tyy|,I		!-J!E	"L +T\\**+)%utL?Q>RS	T,1:>DDEEEE466r   c                 l    |j                   D cg c]  }| j                  |       }}t        | S c c}w r   )ry   r[   r   r|   s       r   _eval_binary_interactr   Z  s2    ,0II6SY^^C 6E6 7s   1c                    | j                  |j                  d         }t        |       d}|j                  d   j                  dv r/|j                  d   j                  j
                  }	 t        |      }|dk  rt        d|j                  d         |j                  }|}t        t        |j                        |      }t        d|      D ]  }t        ||      }||j                  z   } t        dd d|      S # t        $ r Y w xY w)Nr   rA   )r   NUMBERz '**' requires a positive integerF)r[   ry   r   r   tokenextraint
ValueErrorr   rr   minrz   ranger   rm   )r}   r^   r   powerr   	all_termsbig_expris           r   _eval_binary_powerr   _  s    tyy|,I	"Eyy|--yy|!!''	IE qy;TYYq\JJIHIOO$e,E1e_ /	84.	/ E4	::  		s   +C; ;	DDc                 >    | j                  |j                  d         S )Nr   )r[   ry   r}   r^   s     r   _eval_unary_plusr   u  s    >>$))A,''r   c                     |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|      )Nr   r   TFr   z)Unary minus can only be applied to 1 or 0)ry   r   rm   originr   r   s     r   _eval_unary_minusr   y  sb    yy|F"dkk5"==	1		e	#tT266DdKKr   c                     t        dd dg       S )NFT)rm   r   s     r   
_eval_zeror     s    E4r22r   c                 2    t        d|j                  dg       S )NTF)rm   r   r   s     r   	_eval_oner     s    D$++ub99r   c                     t        d|      )Nz4numbers besides '0' and '1' are only allowed with **r   r   s     r   _eval_numberr     s    
NPT
UUr   c                     t        |j                  j                  |j                        }t	        dd dt        |g      g      S )N)r   F)r	   r   r   r   rm   r   )r}   r^   factors      r   _eval_python_exprr     s6    

((=FE4vh0@AAr   c                        e Zd Zd Zd ZddZy)rZ   c                    i | _         | j                  ddt               | j                  ddt               | j                  ddt               | j                  ddt               | j                  ddt
               | j                  ddt               | j                  ddt               | j                  d	dt               | j                  ddt               | j                  ddt               | j                  d
dt               | j                  ddt               | j                  ddt               | j                  ddt               i | _        y )N~rB   rA   +-*/r/   z**r   r   r   r   PYTHON_EXPR)_evaluatorsadd_opr   r   r   r   r   r   r   r   r   r   r   r   r   stashr&   s    r   r   zEvaluator.__init__  s    CO,CO,C-.C./C-.C,-C12D!/0C,-C-.FAz*E1i(Ha.M1&78 
r   c                 &    || j                   ||f<   y r   )r   )r   oparityr}   s       r   r   zEvaluator.add_op  s    &/U#r   c                 t   d }t        |t              sJ |j                  t        |j                        f}|| j
                  vr$t        d|j                  d|j                         | j
                  |   | |      }|r8t        |t              s(t        |t              rt        d|      t        d|      |S )Nz#I don't know how to evaluate this 'z
' 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   rz   ry   r   r   r   rm   r   )r   r^   rY   rU   keys        r   r[   zEvaluator.eval  s    $	***yy#dii.)d&&&HL		S

  '!!#&tT2Jv7G$H&), KT  ! 	  r   N)T)r4   r5   r6   r   r   r[   r"   r   r   rZ   rZ     s    60r   rZ    T z 
 rC   rP   rS   Fz- 1z- 0z+ 1z+ 0z0 + 1z1 + 0z1 - 0z0 - 1z1 + az0 + aza - 1za - 0z1 - aa + brD   z(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)znp.log(a, base=10)z0a + np.log(a, base=10) - np . log(a , base = 10)za + (I(b) + c))rC   zI(b)cza + I(b + c)zI(b + c)rE   rC   rD   za:b:az	a:(b + c)rC   r   z	(a + b):crD   r   z	a:(b - c)zc + a:c + a:(b - c))r   r   r   z	(a - b):czb + b:c + (a - b):c)rD   r   r   z	a:b - a:bz	a:b - b:az1 - (a + b)za + b - (a + b)za * b)rC   rD   r   z	a * b * aza * (b + c))rC   rD   r   r   r   z(a + b) * c)rC   rD   r   r   r   za * (b - c)zc + a:c + a * (b - c))r   r   rC   rD   r   z(a - b) * c)rC   r   r   zb + b:c + (a - b) * c)rD   r   rC   r   r   za/bz	(a + b)/c)rC   rD   rC   rD   r   zb + b:c + (a - b)/c)rD   r   rC   r   z	a/(b + c))rC   r   r   za ** 2z(a + b + c + d) ** 2)
rC   rD   r   dr   r   rC   r   r   rD   r   r   r   z(a + b + c + d) ** 3)rC   rD   r   r   r   r   r   r   r   r   r   )rC   rD   r   )rC   r   r   )rD   r   r   za + +az~ a + bz~ a*bz	~ a*b + 0z~ -1z	0 ~ a + bz	1 ~ a + bz	y ~ a + brg   z0 + y ~ a + bz0 + y * z ~ a + b)rg   z)rg   r   z-1 ~ 1z1 + y ~ a + bz	a + b * c)rC   rD   r   r   z	a * b + c)rC   rD   r   r   z	a * b - az	a + b / c)rC   rD   r   z	a / b + c)rC   r   r   za*b:c)rC   r   r   za:b*c)r   r   r   z~ 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           
      0   |rdg|z   }t        |       t        |      k(  sJ t        | |      D ]a  \  }}t        |t              rEt        |t              r|f}|j
                  t        |D cg c]  }t        |       c}      k(  rYJ ||k(  raJ  y c c}w )Nr"   )rz   zipr   r   strr   r   r	   )rr   expected_intercept	expectedsrQ   expectedss         r   _assert_terms_matchr   r  s    D9$	u:Y'''eY/ $hdD!(C($;<<5)JA*Q-)J#KKKK8###$ *Ks   +Bc                 F   | j                         D ]  \  }}t        |      dk(  rdg f|z   }t        j                  |      }t	        t        |             t	        |       t	        |       |\  }}}}t        |j                  ||       t        |j                  ||        y )NrB   F)	itemsrz   r   r`   rc   reprr   rK   rL   )testscoderU   
model_desclhs_interceptrK   rhs_interceptrL   s           r   _do_eval_formula_testsr     s     	Rfv;!R[6)F++D1
d4jfjCI@|]LJ33]LQJ33]LQ	Rr   c                  "    t        t               y r   )r   _eval_testsr"   r   r   test_eval_formular     s
    ;'r   c                  0    ddl m}  d } | |t               y )Nr   )_parsing_error_testc                 ,    t         j                  |       S r   )r   r`   )formulas    r   <lambda>z3test_eval_formula_error_reporting.<locals>.<lambda>  s    y55g> r   )patsy.parse_formular   _eval_error_tests)r   parse_fns     r   !test_eval_formula_error_reportingr     s    7>H"34r   c                     ddl m}  t        j                  d      }|j                  d   j
                  d   j                   | ddd      k(  sJ |j                  d   j
                  d   j                   | ddd      k(  sJ y )Nr   )Originr   rA   rB         )patsy.originr   r   r`   rL   r   r   )r   descs     r   test_formula_factor_originr     s{    #!!'*DQ''*11VGQ5JJJJQ''*11VGQ5JJJJr   N)1patsyr   r   r   r   r   
patsy.evalr   r	   
patsy.utilr
   r   r   r   r   __all__objectr   r   r;   rH   r   re   rk   rm   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r   r   r   r   r   r"   r   r   <module>r      s    ? ? 2 % = 6 -+6 +\ H	& 
!U UpQ"Gv 2,(
77 
;,(L3:VB
5 5txr
x$x T2Jx $	x
 $x %x 
E2;x 
D":x 
D":x 
E2;x dBZx eR[x dBZx eR[x dSE]x  ecU^!x" ecU^#x$ dSE]%x& dBZ'x( dS#J)x* sCj!+x, dS#J'-x. tc3Z(/x0 $c
+1x2 $3x4 D3*%5x6 tc+?%@A7x: 7u;x< t/0=x> TC,-?x@ 
D:,AxB dZL!CxD $Z01ExF $Z01GxH $%IxJ D"?@KxL $%MxN D"?@OxP $QxR $SxT D":UxV bzWxX d*+YxZ $./[x\ DAB]x^ DAB_x` D01axb d$KLcxd D01exf d$KLgxh 
D3
#$ixj $34kxl D"DEmxn $56oxp tcUmqxr 	
sxP 	
Qxv tcUmwxx sCj!yxz d*+{x| %/0}x~ UBKx@ $c
#AxB $D3*-CxD %#sCj1ExF ecUD3*5GxH %!7SzJIxJ ub$#KxL dSE4#s4MxP $34QxR $34SxT $j)*UxV $./WxX $./YxZ d67[x\ d67]x` bzaxb E2;cxd D":exf r{gxh D3%=ixj dSE]kxl dSE]mxn eR[oxv' T
$
R(5Kr   