
    gM                        d gZ ddlZ	 ddlm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 e      Zd
 Z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 Zd Zd Z d Z! G d de      Z"d Z#d  Z$d! Z%g d"Z&d# Z'y# e$ r	 ddlmZ Y w xY w)$LinearConstraint    N)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                   6    e Zd ZdZddZeZd ZeZ	e
d        Zy)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                 $   t        |      | _        t        j                  t        j                  |t
                    | _        |2t        j                  | j                  j                  d   t
              }t        j                  |t
              }t        |      | _
        | j                  j                  dk7  s| j                  j                  d   dk7  rt        d      | j                  j                  dk7  s%| j                  j                  d   t        |      k7  rt        d      | j                  j                  d   dk(  rt        d      | j                  j                  d   | j                  j                  d   k7  rt        d      y )	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np
atleast_2dasarrayfloatcoefszerosshaper   	constantsndim
ValueErrorlen)selfr   r   r   s       M/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/patsy/constraint.py__init__zLinearConstraint.__init__5   s0   ">2]]2::e5#AB
!1!1!!4EBIJJy6	29=>>!#t~~';';A'>!'CPQQ::??a4::#3#3A#6#n:M#M455::A!#NOO::A$.."6"6q"99IJJ :    c                 f    |rJ t        || | j                  | j                  | j                  g      S N)r	   r   r   r   )r#   pcycles      r$   _repr_pretty_zLinearConstraint._repr_pretty_G   s3    ytd))4::t~~F
 	
r&   c                 X   |st        d      |d   j                  }|D ]  }|j                  |k7  st        d       t        j                  |D cg c]  }|j                   c}      }t        j                  |D cg c]  }|j
                   c}      } | |||      S c c}w c c}w )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 match)r!   r   r   vstackr   r   )clsconstraintsr   
constraintcr   r   s          r$   combinezLinearConstraint.combineO   s     788$Q66% 	?J((N: !=>>	? 		K8q17789IIK@qq{{@A	>5)44 9@s   B">B'r(   )__name__
__module____qualname____doc__r%   r   __repr__r+   r
   __getstate__classmethodr2    r&   r$   r   r      s2    ,K  $H
 L5 5r&   c                     	 ddl m}  t	        ddgddg      }|j
                  ddgk(  sJ  | |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        j                  t              k(  sJ |j                  j                  t        j                  t              k(  sJ t	        d
gdgg      } | |j                  dgg       dd l}|j                  t        t        d
gddgg       |j                  t        t        d
gdggg       |j                  t        t        d
gddggddg       |j                  t        t        d
dgddggddg       |j                  t        t        d
gdggg g       |j                  t        t        d
dgg        |j                  t        t        d
dgt        j                  d             t        |       y # t        $ r
 ddlm}  Y 6w xY w)Nr   assert_equalfoobarr   r      
      a   br   r   )numpy.testingr=   ImportErrornumpy.testing.utilsr   r   r   r   r   r   r   pytestraisesr!   r   r   )r=   lcrJ   s      r$   test_LinearConstraintrM   c   s   5. 
5%.1a&	1B...QF8$u%	5%.Aq6Aq6*:RH	EBQFQF+,rd|,88>>RXXe_,,,<<%000 
3%1#	'BQC5!
MM*.Ax@
MM*.!w?
MM*.Ax!QH
MM*.c
aVHq!fM
MM*.urdC
MM*.c
B?
MM*.c
BHHV<LMr?  5445s   H, ,H?>H?c            	         t         j                  t        ddgddg      t        ddgddgdg      g      } | j                  ddgk(  sJ 	 ddlm}  || j                  ddgddgg        || j                  dgdgg       dd l	}|j                  t        t         j                  g        |j                  t        t         j                  t        dgdg      t        dgdg      g       y # t
        $ r	 ddlm} Y w xY w)NrC   rE   r   r   r<   )r   r2   r   rG   r=   rH   rI   r   r   rJ   rK   r!   )combr=   rJ   s      r$   test_LinearConstraint_combinerP      s    ##c3Z!Q0c3Z!Q!5	
