
    J/PhM                        d gZ ddlZ	 ddlmZ n# e$ r	 ddlmZ Y nw xY w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'dS )$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                   >    e Zd ZdZddZeZd ZeZ	e
d             ZdS )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
                              | _        |+t          j        | j        j        d         t
                    }t          j        |t
                    }t          |          | _
        | j
        j        dk    s| j
        j        d         dk    rt          d          | j        j        dk    s#| j        j        d         t          |          k    rt          d          | j        j        d         dk    rt          d          | j        j        d         | j
        j        d         k    rt          d          d S )	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       P/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/patsy/constraint.py__init__zLinearConstraint.__init__5   s@   ">22]2:e5#A#A#ABB
!1!!4EBBBIJy666	29==>!##t~';A'>!'C'CPQQQ:?a4:#3A#6#n:M:M#M#M4555:A!##NOOO:A$."6q"999IJJJ :9    c                 P    |rJ t          || | j        | j        | j        g          S N)r	   r   r   r   )r#   pcycles      r$   _repr_pretty_zLinearConstraint._repr_pretty_G   s5    td)4:t~F
 
 	
r&   c                    |st          d          |d         j        }|D ]}|j        |k    rt          d          t          j        d |D                       }t          j        d |D                       } | |||          S )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 matchc                     g | ]	}|j         
S  )r   .0cs     r$   
<listcomp>z,LinearConstraint.combine.<locals>.<listcomp>^   s    888q17888r&   c                     g | ]	}|j         
S r.   )r   r/   s     r$   r2   z,LinearConstraint.combine.<locals>.<listcomp>_   s    @@@qq{@@@r&   )r!   r   r   vstack)clsconstraintsr   
constraintr   r   s         r$   combinezLinearConstraint.combineO   s      	97888$Q6% 	? 	?J(N:: !=>>> ;	88K88899I@@K@@@AA	s>5)444r&   r(   )__name__
__module____qualname____doc__r%   r   __repr__r+   r
   __getstate__classmethodr8   r.   r&   r$   r   r      sl         ,K K K K  $H
 
 
 L5 5 [5 5 5r&   c                     	 ddl m}  n# t          $ r	 ddlm}  Y nw xY w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}|                    t          t          d
gddgg           |                    t          t          d
gdggg           |                    t          t          d
gddggddg           |                    t          t          d
dgddggddg           |                    t          t          d
gdggg g           |                    t          t          d
dgg            |                    t          t          d
dgt          j        d                     t          |           d S )Nr   assert_equalfoobarr   r      
      a   br   r   )numpy.testingrB   ImportErrornumpy.testing.utilsr   r   r   r   r   r   r   pytestraisesr!   r   r   )rB   lcrO   s      r$   test_LinearConstraintrR   c   s   5....... 5 5 5444444445	5%.1a&	1	1B....LQF8$$$Lu%%%	5%.Aq6Aq6*:RH	E	EBLQFQF+,,,Lrd|,,,8>RXe__,,,,<%0000 
3%1#	'	'BLQC5!!!MMM
MM*.Ax@@@
MM*.!w???
MM*.Ax!QHHH
MM*.c
aVHq!fMMM
MM*.urdCCC
MM*.c
B???
MM*.c
BHV<L<LMMMr   	 c            	          t                               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} n# t
          $ r	 ddlm} Y nw xY w || j        ddgddgg            || j        dgdgg           dd l	}|
                    t          t           j        g            |
                    t          t           j        t          dgdg          t          dgdg          g           d S )NrH   rJ   r   r   rA   )r   r8   r   rL   rB   rM   rN   r   r   rO   rP   r!   )combrB   rO   s      r$   test_LinearConstraint_combinerV      s_   ##c3Z!Q00c3Z!Q!55	
 D 3*,,,,5....... 5 5 5444444445Lq!fq!f-...L1#s,,,MMM
