
    .Cc8O                        d dl mZ 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	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 )%    )print_functionLinearConstraintN)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       0lib/python3.11/site-packages/patsy/constraint.py__init__zLinearConstraint.__init__2   sW   ">22]2:e5#A#A#ABB
 	C!1!!4EBBBIJy666	29==>!# 	Rt~';A'>!'C 	RPQQQ:?a 	64:#3A#6#n:M:M#M 	64555:A!# 	PNOOO:A$."6q"99 	KIJJJ	K 	K    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_C   s8    4!%!4dj$. QS S 	S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>Y   s    ;;;!ag;;;r'   c                     g | ]	}|j         
S r/   )r    r0   s     r%   r3   z,LinearConstraint.combine.<locals>.<listcomp>Z   s    !C!C!C!!+!C!C!Cr'   )r"   r   r   	row_stack)clsconstraintsr   
constraintr   r    s         r%   combinezLinearConstraint.combineJ   s      	97888$Q6% 	? 	?J(N: ? !=>>>?;;{;;;<<L!C!C{!C!C!CDD	s>5)444r'   r)   )__name__
__module____qualname____doc__r&   r	   __repr__r,   r   __getstate__classmethodr9   r/   r'   r%   r   r      so         *K K K K  $HS S S
 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.testingrC   ImportErrornumpy.testing.utilsr   r   r   r    r   r   r   pytestraisesr"   r   r   )rC   lcrP   s      r%   test_LinearConstraintrS   ]   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
(6""$ $ $ 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 )NrI   rK   r   r   rB   )r   r9   r   rM   rC   rN   rO   r   r    rP   rQ   r"   )combrC   rP   s      r%   test_LinearConstraint_combinerW      sd   ##%5sCj1a&%I%I%5sCj1a&1#%N%N%P Q Q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*.6#SEA3//1A3%!1M1MNP P P P P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   sT    8 	&KKK[F:W]%7%7%9%9:::!# # 	#r'   r/   )rk   rj   rl   s   `` r%   _token_makerrm      s*    # # # # # # 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)r1   ops     r%   r3   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/   )rq   rr   )r1   ns     r%   r3   z(_tokenize_constraint.<locals>.<listcomp>   s     AAAQBIaLLAAAr'   rd   ra   r`   z unrecognized token in constraintr   )join_opssortedr#   rm   r   LPARENRPARENrq   Scannerscanr   r   )rj   r   	lparen_re	rparen_reop_renum_rewhitespace_revariable_relexiconrg   tokensleftoveroffsets                r%   _tokenize_constraintr      sS   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}},;"666A:>>@ @ 	@ 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)rI   rK   q)r`   r   r   2)r]   r   rF   r]   rJ      ()ra   r      rI   )rZ         rZ   )ra   	   rG   rK   rG      ))rY         rY   )ra         r   r   r   r   rF   z1 + @brK   z@brI   aaza aa ac                     g | ]	}|j         
S r/   extrar1   ts     r%   r3   z-test__tokenize_constraint.<locals>.<listcomp>   s    (((A(((r'   )rI   r   rI   z2 * a[1,1],a[1,1]c                     g | ]	}|j         
S r/   )rk   r   s     r%   r3   z-test__tokenize_constraint.<locals>.<listcomp>   s    ###qAF###r'   )r`   r]   ra   rX   c                     g | ]	}|j         
S r/   r   r   s     r%   r3   z-test__tokenize_constraint.<locals>.<listcomp>   s    $$$AG$$$r'   )r   r]   r   rX   )r   r   r|   r}   zip
isinstancerk   originr   r   rP   rQ   r   r#   )coder   	expectedsgotexpectedrP   namess          r%   test__tokenize_constraintr      s   D!$88F&!,1c*(!),B,#*,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   rz   _atomic)rj   r   s     r%   parse_constraintr      s&    +FNCCW& & &r'   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)
)ra   r   )r`   r   )rZ   r   )r\   r   )rZ   r   )r\   r   )r]   r   )r_   r   )rY   r   )rX   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!    veHTWHo*+++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_plus   1    yy1&&49Q<)@)@@@r'   c                     |                      |j        d                   |                      |j        d                   z
  S r   r   r   s     r%   r   z"_EvalConstraint._eval_binary_minus#  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_div&  su    yy1&&		$)A,''&& 	< -.2il< < <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_multiply.  s    yy1&&		$)A,''D!! 	@8e##e$$ 	@%)## 9:>@ @ @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 )NrY   Tr8   r   r   z!no variables appear in constraintr   )r   r   	enumeraterk   appendr   r   r   r   r   r   r   r9   )r$   r   r   r7   iargr   r   r   constantr8   s              r%   r   z_EvalConstraint._eval_binary_eq9  s5   DIoo 	* 	*FAsx3 *""499ST9#B#BCCC (1q5/Qyya!!		$q'""XdgXxx0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   r9   r   s       r%   r   z"_EvalConstraint._eval_binary_commaM  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)rk   r#   r   r   r   r   sizer   r   r   r   r   )r$   r   r8   ru   vals        r%   r   z_EvalConstraint.evalR  s
   y#di..)dn$$$$!dnS!$'' 	#/00 	2
x47Q;....6#htwh-1,-- .$%J(,. . .'(<(+HTWH),R2 2 2
 #/00 G !?FFFJr'   N)F)r:   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          t          j        |                     D ]\  }\  }}||v r|                    |          }n/t          |t          j                  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   six	iteritemsr   integer_typesaddstrr   r   r   r   r   r9   tupler   )constraint_liker   r   r    usedr   namevalueidxr7   r   r   	evaluatorcoefs                 r%   linear_constraintr   h  s    /#344 )^; 	1* / > > > .0 1 1 1 /7++ B #o..N0C0CD$& & &HS1122	uu )#-*H*H I I 	! 	!A}e~% ,$**400D#"344 , j$(D"+ , , ,d{ ; j$23$7$7": ; ; ;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$ 	D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   rB   r   r   )rM   rC   rN   rO   r   printr   r   r   r    r   r   r   )inputvarnamesr   r    rC   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6rT   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   )OrderedDictrI   rK   r   rF   r   )rI   r   )rK   rF   rL   )r   rF   r   )rI   r   rJ   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rI   rK   r2   )r   r   r   )r   r   r   )r   r   r   z	a + 1 = 2za + 1rG   rH      (   #   )
rP   patsy.compatr   r   r   rQ   r"   r   r   array)rP   r   r   s      r%   test_linear_constraintr    s   MMM((((((AASzAq6**S#J!QA3%HHH
MM*/"C:1v66*   AsAhc
aVHse,,,Akk8X&''
CjAq6Aq6"aS1#J0 0 0Akk8X&''
CjAq6Aq6"aS1#J0 0 0 Aq!fsCjAq6(aSE***Akk66"##c3Z1a&1a&1AQC!:NNNAkk8V$%%
CjAq6Aq6"aS1#J0 0 0 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+c3Z	9~)' ' 'Ai#sr1gY!...A3*2wA&71#sDDDAc3Z	1v1v1v!qcA31 1 1AgSzQF8qcU+++Ahc
b!WIu---A#sq!fXu555AkC:AB0A3+>>>Amc3Z1b'Aq6!2bTA3K@@@A///yy***jjj)QC!qc?< < < AkC>QF8qcU333ABx"c
b"XJ"777AR2r(rdRD\*S#J
Bx"bbTB4L* * * MM*/q6A3$sCj2 2 2
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(#$$sCj
Bx"baS1#J( ( ( 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'   )+
__future__r   __all__rq   collections.abcr   rN   collectionsr   numpyr   patsyr   patsy.originr   
patsy.utilr   r	   r
   r   r   patsy.infix_parserr   r   r   patsy.parse_formular   objectr   rS   rW   rz   r   rm   r   r   r   r   r   r   r  r  r	  r/   r'   r%   <module>r     s   & % % % % % 
 				$''''''' $ $ $########$ 



                9 9 9 9 9 9 9 9 9 9 9 9 9 9 < ; ; ; ; ; ; ; ; ; 3 3 3 3 3 3?5 ?5 ?5 ?5 ?5v ?5 ?5 ?5B# # #JP P P$ HS!THS!QHS!SHS!SHS!SHS!SHS!SHS!S Z
 	 	 	  :"B "B "BH& & &s s s s sf s s sj;3 ;3 ;3|7 7 7 IC IC ICX   $7 7 7 7 7s    $$