ó
< Õ[c           @  sù  d  d l  m Z d g Z d  d l Z d  d l m Z 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 d e f d
 „  ƒ  YZ 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" d e f d  „  ƒ  YZ# d! „  Z$ d" „  Z% d# „  Z& d$ d% d& d' d( d) d* d+ d, d- g
 Z' d. „  Z( d S(/   iÿÿÿÿ(   t   print_functiont   LinearConstraintN(   t   Mapping(   t
   PatsyError(   t   Origin(   t   atleast_2d_column_defaultt   repr_pretty_delegatet   repr_pretty_implt   no_picklingt   assert_no_pickling(   t   Tokent   Operatort   infix_parse(   t   _parsing_error_testc           B  s>   e  Z d  Z d d „ Z e Z d „  Z e Z	 e
 d „  ƒ Z RS(   sp  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.)
    c         C  sN  t  | ƒ |  _ t j t j | d t ƒƒ |  _ | d  k r^ t j |  j j	 d d t ƒ} n  t j | d t ƒ} t
 | ƒ |  _ |  j j d k sª |  j j	 d d k r¹ t d ƒ ‚ n  |  j j d k sç |  j j	 d t | ƒ k rö t d ƒ ‚ n  |  j j	 d d k rt d ƒ ‚ n  |  j j	 d |  j j	 d k rJt d ƒ ‚ n  d  S(	   Nt   dtypei    i   i   s1   constants is not (convertible to) a column matrixs   wrong shape for coefss/   must have at least one row in constraint matrixs*   shape mismatch between coefs and constants(   t   listt   variable_namest   npt
   atleast_2dt   asarrayt   floatt   coefst   Nonet   zerost   shapeR   t	   constantst   ndimt
   ValueErrort   len(   t   selfR   R   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   __init__/   s    !"(. c         C  s/   | s t  ‚ t | |  |  j |  j |  j g ƒ S(   N(   t   AssertionErrorR   R   R   R   (   R   t   pt   cycle(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   _repr_pretty_@   s    	c         C  s«   | s t  d ƒ ‚ n  | d j } x, | D]$ } | j | k r) t  d ƒ ‚ q) q) Wt j g  | D] } | j ^ q^ ƒ } t j g  | D] } | j ^ qƒ ƒ } |  | | | ƒ S(   s  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.
        s   no constraints specifiedi    s   variable names don't match(   R   R   R   t	   row_stackR   R   (   t   clst   constraintsR   t
   constraintt   cR   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   combineG   s    	%%N(   t   __name__t
   __module__t   __doc__R   R   R   t   __repr__R"   R   t   __getstate__t   classmethodR(   (    (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR      s   	c          C  s‡  y d d l  m }  Wn! t k
 r7 d d l m }  n Xt d d g d d g ƒ } | j d d g k sn t ‚ |  | 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,t ‚ | j j	 t
 j	 t ƒ k sMt ‚ t d g d g g ƒ } |  | j d g g ƒ d d l m } | 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(   Niÿÿÿÿ(   t   assert_equalt   foot   bari   i    i   i   i
   i   t   a(   t   assert_raisesi   t   b(   i    i   (   t   numpy.testingR/   t   ImportErrort   numpy.testing.utilsR   R   R   R   R   R   R   R   t
   nose.toolsR3   R   R   R	   (   R/   t   lcR3   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   test_LinearConstraintZ   s2    0"!!(+"c          C  s4  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` t ‚ y d d l m } Wn! t k
 r— d d l m } n X| |  j d d g d d g g ƒ | |  j	 d g d g g ƒ d d l
 m } | t t  j g  ƒ | t t  j t  d g d g ƒ t  d g d g ƒ g ƒ d  S(   NR2   R4   i   i    iÿÿÿÿ(   R/   (   R3   (   R   R(   R   R   R5   R/   R6   R7   R   R   R8   R3   R   (   t   combR/   R3   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   test_LinearConstraint_combine   s    '"t   ,i   iœÿÿÿt   =i    t   +i   id   t   -t   *iÈ   t   /t   NUMBERt   VARIABLEc           s   ‡  ‡ f d †  } | S(   Nc           s=   ˆ d k r | } n ˆ } t  | t ˆ  |  j j ƒ  Œ | ƒ S(   Nt   __OP__(   R
   R   t   matcht   span(   t   scannert   token_stringt   actual_type(   t   stringt   type(    s/   lib/python2.7/site-packages/patsy/constraint.pyt
   make_token¡   s    	(    (   RL   RK   RM   (    (   RK   RL   s/   lib/python2.7/site-packages/patsy/constraint.pyt   _token_maker    s    c         C  s^  d } d } d j  g  t D] } t j | j ƒ ^ q ƒ } d } d } t | d t d t ƒ} d j  g  | D] } t j | ƒ ^ qk ƒ }	 | t t	 j
 |  ƒ f | t t	 j |  ƒ f | t d |  ƒ f |	 t d	 |  ƒ f | t d
 |  ƒ f | d  f g }
 t j |
 ƒ } | j |  ƒ \ } } | rZt |  ƒ t | ƒ } t d t |  | | d ƒ ƒ ‚ n  | S(   Ns   \(s   \)t   |s&   [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?s   \s+t   keyt   reverseRE   RD   RC   s    unrecognized token in constrainti   (   t   joint   _opst   ret   escapet
   token_typet   sortedR   t   TrueRN   R
   t   LPARENt   RPARENR   t   Scannert   scanR   R   (   RK   R   t	   lparen_ret	   rparen_ret   opt   op_ret   num_ret   whitespace_ret   nt   variable_ret   lexiconRH   t   tokenst   leftovert   offset(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   _tokenize_constraint«   s(    .+c          C  s4  d }  t  |  d d d g ƒ } d& d' t j d d d f d( d) d* t j d d d f d+ d, g	 } x t | | ƒ D]| \ } } t | t ƒ sŽ t ‚ | j | d k s§ t ‚ | j t	 |  | d | d
 ƒ k sÐ t ‚ | j
 | d k sm t ‚ qm Wd d l m } | t t  d d g ƒ t  d d  g ƒ xx d d! g d! d g f D]^ } t  d" | ƒ } t | ƒ d k sit ‚ g  | D] } | j
 ^ qpd d! d g k s<t ‚ q<Wt  d# d$ g ƒ } t | ƒ d k sÈt ‚ g  | D] } | j ^ qÏd d	 d d% g k süt ‚ g  | D] } | j
 ^ qd d	 d$ d% g k s0t ‚ d  S(-   Ns   2 * (a + b) = qR2   R4   t   qRC   i    i   t   2RA   i   i   i   i   t   (RD   i   R?   i   i   i	   i
   i   t   )R>   i   i   i   i   iÿÿÿÿ(   R3   s   1 + @bs   @bt   aas   a aa as   2 * a[1,1],s   a[1,1]R=   (   RC   i    i   Rk   (   RA   i   i   RA   (   RD   i   i   R2   (   R?   i   i   R?   (   RD   i	   i
   R4   (   R>   i   i   R>   (   RD   i   i   Rj   (   Ri   R
   RY   RZ   t   zipt
   isinstanceR   RL   t   originR   t   extraR8   R3   R   R   (   t   codeRf   t	   expectedst   gott   expectedR3   t   namest   t(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   test__tokenize_constraintÈ   s6    	)54c         C  s   t  t |  | ƒ t t ƒ S(   N(   R   Ri   RS   t   _atomic(   RK   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   parse_constraintì   s    t   _EvalConstraintc           B  s€   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 e d „ Z RS(   c         C  s‰   | |  _  t | ƒ |  _ i
 |  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j	 d 6|  j
 d 6|  j d 6|  j d 6|  _ d  S(   NRD   i    RC   R?   i   R@   i   RA   RB   R>   R=   (   RD   i    (   RC   i    (   R?   i   (   R@   i   (   R?   i   (   R@   i   (   RA   i   (   RB   i   (   R>   i   (   R=   i   (   t   _variable_namesR   t   _Nt   _eval_variablet   _eval_numbert   _eval_unary_plust   _eval_unary_minust   _eval_binary_plust   _eval_binary_minust   _eval_binary_multiplyt   _eval_binary_divt   _eval_binary_eqt   _eval_binary_commat	   _dispatch(   R   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR   ñ   s    	








c         C  s   t  j | |  j  d k ƒ S(   Ni    (   R   t   allR~   (   R   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   is_constant	  s    c         C  sE   | j  j } t j |  j d f d t ƒ} d | |  j j | ƒ <| S(   Ni   R   (   t   tokenRr   R   R   R~   R   R}   t   index(   R   t   treet   varR   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR     s    c         C  s9   t  j |  j d f d t ƒ} t | j j ƒ | d <| S(   Ni   R   iÿÿÿÿ(   R   R   R~   R   RŒ   Rr   (   R   RŽ   R   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR€     s    c         C  s   |  j  | j d ƒ S(   Ni    (   t   evalt   args(   R   RŽ   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR     s    c         C  s   d |  j  | j d ƒ S(   Niÿÿÿÿi    (   R   R‘   (   R   RŽ   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR‚     s    c         C  s(   |  j  | j d ƒ |  j  | j d ƒ S(   Ni    i   (   R   R‘   (   R   RŽ   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyRƒ     s    c         C  s(   |  j  | j d ƒ |  j  | j d ƒ S(   Ni    i   (   R   R‘   (   R   RŽ   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR„      s    c         C  s`   |  j  | j d ƒ } |  j  | j d ƒ } |  j | ƒ sT t d | j d ƒ ‚ n  | | d S(   Ni    i   s1   Can't divide by a variable in a linear constraintiÿÿÿÿ(   R   R‘   R‹   R   (   R   RŽ   t   leftt   right(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR†   #  s    c         C  su   |  j  | j d ƒ } |  j  | j d ƒ } |  j | ƒ rG | d | S|  j | ƒ rb | | d St d | ƒ ‚ d  S(   Ni    i   iÿÿÿÿs=   Can't multiply one variable by another in a linear constraint(   R   R‘   R‹   R   (   R   RŽ   R’   R“   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR…   +  s    c         C  s  t  | j ƒ } g  } x] t | ƒ D]O \ } } | j d k r" | j |  j | d t ƒƒ | j d | | | <q" q" W|  j | d ƒ } |  j | d ƒ } | |  j  | |  j  } t j	 | d k ƒ rÚ t
 d | ƒ ‚ n  | d | d }	 t |  j | |	 ƒ }
 | j |
 ƒ t j | ƒ S(   NR>   R&   i   i    s!   no variables appear in constraintiÿÿÿÿ(   R   R‘   t	   enumerateRL   t   appendR   RX   R~   R   RŠ   R   R   R}   R(   (   R   RŽ   R‘   R%   t   it   argR’   R“   R   t   constantR&   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR‡   6  s    c         C  sK   |  j  | j d d t ƒ} |  j  | j d d t ƒ} t j | | g ƒ S(   Ni    R&   i   (   R   R‘   RX   R   R(   (   R   RŽ   R’   R“   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyRˆ   J  s    c         C  sî   | j  t | j ƒ f } | |  j k s- t ‚ |  j | | ƒ } | rÅ t | t ƒ rY | S| j |  j d k su t ‚ t	 j
 | |  j  d k ƒ r£ t d | ƒ ‚ n  t |  j | |  j  | d ƒ Sn% t | t ƒ ræ t d | ƒ ‚ n  | Sd  S(   Ni   i    s#   term is constant, with no variablesiÿÿÿÿs   unexpected constraint object(   RL   R   R‘   R‰   R   Rp   R   t   sizeR~   R   RŠ   R   R}   (   R   RŽ   R&   RP   t   val(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR   O  s     	
(   R)   R*   R   R‹   R   R€   R   R‚   Rƒ   R„   R†   R…   R‡   Rˆ   t   FalseR   (    (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyR|   ð   s   												c         C  s˜  t  |  t ƒ r> |  j | k r: t d |  j | f ƒ ‚ n  |  St  |  t ƒ rgt j t |  ƒ t | ƒ f d t ƒ} t j t |  ƒ ƒ } t	 ƒ  } xÂ t
 t j |  ƒ ƒ D]« \ } \ } } | | k rØ | j | ƒ } n. t  | t j ƒ ró | } n t d | f ƒ ‚ | | k r,t d | | f ƒ ‚ n  | j | ƒ d | | | f <| | | <q¨ Wt | | | ƒ St  |  t ƒ r‚|  g }  n  t  |  t ƒ r*|  r*t  |  d t ƒ r*g  }	 xj |  D]b }
 t  |
 t ƒ sât d |
 f ƒ ‚ n  t |
 | ƒ } t | ƒ } |	 j | j | d t ƒƒ q·Wt j |	 ƒ St  |  t ƒ rvt |  ƒ d	 k rZt d
 ƒ ‚ n  |  \ } } t | | | ƒ St j |  d t ƒ} t | | ƒ S(   sa   This is the internal interface implementing
    DesignInfo.linear_constraint, see there for docs.s?   LinearConstraint has wrong variable_names (got %r, expected %r)R   s#   unrecognized variable name/index %rs   duplicated constraint on %ri   i    s   expected a string, not %rR&   i   s#   constraint tuple must have length 2(   Rp   R   R   R   R   R   R   R   R   t   setR”   t   sixt	   iteritemsR   t   integer_typest   addt   strR   R{   R|   R•   R   RX   R(   t   tupleR   (   t   constraint_likeR   R   R   t   usedR–   t   namet   valuet   idxR%   Rs   RŽ   t	   evaluatort   coef(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   linear_constrainte  sZ    		(	 c         C  sè   y d d l  m } Wn! t k
 r7 d d l m } n Xt |  | ƒ } t d | ƒ t | | | ƒ } t d | ƒ | | j | j ƒ | | j | j ƒ | | j	 | j	 ƒ | | j j
 t j
 t ƒ ƒ | | j	 j
 t j
 t ƒ ƒ d  S(   Niÿÿÿÿ(   R/   Ru   Rv   (   R5   R/   R6   R7   Rª   t   printR   R   R   R   R   R   R   (   t   inputt   varnamesR   R   R/   Ru   Rv   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   _check_lincon£  s    c          C  sx  d d l  m }  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 ƒ | i d d 6d 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 ƒ | i d d 6d 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 ƒ | | d0 d1 g ƒ d d g d	 d g d d	 g g d g d g g ƒ |  t t i d	 d
 6d d g ƒ |  t t i d	 d 6d d 6d 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 i d d 6g d d g ƒ | d d d g d d d d	 g g d d 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! d d d" g d	 d d g d	 d d g d d	 d g 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(2   Niÿÿÿÿ(   R3   (   t   OrderedDictR2   R4   i   i   i    i   Rj   i   i   s   a = 2s   a - 2s	   a + 1 = 3s	   a + b = 3s   a = 2, b = 3s   b = 3, a = 2s   b = 3s#   2 * (a + b/3) + b + 2*3/4 = 1 + 2*3g       @i   g      @s   +2 * -aiþÿÿÿs   a - b, a + b = 2s   a = 1, a = 2, a = 3s   a * 2s   -a = 1s   (2 + a - a) * bs	   a = 1 = bs   a = (1 = b)s   a = 1, a = b = cR'   s	   a + 1 = 2s   a + 1i
   i   i   i(   i#   (   R2   i   (   R4   i   (   R2   i   (   R4   i   (   i    i   (   i   i   (   R2   i   (   i   i   (   R8   R3   t   patsy.compatR¯   R®   R   R   Rª   R   t   arrayR   (   R3   R¯   Rx   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   test_linear_constraint³  sl    =	/11/C1 '7R((((77=&)(77(((77@(73(	%".I7*(s	   a + <f>oos   a = 1, <1 = 1>, b = 1s   a = 1, <b * 2 - b + (-2/2 * b)>s   a = 1, <1>, b = 2s   a = 1, <2 * b = b + b>, cs   a + <a * b> + cs   a + 2 / <b> + cs   a = 1, 2 * <(a = b)>, cs   a = 1, a + <(a = b)>, cs   a = 1, <(a, b)> + 2, cc          C  s   d „  }  t  |  t ƒ d  S(   Nc         S  s   t  |  d d d g ƒ S(   NR2   R4   R'   (   Rª   (   t   bad_code(    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   doit  s    (   R   t   _parse_eval_error_tests(   R´   (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   test_eval_errors  s    	()   t
   __future__R    t   __all__RT   t   collectionsR   R   t   numpyR   t   patsyR   t   patsy.originR   t
   patsy.utilR   R   R   R   R	   t   patsy.infix_parserR
   R   R   t   patsy.parse_formulaR   t   objectR   R:   R<   RS   Rz   RN   Ri   Ry   R{   R|   Rª   R®   R²   Rµ   R¶   (    (    (    s/   lib/python2.7/site-packages/patsy/constraint.pyt   <module>   sR   	(A	%				$	u	>		N	