MM*.6;;;
MM 	3%!	%	%'7s'C'CD    s   A A-,A-,r   i=+r   d   -*   /NUMBERVARIABLEc                       fd}|S )Nc                     dk    r|}n}t          |t          g| j                                        R  |          S )N__OP__)r   r   matchspan)scannertoken_stringactual_typestringtypes      r$   
make_tokenz _token_maker.<locals>.make_token   sJ    8&KKK[&"G'-2D2D2F2F"G"G"GVVVr&   r.   )rj   ri   rk   s   `` r$   _token_makerrl      s0    W W W W W W r&   c           	         d}d}d                     d t          D                       }d}d}t          |t          d          }d                     d	 |D                       }|t	          t
          j        |           f|t	          t
          j        |           f|t	          d
|           f|t	          d|           f|t	          d|           f|d fg}t          j	        |          }	|	
                    |           \  }
}|rAt          |           t          |          z
  }t          dt          | ||dz                       |
S )Nz\(z\)|c                 @    g | ]}t          j        |j                  S r.   )reescape
token_type)r0   ops     r$   r2   z(_tokenize_constraint.<locals>.<listcomp>   s$    >>>2bi..>>>r&   z&[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?z\s+T)keyreversec                 6    g | ]}t          j        |          S r.   )rp   rq   )r0   ns     r$   r2   z(_tokenize_constraint.<locals>.<listcomp>   s     AAAQBIaLLAAAr&   rc   r`   r_   z unrecognized token in constraintr   )join_opssortedr"   rl   r   LPARENRPARENrp   Scannerscanr   r   )ri   r   	lparen_re	rparen_reop_renum_rewhitespace_revariable_relexiconrf   tokensleftoveroffsets                r$   _tokenize_constraintr      sO   IIHH>>>>>??E6FM NTBBBN((AA.AAABBK 
Lv667	Lv667	Xv../	l:v667	h//0	G j!!G||F++FH 
Vs8}},.vvvPQz0R0R
 
 	
 Mr&   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 ]j\  }}t          |t                    sJ |j        |d         k    sJ |j        t          | |d         |d                   k    sJ |j	        |d         k    sJ kdd l
}|                    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 |D             g dk    sJ <t          ddg          }t          |          dk    sJ d |D             g dk    sJ d  |D             g d!k    sJ d S )"Nz2 * (a + b) = q)rH   rJ   q)r_   r   r   2)r\   r   rE   r\   rI      ()r`   r      rH   )rY         rY   )r`   	   rF   rJ   rF      ))rX         rX   )r`         r   r   r   r   rE   z1 + @brJ   z@brH   aaza aa ac                     g | ]	}|j         
S r.   extrar0   ts     r$   r2   z-test__tokenize_constraint.<locals>.<listcomp>   s    (((A(((r&   )rH   r   rH   z2 * a[1,1],a[1,1]c                     g | ]	}|j         
S r.   )rj   r   s     r$   r2   z-test__tokenize_constraint.<locals>.<listcomp>   s    ###qAF###r&   )r_   r\   r`   rW   c                     g | ]	}|j         
S r.   r   r   s     r$   r2   z-test__tokenize_constraint.<locals>.<listcomp>   s    $$$AG$$$r&   )r   r\   r   rW   )r   r   r{   r|   zip
isinstancerj   originr   r   rO   rP   r   r"   )coder   	expectedsgotexpectedrO   namess          r$   test__tokenize_constraintr      s   D!$88F	q!S! 	r2s#!
I VY// ( (X#u%%%%%x8A;&&&&zVD(1+x{CCCCCCyHQK'''''MMM
MM*2HseDDDD6*** +c{+ = =%h666{{a(((((,<,<,<<<<<< "-(<<Fv;;!##F###'G'G'GGGGG$$V$$$(A(A(AAAAAAAr&   c                 T    t          t          | |          t          t                    S r(   )r   r   ry   _atomic)ri   r   s     r$   parse_constraintr     s    +FNCCT7S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dS )_EvalConstraintc                     || _         t          |          | _        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        d
| _        d S )N)
)r`   r   )r_   r   )rY   r   )r[   r   )rY   r   )r[   r   )r\   r   )r^   r   )rX   r   )rW   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__  si    -n%% "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"    veIdgI&!+,,,r&   c                     |j         j        }t          j        | j        dz   ft
                    }d|| j                            |          <   |S )Nr   r   )tokenr   r   r   r   r   r   index)r#   treevarr   s       r$   r   z_EvalConstraint._eval_variable!  sH    j$'A+u55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55$**++b	r&   c                 B    |                      |j        d                   S r   evalargsr#   r   s     r$   r   z _EvalConstraint._eval_unary_plus,  s    yy1&&&r&   c                 H    d|                      |j        d                   z  S )Nr   r   r   r   s     r$   r   z!_EvalConstraint._eval_unary_minus/  s    DIIdil++++r&   c                     |                      |j        d                   |                      |j        d                   z   S Nr   r   r   r   s     r$   r   z!_EvalConstraint._eval_binary_plus2  1    yy1&&49Q<)@)@@@r&   c                     |                      |j        d                   |                      |j        d                   z
  S r   r   r   s     r$   r   z"_EvalConstraint._eval_binary_minus5  r   r&   c                     |                      |j        d                   }|                      |j        d                   }|                     |          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  su    yy1&&		$)A,''&& 	F	RS   eBir&   c                 "   |                      |j        d                   }|                      |j        d                   }|                     |          r|d         |z  S |                     |          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                    t          |j                  }g }t          |          D ]M\  }}|j        dk    r=|                    |                     |d                     |j        d|z
           ||<   N|                     |d                   }|                     |d                   }|d | j                 |d | j                 z
  }t          j        |dk              rt          d|          |d          |d         z   }	t          | j        ||	          }
|                    |
           t                              |          S )NrX   Tr7   r   r   z!no variables appear in constraintr   )r   r   	enumeraterj   appendr   r   r   r   r   r   r   r8   )r#   r   r   r6   iargr   r   r   constantr7   s              r$   r   z_EvalConstraint._eval_binary_eqM  s3   DIoo 	* 	*FAsx3""499ST9#B#BCCC (1q5/Qyya!!		$q'""YtwY%	$'	"226%1* 	H@$GGGH9uRy(%d&:E8LL
:&&&''444r&   c                     |                      |j        d         d          }|                      |j        d         d          }t                              ||g          S )Nr   Tr   r   )r   r   r   r8   r   s       r$   r   z"_EvalConstraint._eval_binary_commaa  sP    yy1$y77		$)A,4	88''u666r&   Fc                    |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)rj   r"   r   r   r   r   sizer   r   r   r   r   )r#   r   r7   rt   vals        r$   r   z_EvalConstraint.evalf  s    y#di..)dn$$$$!dnS!$'' 	#/00 X
x47Q;....6#ii.A-.. R$%JDQQQ'(<c)DG)nsSUwhWWW #/00 G !?FFFJr&   N)F)r9   r:   r;   r%   r   r   r   r   r   r   r   r   r   r   r   r   r.   r&   r$   r   r     s        
 
 
0- - -    
' ' ', , ,A A AA A A     
 
 
5 5 5(7 7 7
     r&   r   c                    t          | t                    r(| j        |k    rt          d| j        d|d          | S t          | t                    r"t          j        t          |           t          |          ft                    }t          j        t          |                     }t                      }t          |                                           D ]\  }\  }}||v r|                    |          }n*t          |t                    r|}nt          d|          ||v rt          d||                   |                    |           d|||f<   |||<   t          |||          S t          | t                    r| g} t          | t                     r| rt          | d         t                    rg }	| D ]r}
t          |
t                    st          d	|
          t#          |
|          }t%          |          }|	                    |                    |d
                     st                              |	          S t          | t,                    r8t          |           dk    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   r8   tupler   )constraint_liker   r   r   usedr   namevalueidxr6   r   r   	evaluatorcoefs                 r$   linear_constraintr   z  s    /#344 )^;;* #111>>>C  
 /7++ B #o..N0C0CDERRRHS1122	uu )/*?*?*A*A B B 	! 	!A}e~%%$**400D#&& R j$$!PQQQd{{ j.QTBUBU!WXXXHHSMMME!S&M IaLLyAAA/3'' ,*+ 	?D))55 q)3//5
 # 	F 	FDdC(( H j!FGGG#D.99D'77Iy~~dt~DDEEEE''444/5)) A1$$BCCC)ii@@@ Je444ENE222r&   c                    	 ddl m} n# t          $ r	 ddlm} Y nw xY wt	          | |          }t          d|           t          |||          }t          d|            ||j        |j                    ||j        |j                    ||j	        |j	                    ||j        j
        t          j
        t                                ||j	        j
        t          j
        t                               d S )Nr   rA   r   r   )rL   rB   rM   rN   r   printr   r   r   r   r   r   r   )inputvarnamesr   r   rB   r   r   s          r$   _check_linconr     s   5....... 5 5 5444444445
E8
,
,C	%%;;H	*hL#X%<===LHN+++L 2333L"(5//222L$bhuoo66666rS   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           |                     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           |                     t          t          ddiddg           |                     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           |                     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           |                     t          t          ddgdgdgfddg           |                     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           |                     t          t          d ddg           d S )0Nr   )OrderedDictrH   rJ   r   rE   r   )rH   r   )rJ   rE   rK   )r   rE   r   )rH   r   rI   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rH   rJ   r1   )r   r   r   )r   r   r   )r   r   r   z	a + 1 = 2za + 1rF   rG      (   #   )
rO   patsy.compatr   r   r   rP   r!   r   r   array)rO   r   r   s      r$   test_linear_constraintr    s   MMM((((((AASzAq6**S#J!QA3%HHH
MM%'7c
QF'K'KcSVZ   AsAhc
aVHse,,,Akk8X&''#sq!fq!f5EaSzRRRAkk8X&''#sq!fq!f5EaSzRRRAq!fsCjAq6(aSE***Akk66"##c3Z1a&1a&1AQC!:NNNAkk8V$%%SzQFQF3CqcA3ZPPP
MM*/#qC:FFF
MM*/qQ#sLLLAbh1vc
aVHse444AbhAA  3*1v1v.>!qc
KKKAgSzQF8qcU+++AgSzQF8qcU+++AkC:Ax1#///AkC:Ax1#///AnsCjAq6Aq6"2aS1#J???AnsCjAq6Aq6"2aS1#J???Aw3*1v1v&6!qc
CCC
MM*/#Qx3*MMM A-	c

[	
	   Ai#sr1gY!...A3*2wA&71#sDDDAc3Z1a&1a&1a&)AQC!qc?SSSAgSzQF8qcU+++Ahc
b!WIu---A#sq!fXu555AkC:AB0A3+>>>Amc3Z1b'Aq6!2bTA3K@@@A	JJJ


+
qcA3	   AkC>QF8qcU333ABx"c
b"XJ"777Ar(RH	rd|,	c

bB8
t	   MM*/1a&1#s1Cc3ZPPP
MM*/1a&S#JGGGAr2hc
b"XJ!...ABx"bS#J"bB8(<sQCjIIIAbhBx3*BxjA3%888AbhR2r(#$$sCjB8b"X2F!qc
SSS MM*/SzBBBB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                  6    d } t          | t                     d S )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66666r&   )(__all__rp   collections.abcr   rM   collectionsnumpyr   patsyr   patsy.originr   
patsy.utilr   r   r	   r
   r   patsy.infix_parserr   r   r   patsy.parse_formular   objectr   rR   rV   ry   r   rl   r   r   r   r   r   r   r  r  r  r.   r&   r$   <module>r     s   
 				$''''''' $ $ $########$                              < ; ; ; ; ; ; ; ; ; 3 3 3 3 3 3B5 B5 B5 B5 B5v B5 B5 B5J" " "J  4 HS!THS!QHS!SHS!SHS!SHS!SHS!SHS!S	 Z
     >%B %B %BPT T Tr r r r rf r r rj;3 ;3 ;3|7 7 7 PC PC PCf   $7 7 7 7 7s    