ó
ýÓ|Uc        #   @  s¿  d  d l  m Z d  d l Z d  d l m Z d  d l m Z m Z m Z d  d l	 m
 Z
 m Z d  d l m Z d  d l m Z m Z d  d l m Z m Z d	 d
 d g Z d	 e f d „  ƒ  YZ e g  ƒ Z d e f d „  ƒ  YZ d „  Z d
 e f d „  ƒ  YZ d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d  „  Z' d! „  Z( d" „  Z) d# „  Z* d$ „  Z+ d% e f d& „  ƒ  YZ, iT e- g  f d' 6e- g  f d( 6e- g  f d) 6e- d* g f d* 6e- g  f d+ 6e. g  f d, 6e. g  f d- 6e- g  f d. 6e- g  f d/ 6e. g  f d0 6e- g  f d1 6e. g  f d2 6e- g  f d3 6e. g  f d4 6e- d* g f d5 6e. d* g f d6 6e. d* g f d7 6e- d* g f d8 6e- g  f d9 6e- d* d: g f d; 6e- d* d: g f d< 6e- d* d: g f d= 6e- d* d: g f d> 6e- d* d: g f d? 6e- d* g f d@ 6e- d* d: g f dA 6e- d* dB g f dC 6e- d* g f dD 6e- d* dE dF g f dG 6e- d* dH g f dI 6e- d« g f dJ 6e- d¬ g f dK 6e- d­ d® g f dL 6e- d¯ d° g f dM 6e- d± g f dN 6e- dF d² d³ g f dO 6e- d´ g f dP 6e- d: dµ d¶ g f dQ 6e- g  f dR 6e- g  f dS 6e- g  f dT 6e- g  f dU 6e- d* d: d· g f dV 6e- d* d: d¸ g f dW 6e- d* d: dF d¹ dº g f dX 6e- d* d: dF d» d¼ g f dY 6e- d* d: d½ g f dZ 6e- dF d¾ d* d: d¿ g f d[ 6e- d* dF dÀ g f d\ 6e- d: dÁ d* dF dÂ g f d] 6e- d* dÃ g f d^ 6e- d* d: dÄ g f d_ 6e- d: dÅ d* dÆ g f d` 6e- d* dÇ dÈ g f da 6e- d* g f db 6e- d* d: dF dc dÉ dÊ dË dÌ dÍ dÎ g
 f dd 6e- d* d: dF dc dÏ dÐ dÑ dÒ dÓ dÔ dÕ dÖ d× dØ g f de 6e- d* g f df 6e- d* d: g f dg 6e- d* d: dÙ g f dh 6e. d* d: dÚ g f di 6e. g  f dj 6e- d* d: g f dk 6e- g  e- d* d: g f dl 6e. dm g e- d* d: g f dn 6e. dm g e- d* d: g f do 6e. dm dp dÛ g e- d* d: g f dq 6e. g  e- g  f dr 6e- dm g e- d* d: g f ds 6e- d* d: dF dÜ g f dt 6e- d* d: dÝ dF g f du 6e- d: dÞ g f dv 6e- d* d: dß g f dw 6e- d* dà dF g f dx 6e- d* dá dâ g f dy 6e- dã dF dä g f dz 6e- g  f d{ 6e. g  f d| 6e- g  f d} 6e. g  f d~ 6e- d* g f d 6e- d* g f d€ 6e- d* g f d 6e. g  f d‚ 6Z/ dƒ d„ d… d† d‡ dˆ d‰ dŠ d‹ dŒ d dŽ d d d‘ d’ d“ d” d• d– d— d˜ d™ dš d› dœ d dž dŸ d  d¡ d¢ d£ d¤ d¥ g# Z0 d¦ „  Z1 d§ „  Z2 d¨ „  Z3 d© „  Z4 dª „  Z5 d S(å   iÿÿÿÿ(   t   print_functionN(   t
   PatsyError(   t	   ParseNodet   Tokent   parse_formula(   t   EvalEnvironmentt
   EvalFactor(   t   uniqueify_list(   t   repr_pretty_delegatet   repr_pretty_impl(   t   no_picklingt   assert_no_picklingt   Termt	   ModelDesct	   INTERCEPTc           B  sP   e  Z d  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z	 d „  Z
 e Z RS(   s˜  The interaction between a collection of factor objects.

    This is one of the basic types used in representing formulas, and
    corresponds to an expression like ``"a:b:c"`` in a formula string.
    For details, see :ref:`formulas` and :ref:`expert-model-specification`.

    Terms are hashable and compare by value.

    Attributes:
    
    .. attribute:: factors

       A tuple of factor objects.
    c         C  s   t  t | ƒ ƒ |  _ d  S(   N(   t   tupleR   t   factors(   t   selfR   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   __init__+   s    c         C  s+   t  | t ƒ o* t | j ƒ t |  j ƒ k S(   N(   t
   isinstanceR   t	   frozensetR   (   R   t   other(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   __eq__.   s    c         C  s   |  | k S(   N(    (   R   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   __ne__2   s    c         C  s   t  t t |  j ƒ f ƒ S(   N(   t   hashR   R   R   (   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   __hash__5   s    c         C  s-   | s t  ‚ t | |  t |  j ƒ g ƒ d  S(   N(   t   AssertionErrorR	   t   listR   (   R   t   pt   cycle(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _repr_pretty_9   s    c         C  s:   |  j  r2 d j g  |  j  D] } | j ƒ  ^ q ƒ Sd Sd S(   s+   Return a human-readable name for this term.t   :t	   InterceptN(   R   t   joint   name(   R   t   f(    (    s)   lib/python2.7/site-packages/patsy/desc.pyR"   =   s    	)(   t   __name__t
   __module__t   __doc__R   R   R   R   R   t   __repr__R   R"   R
   t   __getstate__(    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR      s   						t   _MockFactorc           B  s   e  Z d  „  Z d „  Z RS(   c         C  s   | |  _  d  S(   N(   t   _name(   R   R"   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   I   s    c         C  s   |  j  S(   N(   R*   (   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR"   L   s    (   R$   R%   R   R"   (    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR)   H   s   	c          C  s  t  d d d g ƒ j d k s$ t ‚ t  d d g ƒ t  d d g ƒ k sN t ‚ t t  d d g ƒ ƒ t t  d d g ƒ ƒ k s„ t ‚ t d ƒ }  t d ƒ } t  |  | g ƒ j ƒ  d k sÀ t ‚ t  | |  g ƒ j ƒ  d k sä t ‚ t  g  ƒ j ƒ  d k st ‚ t t  g  ƒ ƒ d  S(	   Ni   i   t   at   bs   a:bs   b:aR    (   i   i   (   R   R   R   R   R)   R"   R   (   t   f1t   f2(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt	   test_TermO   s    $*6$$c           B  sD   e  Z d  Z d „  Z e Z d „  Z d „  Z e d „  ƒ Z	 e
 Z RS(   sÂ  A simple container representing the termlists parsed from a formula.

    This is a simple container object which has exactly the same
    representational power as a formula string, but is a Python object
    instead. You can construct one by hand, and pass it to functions like
    :func:`dmatrix` or :func:`incr_dbuilder` that are expecting a formula
    string, but without having to do any messy string manipulation. For
    details see :ref:`expert-model-specification`.

    Attributes:

    .. attribute:: lhs_termlist
                   rhs_termlist

       Two termlists representing the left- and right-hand sides of a
       formula, suitable for passing to :func:`design_matrix_builders`.
    c         C  s"   t  | ƒ |  _ t  | ƒ |  _ d  S(   N(   R   t   lhs_termlistt   rhs_termlist(   R   R0   R1   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   m   s    c         C  s8   | s t  ‚ t | |  g  d |  j f d |  j f g ƒ S(   NR0   R1   (   R   R	   R0   R1   (   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   r   s
    	c         C  sä   d „  } d j  g  |  j D] } | | ƒ ^ q ƒ } | rG | d 7} n
 | d 7} |  j t g k rv | | t ƒ 7} nj g  } t |  j k r› | j d ƒ n  | g  |  j D] } | t k r¨ | | ƒ ^ q¨ 7} | d j  | ƒ 7} | S(   sÀ  Returns a human-readable representation of this :class:`ModelDesc`
        in pseudo-formula notation.

        .. warning:: There is no guarantee that the strings returned by this
           function can be parsed as formulas. They are best-effort
           descriptions intended for human users. However, if this ModelDesc
           was created by parsing a formula, then it should work in
           practice. If you *really* have to.
        c         S  s   |  t  k r d S|  j ƒ  Sd  S(   Nt   1(   R   R"   (   t   term(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt	   term_codeƒ   s    s    + s    ~ s   ~ t   0(   R!   R0   R1   R   t   append(   R   R4   R3   t   resultt
   term_names(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   describey   s    
	+
c         C  sU   t  | t ƒ r | } n t | ƒ } t ƒ  j | d t ƒ} t  | |  ƒ sQ t ‚ | S(   s$  Construct a :class:`ModelDesc` from a formula string.

        :arg tree_or_string: A formula string. (Or an unevaluated formula
          parse tree, but the API for generating those isn't public yet. Shh,
          it can be our secret.)
        :returns: A new :class:`ModelDesc`.
        t   require_evalexpr(   R   R   R   t	   Evaluatort   evalt   FalseR   (   t   clst   tree_or_stringt   treet   value(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   from_formula˜   s    		(   R$   R%   R&   R   R   R'   R   R9   t   classmethodRB   R
   R(   (    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   [   s   			c          C  sz  t  d ƒ }  t  d ƒ } t t t |  g ƒ g t |  g ƒ t |  | g ƒ g ƒ } | j t t |  g ƒ g k su t ‚ | j t |  g ƒ t |  | g ƒ g k s¥ t ‚ t | j ƒ  ƒ | j ƒ  d k sÍ t ‚ t	 | ƒ t g  g  ƒ j ƒ  d k sø t ‚ t t g g  ƒ j ƒ  d k st ‚ t t g t g ƒ j ƒ  d k sCt ‚ t t g t t | g ƒ g ƒ j ƒ  d k svt ‚ d  S(   NR+   R,   s   1 + a ~ 0 + a + a:bs   ~ 0s   1 ~ 0s   1 ~ 1s   1 ~ b(
   R)   R   R   R   R0   R   R1   t   printR9   R   (   R-   R.   t   m(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   test_ModelDesc«   s    9$0
!$'$c          C  s   xz d t  d ƒ f D]f }  t j |  ƒ } | j t t d ƒ g ƒ g k sO t ‚ | j t t t d ƒ g ƒ g k s t ‚ q Wd  S(   Ns   y ~ xt   yt   x(	   R   R   RB   R0   R   R   R   R1   R   (   t   inputt   md(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   test_ModelDesc_from_formula¼   s    't   IntermediateExprc           B  s,   e  Z d  Z d „  Z e Z d „  Z e Z RS(   sF   This class holds an intermediate result while we're evaluating a tree.c         C  sh   | |  _  | |  _ | |  _ t t | ƒ ƒ |  _ |  j  rK |  j sK t ‚ n  |  j  oZ |  j sd t ‚ d  S(   N(   t	   interceptt   intercept_origint   intercept_removedR   R   t   termsR   (   R   RM   RN   RO   RP   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   Ä   s    				c         C  s5   | s t  ‚ t | |  |  j |  j |  j |  j g ƒ S(   N(   R   R	   RM   RN   RO   RP   (   R   R   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _pretty_repr_Î   s    	(	   R$   R%   R&   R   R   R'   RQ   R
   R(   (    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyRL   Â   s
   			c         C  s   |  r t  f | S| Sd  S(   N(   R   (   t   doitRP   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _maybe_add_interceptÖ   s    c         C  s­   g  | j  D] } |  j | ƒ ^ q
 } t | ƒ d k rY | j d t t d  t g  ƒ ƒ n  t | ƒ d k sq t ‚ t	 t
 | d j | d j ƒ t
 | d j | d j ƒ ƒ S(   Ni   i    i   (   t   argsR<   t   lent   insertRL   R=   t   Nonet   TrueR   R   RS   RM   RP   RO   (   t	   evaluatorR@   t   argt   exprs(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_any_tildeÜ   s    %"c         C  s«   |  j  | j d ƒ } | j d j d k rB t t d  t | j ƒ S|  j  | j d ƒ } | j r t t | j	 t | j | j ƒ St | j | j	 | j
 | j | j ƒ Sd  S(   Ni    i   t   ZERO(   R<   RT   t   typeRL   R=   RW   RX   RP   RM   RN   RO   (   RY   R@   t	   left_exprt
   right_expr(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_plusè   s    		c         C  sò   |  j  | j d ƒ } | j d j d k rI t t | j d t | j ƒ S| j d j d k ru t t d  t | j ƒ S|  j  | j d ƒ } g  | j D] } | | j k r• | ^ q• } | j rÒ t t d  t | ƒ St | j | j	 | j
 | ƒ Sd  S(   Ni    i   R]   t   ONE(   R<   RT   R^   RL   RX   R=   RP   RW   RM   RN   RO   (   RY   R@   R_   R`   R3   RP   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_minusø   s    
		c         C  s"   |  j  r t d |  j ƒ ‚ n  d  S(   Ns1   intercept term cannot interact with anything else(   RM   R   RN   (   t   expr(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _check_interactable  s    	c         C  s   x |  | f D] } t  | ƒ q Wg  } xB |  j D]7 } x. | j D]# } | j t | j | j ƒ ƒ qA Wq1 Wt t d  t | ƒ S(   N(   Re   RP   R6   R   R   RL   R=   RW   (   R_   R`   Rd   RP   t   l_termt   r_term(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _interaction  s    %c         C  sW   g  | j  D] } |  j | ƒ ^ q
 } t t d  t | d j | d j t | Œ  j ƒ S(   Ni    i   (   RT   R<   RL   R=   RW   RP   Rh   (   RY   R@   RZ   R[   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_prod  s    %c         C  s¿   |  j  | j d ƒ } |  j  | j d ƒ } t | j ƒ } t | ƒ g  } x$ | j D] } | t | j ƒ 7} qU Wt t d  t t	 | ƒ g ƒ } | t t
 | | ƒ j ƒ 7} t t d  t | ƒ S(   Ni    i   (   R<   RT   R   RP   Re   R   RL   R=   RW   R   Rh   (   RY   R@   R_   R`   RP   t   left_factorsR3   t   left_combined_expr(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_div(  s    
c         C  s/   g  | j  D] } |  j | ƒ ^ q
 } t | Œ  S(   N(   RT   R<   Rh   (   RY   R@   RZ   R[   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_interact7  s    %c         C  s  |  j  | j d ƒ } t | ƒ d } | j d j d k rv | j d j j } y t | ƒ } Wqv t k
 rr qv Xn  | d k  r› t d | j d ƒ ‚ n  | j	 } | } t
 t | j	 ƒ | ƒ } x3 t d | ƒ D]" } t | | ƒ } | | j	 } qÒ Wt t d  t | ƒ S(   Ni    iÿÿÿÿi   Rb   t   NUMBERs    '**' requires a positive integer(   Rb   Rn   (   R<   RT   Re   R^   t   tokent   extrat   intt
   ValueErrorR   RP   t   minRU   t   rangeRh   RL   R=   RW   (   RY   R@   R_   t   powerRd   t	   all_termst   big_exprt   i(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_binary_power;  s$    
	c         C  s   |  j  | j d ƒ S(   Ni    (   R<   RT   (   RY   R@   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_unary_plusP  s    c         C  sh   | j  d j d k r, t t | j t g  ƒ S| j  d j d k rU t t d  t g  ƒ St d | ƒ ‚ d  S(   Ni    R]   Rb   s)   Unary minus can only be applied to 1 or 0(   RT   R^   RL   RX   t   originR=   RW   R   (   RY   R@   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_unary_minusS  s
    c         C  s   t  t d  t g  ƒ S(   N(   RL   R=   RW   RX   (   RY   R@   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt
   _eval_zero[  s    c         C  s   t  t | j t g  ƒ S(   N(   RL   RX   R{   R=   (   RY   R@   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt	   _eval_one^  s    c         C  s   t  d | ƒ ‚ d  S(   Ns4   numbers besides '0' and '1' are only allowed with **(   R   (   RY   R@   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_numbera  s    c         C  s:   t  | j j d | j ƒ} t t d  t t | g ƒ g ƒ S(   NR{   (   R   Ro   Rp   R{   RL   R=   RW   R   (   RY   R@   t   factor(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _eval_python_expre  s    R;   c           B  s&   e  Z d  „  Z d „  Z e d „ Z RS(   c         C  s   i  |  _  |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d	 d t ƒ |  j d d t	 ƒ |  j d d t
 ƒ |  j d
 d t ƒ |  j d d t ƒ |  j d d t ƒ |  j d d t ƒ i  |  _ d  S(   Nt   ~i   i   t   +t   -t   *t   /R   s   **R]   i    Rb   Rn   t   PYTHON_EXPR(   t   _evaluatorst   add_opR\   Ra   Rc   Ri   Rl   Rm   Ry   Rz   R|   R}   R~   R   R   t   stash(   R   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR   j  s     	c         C  s   | |  j  | | f <d  S(   N(   Rˆ   (   R   t   opt   arityRY   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR‰   …  s    c         C  sÄ   d  } t | t ƒ s t ‚ | j t | j ƒ f } | |  j k ra t d | j f | j	 ƒ ‚ n  |  j | |  | ƒ } | rÀ t | t
 ƒ rÀ t | t ƒ r® t d | ƒ ‚ qÀ t d | ƒ ‚ n  | S(   Ns/   I don't know how to evaluate this '%s' operators2   ~ can only be used once, and only at the top levelsB   custom operator returned an object that I don't know how to handle(   RW   R   R   R   R^   RU   RT   Rˆ   R   Ro   RL   R   (   R   R@   R:   R7   t   key(    (    s)   lib/python2.7/site-packages/patsy/desc.pyR<   ˆ  s    
(   R$   R%   R   R‰   RX   R<   (    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyR;   i  s   		t    t    s    
 R+   R2   R5   s   - 1s   - 0s   + 1s   + 0s   0 + 1s   1 + 0s   1 - 0s   0 - 1s   1 + as   0 + as   a - 1s   a - 0s   1 - aR,   s   a + bs   (a + b)s   a + ((((b))))s   a + ((((+b))))s   a + ((((b - a))))s	   a + a + as   a + (b - a)s   np.log(a, base=10)s   a + np.log(a, base=10)s0   a + np.log(a, base=10) - np . log(a , base = 10)s   I(b)t   cs   a + (I(b) + c)s   I(b + c)s   a + I(b + c)s   a:bs   a:b:as	   a:(b + c)s	   (a + b):cs	   a:(b - c)s   c + a:c + a:(b - c)s	   (a - b):cs   b + b:c + (a - b):cs	   a:b - a:bs	   a:b - b:as   1 - (a + b)s   a + b - (a + b)s   a * bs	   a * b * as   a * (b + c)s   (a + b) * cs   a * (b - c)s   c + a:c + a * (b - c)s   (a - b) * cs   b + b:c + (a - b) * cs   a/bs	   (a + b)/cs   b + b:c + (a - b)/cs	   a/(b + c)s   a ** 2t   ds   (a + b + c + d) ** 2s   (a + b + c + d) ** 3s   a + +as   ~ a + bs   ~ a*bs	   ~ a*b + 0s   ~ -1s	   0 ~ a + bs	   1 ~ a + bRG   s	   y ~ a + bs   0 + y ~ a + bt   zs   0 + y * z ~ a + bs   -1 ~ 1s   1 + y ~ a + bs	   a + b * cs	   a * b + cs	   a * b - as	   a + b / cs	   a / b + cs   a*b:cs   a:b*cs   ~ 1 + 1 + 0 + 1s   ~ 0 + 1 + 0s   ~ 0 - 1 - 1 + 0 + 1s   ~ 1 - 1s   ~ 0 + a + 1s   ~ 1 + (a + 0)s   ~ 0 + (a + 1)s   ~ 1 - (a + 1)s   a <+>s   a + <(>s
   b + <(-a)>s   a:<1>s   (a + <1>)*bs   a + <2>s	   a + <1.0>s   a ** <b>s   a ** <(1 + 1)>s
   a ** <1.5>s   a + b <# asdf>s   <)>s   a + <)>s   <*> as   a + <*>s   a + <foo[bar>s   a + <foo{bar>s   a + <foo(bar>s
   a + <[bar>s
   a + <{bar>s   a + <{bar[]>s   a + foo<]>bars   a + foo[]<]>bars   a + foo{}<}>bars   a + foo<)>bars   a + b<)>s   (a) <.>s   <(>a + bs   <y ~ a> ~ bs   y ~ <(a ~ b)>s	   <~ a> ~ bs   ~ <(a ~ b)>s   1 + <-(a + b)>s   <- a>s   a + <-a**2>c         C  sË   | r d g | } n  t  |  ƒ t  | ƒ k s4 t ‚ x t |  | ƒ D] \ } } t | t ƒ r± t | t ƒ rz | f } n  | j t g  | D] } t | ƒ ^ qŠ ƒ k sÃ t ‚ qD | | k sD t ‚ qD Wd  S(   N(    (	   RU   R   t   zipR   R   t   strR   R   R   (   RP   t   expected_interceptt	   expectedsR3   t   expectedt   s(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _assert_terms_matchI  s    7c         C  s´   x­ t  j |  ƒ D]œ \ } } t | ƒ d k rA t g  f | } n  t j | ƒ } t t | ƒ ƒ t | ƒ t | ƒ | \ } } } } t | j	 | | ƒ t | j
 | | ƒ q Wd  S(   Ni   (   t   sixt	   iteritemsRU   R=   R   RB   RD   t   reprR™   R0   R1   (   t   testst   codeR7   t
   model_desct   lhs_interceptR0   t   rhs_interceptR1   (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   _do_eval_formula_testsU  s    

	
	c           C  s   t  t ƒ d  S(   N(   R¢   t   _eval_tests(    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   test_eval_formulac  s    c          C  s*   d d l  m }  d „  } |  | t ƒ d  S(   Niÿÿÿÿ(   t   _parsing_error_testc         S  s   t  j |  ƒ S(   N(   R   RB   (   t   formula(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   <lambda>h  s    (   t   patsy.parse_formulaR¥   t   _eval_error_tests(   R¥   t   parse_fn(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt!   test_eval_formula_error_reportingf  s    	c          C  s   d d l  m }  t j d ƒ } | j d j d j |  d d d ƒ k sN t ‚ | j d j d j |  d d d ƒ k s} t ‚ d  S(	   Niÿÿÿÿ(   t   Origins   a + bi   i    i   i   i   (   t   patsy.originR¬   R   RB   R1   R   R{   R   (   R¬   t   desc(    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   test_formula_factor_origink  s    (   R+   R,   (   R+   R,   (   R+   R,   (   R+   R   (   R+   R   (   R,   R   (   R+   R,   (   R+   R   (   R+   R,   (   R+   R   (   R,   R   (   R+   R   (   R+   R,   (   R+   R,   (   R+   R,   (   R+   R   (   R+   R   (   R,   R   (   R+   R,   (   R+   R   (   R+   R,   (   R+   R   (   R,   R   (   R+   R   (   R+   R,   (   R+   R,   R   (   R,   R   (   R+   R   (   R+   R,   (   R+   R   (   R+   R,   (   R+   R   (   R+   R‘   (   R,   R   (   R,   R‘   (   R   R‘   (   R+   R,   (   R+   R   (   R+   R‘   (   R,   R   (   R,   R‘   (   R   R‘   (   R+   R,   R   (   R+   R,   R‘   (   R+   R   R‘   (   R,   R   R‘   (   R+   R,   (   R+   R,   (   RG   R’   (   R,   R   (   R+   R,   (   R+   R,   (   R,   R   (   R+   R,   (   R,   R   (   R+   R,   R   (   R+   R,   (   R+   R,   R   (6   t
   __future__R    Rš   t   patsyR   R¨   R   R   R   t
   patsy.evalR   R   t
   patsy.utilR   R   R	   R
   R   t   __all__t   objectR   R   R)   R/   R   RF   RK   RL   RS   R\   Ra   Rc   Re   Rh   Ri   Rl   Rm   Ry   Rz   R|   R}   R~   R   R   R;   RX   R=   R£   R©   R™   R¢   R¤   R«   R¯   (    (    (    s)   lib/python2.7/site-packages/patsy/desc.pyt   <module>	   sH  *	P																			5			"					