D 3*,,,5. q!fq!f-.1#s,
MM*.66;
MM  	3%!	%'7s'CD  545s   
C) )C;:C;,r   i=+r   d   -*   /NUMBERVARIABLEc                       fd}|S )Nc                 v    dk(  r|}n}t        |t        g| j                  j                          |      S )N__OP__)r   r   matchspan)scannertoken_stringactual_typestringtypes      r$   
make_tokenz _token_maker.<locals>.make_token   s;    8&KK[&"G'--2D2D2F"GVVr&   r:   )rd   rc   re   s   `` r$   _token_makerrf      s    W r&   c           	         d}d}dj                  t        D cg c]!  }t        j                  |j                        # c}      }d}d}t        |t        d      }dj                  |D cg c]  }t        j                  |       c}      }	|t        t        j                  |       f|t        t        j                  |       f|t        d|       f|	t        d	|       f|t        d
|       f|d fg}
t        j                  |
      }|j                  |       \  }}|r1t        |       t        |      z
  }t        dt        | ||dz               |S c c}w c c}w )Nz\(z\)|z&[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?z\s+T)keyreverser]   rZ   rY   z unrecognized token in constraintr   )join_opsreescape
token_typesortedr"   rf   r   LPARENRPARENScannerscanr   r   )rc   r   	lparen_re	rparen_reopop_renum_rewhitespace_renvariable_relexiconr`   tokensleftoveroffsets                  r$   _tokenize_constraintr      s;   IIHH>2bii.>?E6FM NTBN((.AQBIIaLABK 
Lv67	Lv67	Xv./	l:v67	h/0	G jj!G||F+FHVs8},.vvvPQz0R
 	
 M3 ? Bs   &E*Ec            
      .   d} t        | g d      }ddt        j                  dddfdd	d
t        j                  dddfddg	}t	        ||      D ]a  \  }}t        |t              sJ |j                  |d   k(  sJ |j                  t        | |d   |d         k(  sJ |j                  |d   k(  raJ  dd l
}|j                  t        t         ddg       t        ddg       ddgddgfD ]?  }t        d|      }t        |      dk(  sJ |D cg c]  }|j                   c}g dk(  r?J  t        ddg      }t        |      dk(  sJ |D cg c]  }|j                   c}g dk(  sJ |D cg c]  }|j                   c}g dk(  sJ y c c}w c c}w c c}w )Nz2 * (a + b) = q)rC   rE   q)rY   r   r   2)rV   r   r@   rV   rD      ()rZ   r      rC   )rS         rS   )rZ   	   rA   rE   rA      ))rR         rR   )rZ         r   r   r   r   r@   z1 + @brE   z@brC   aaza aa a)rC   r   rC   z2 * a[1,1],a[1,1])rY   rV   rZ   rQ   )r   rV   r   rQ   )r   r   rq   rr   zip
isinstancerd   originr   extrarJ   rK   r   r"   )coder~   	expectedsgotexpectedrJ   namests           r$   test__tokenize_constraintr      s   D!$8F	q!S! 	r2s#!
I VY/ (X#u%%%xx8A;&&&zzVD(1+x{CCCCyyHQK'''	( 
MM*2HseDD6* +c{+ =%h66{a!'(A(,<<<<= "-(<Fv;!"#qAFF#'GGGG#$AGG$(AAAA )
 $$s   	F	F*Fc                 @    t        t        | |      t        t              S r(   )r   r   rl   _atomic)rc   r   s     r$   parse_constraintr     s    +FNCT7SSr&   c                   \    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dZy)_EvalConstraintc                    || _         t        |      | _        | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d
| _        y )N)
)rZ   r   )rY   r   )rS   r   )rU   r   )rS   r   )rU   r   )rV   r   )rX   r   )rR   r   )rQ   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   s     r$   r%   z_EvalConstraint.__init__  s{    -n% "00,,++,,,,--00++**--
r&   c                 L    t        j                  |d | j                   dk(        S Nr   )r   allr   )r#   r   s     r$   is_constantz_EvalConstraint.is_constant  s!    vveIdgg&!+,,r&   c                     |j                   j                  }t        j                  | j                  dz   ft
              }d|| j                  j                  |      <   |S )Nr   r   )tokenr   r   r   r   r   r   index)r#   treevarr   s       r$   r   z_EvalConstraint._eval_variable!  sK    jj$''A+u512d""((-.r&   c                     t        j                  | j                  dz   ft              }t        |j                  j
                        |d<   |S )Nr   r   )r   r   r   r   r   r   )r#   r   r   s      r$   r   z_EvalConstraint._eval_number'  s9    $''A+u5$****+b	r&   c                 >    | j                  |j                  d         S r   evalargsr#   r   s     r$   r   z _EvalConstraint._eval_unary_plus,  s    yy1&&r&   c                 D    d| j                  |j                  d         z  S )Nr   r   r   r   s     r$   r   z!_EvalConstraint._eval_unary_minus/  s    DIIdiil+++r&   c                 |    | j                  |j                  d         | j                  |j                  d         z   S Nr   r   r   r   s     r$   r   z!_EvalConstraint._eval_binary_plus2  /    yy1&499Q<)@@@r&   c                 |    | j                  |j                  d         | j                  |j                  d         z
  S r   r   r   s     r$   r   z"_EvalConstraint._eval_binary_minus5  r   r&   c                     | j                  |j                  d         }| j                  |j                  d         }| j                  |      st        d|j                  d         ||d   z  S )Nr   r   z1Can't divide by a variable in a linear constraintr   r   r   r   r   r#   r   leftrights       r$   r   z _EvalConstraint._eval_binary_div8  sh    yy1&		$))A,'&F		RS  eBir&   c                     | j                  |j                  d         }| j                  |j                  d         }| j                  |      r|d   |z  S | j                  |      r||d   z  S t        d|      )Nr   r   r   z=Can't multiply one variable by another in a linear constraintr   r   s       r$   r   z%_EvalConstraint._eval_binary_multiplyA  s{    yy1&		$))A,'D!8e##e$%)##RTX r&   c                 L   t        |j                        }g }t        |      D ]L  \  }}|j                  dk(  s|j	                  | j                  |d             |j                  d|z
     ||<   N | j                  |d         }| j                  |d         }|d | j                   |d | j                   z
  }t        j                  |dk(        rt        d|      |d    |d   z   }	t        | j                  ||	      }
|j	                  |
       t        j                  |      S )NrR   Tr0   r   r   z!no variables appear in constraintr   )r   r   	enumeraterd   appendr   r   r   r   r   r   r   r2   )r#   r   r   r/   iargr   r   r   constantr0   s              r$   r   z_EvalConstraint._eval_binary_eqM  s   DIIo 	*FAsxx3""499ST9#BC ((1q5/Q	* yya!		$q'"Ytww%	$''"2266%1*@$GGH9uRy(%d&:&:E8L
:&''44r&   c                     | j                  |j                  d   d      }| j                  |j                  d   d      }t        j                  ||g      S )Nr   Tr   r   )r   r   r   r2   r   s       r$   r   z"_EvalConstraint._eval_binary_commaa  sK    yy1$y7		$))A,4	8''u66r&   c                    |j                   t        |j                        f}|| j                  v sJ  | j                  |   |      }|rt	        |t
              r|S |j                  | j                  dz   k(  sJ t        j                  |d | j                   dk(        rt        d|      t        | j                  |d | j                   |d          S t	        |t
              rt        d|      |S )Nr   r   z#term is constant, with no variablesr   zunexpected constraint object)rd   r"   r   r   r   r   sizer   r   r   r   r   )r#   r   r0   ri   vals        r$   r   z_EvalConstraint.evalf  s    yy#dii.)dnn$$$!dnnS!$'#/0
xx477Q;...66#i.A-.$%JDQQ'(<(<c)DGGnsSUwhWW #/0 !?FFJr&   N)F)r3   r4   r5   r%   r   r   r   r   r   r   r   r   r   r   r   r   r:   r&   r$   r   r     sE    
0-
',AA 
5(7
r&   r   c                    t        | t              r-| j                  |k7  rt        d| j                  d|d      | S t        | t              rt        j                  t        |       t        |      ft              }t        j                  t        |             }t               }t        | j                               D ]q  \  }\  }}||v r|j                  |      }n!t        |t              r|}nt        d|      ||v rt        d||         |j                  |       d|||f<   |||<   s t        |||      S t        | t              r| g} t        | t               r| rt        | d   t              rug }	| D ]Y  }
t        |
t              st        d	|
      t#        |
|      }t%        |      }|	j'                  |j)                  |d
             [ t        j+                  |	      S t        | t,              r+t        |       dk7  rt        d      | \  }}t        |||      S t        j.                  | t              }t        ||      S )zaThis is the internal interface implementing
    DesignInfo.linear_constraint, see there for docs.z/LinearConstraint has wrong variable_names (got z, expected r   r   z!unrecognized variable name/index zduplicated constraint on r   r   zexpected a string, not Tr   r   z#constraint tuple must have length 2)r   r   r   r!   r   r   r   r"   r   setr   itemsr   intaddstrr   r   r   r   r   r2   tupler   )constraint_liker   r   r   usedr   namevalueidxr/   r   r   	evaluatorcoefs                 r$   linear_constraintr   z  s.    /#34))^; #11>C 
 /7+ #o.N0CDERHHS12	u )/*?*?*A B 	!A}e~%$**40D#& $!PQQd{ .QTBU!WXXHHSME!S&M IaL	!  yAA/3'*+ 	?D)q)3/# 	FDdC( !FGG#D.9D'7Iy~~dt~DE	F  ''44/5)1$BCC)ii@@ JJe4ENE22r&   c                    	 ddl m} t	        | |      }t        d|       t        |||      }t        d|        ||j                  |j                          ||j                  |j                          ||j                  |j                          ||j                  j                  t        j                  t                      ||j                  j                  t        j                  t                     y # t        $ r
 ddlm} Y w xY w)Nr   r<   r   r   )rG   r=   rH   rI   r   printr   r   r   r   r   r   r   )inputvarnamesr   r   r=   r   r   s          r$   _check_linconr     s    5. E8
,C	%%;H	*h##X%<%<=HNN+ 2 23"((5/2$$bhhuo6  5445s   C9 9DDc            	         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       | j                  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       | j                  t        t        ddiddg       | j                  t        t        dddddg        |t        j                  ddg      ddgddggdgg        |t        j                  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       | j                  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$g d%g d&g d'g d(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       | j                  t        t        ddgdgdgfddg       | j                  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        j                  d+d,g      ddgd+d,ggdgg        |t        j                  d+d,gd,d.gg      ddgd+d,gd,d.ggdgdgg       | j                  t        t        d ddg       y )0Nr   )OrderedDictrC   rE   r   r@   r   )rC   r   )rE   r@   rF   )r   r@   r   )rC   r   rD   r   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 * -az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 = crC   rE   r1   )r   r   r   )r   r   r   )r   r   r   z	a + 1 = 2za + 1rA   rB      (   #   )
rJ   patsy.compatr   r   r   rK   r!   r   r   array)rJ   r   r   s      r$   test_linear_constraintr     s   (ASzAq6*S#J!QA3%H
MM%'7c
QF'KcSVZ sAhc
aVHse,k8X&'#sq!fq!f5EaSzRk8X&'#sq!fq!f5EaSzRq!fsCjAq6(aSE*k66"#c3Z1a&1a&1AQC!:Nk8V$%SzQFQF3CqcA3ZP
MM*/#qC:F
MM*/qQ#sLbhh1vc
aVHse4bhhAA 3*1v1v.>!qc
KgSzQF8qcU+gSzQF8qcU+kC:Ax1#/kC:Ax1#/nsCjAq6Aq6"2aS1#J?nsCjAq6Aq6"2aS1#J?w3*1v1v&6!qc
C
MM*/#Qx3*M -	c

[	
	 i#sr1gY!.3*2wA&71#sDc3Z1a&1a&1a&)AQC!qc?SgSzQF8qcU+hc
b!WIu-#sq!fXu5kC:AB0A3+>mc3Z1b'Aq6!2bTA3K@	J
+
qcA3	 kC>QF8qcU3Bx"c
b"XJ"7r(RH	rd|,	c

bB8
t	 MM*/1a&1#s1Cc3ZP
MM*/1a&S#JGr2hc
b"XJ!.Bx"bS#J"bB8(<sQCjIbhhBx3*BxjA3%8bhhR2r(#$sCjB8b"X2F!qc
S MM*/SzBr&   )
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                  *    d } t        | t               y )Nc                     t        | g d      S )Nr   )r   )bad_codes    r$   doitztest_eval_errors.<locals>.doit.  s     ?;;r&   )r   _parse_eval_error_tests)r   s    r$   test_eval_errorsr   -  s    < 56r&   )(__all__rm   collections.abcr   rH   collectionsnumpyr   patsyr   patsy.originr   
patsy.utilr   r   r	   r
   r   patsy.infix_parserr   r   r   patsy.parse_formular   objectr   rM   rP   rl   r   rf   r   r   r   r   r   r   r   r   r   r:   r&   r$   <module>r     s$   
 	$'     < ; 3B5v B5J"J4 S!TS!QS!SS!SS!SS!SS!SS!S	 Z
 >%BPTrf rj;3|7 PCf $7  $#$s   C CC