ó
Ý²k^c           @` sV  d  d l  m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l m	 Z	 m
 Z
 d  d l m Z e
 e ƒ Z e Z e Z e Z d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ i e d 6e d 6e d 6Z d „  e j ƒ  Dƒ Z d e f d „  ƒ  YZ d S(   i    (   t   absolute_importt   divisiont   print_functiont   unicode_literals(   t   array(   t   combinations(   t   DEBUGt	   getLogger(   t   maxsizet   _ClauseListc           B` sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   uE   Storage for the CNF clauses, represented as a list of tuples of ints.c         C` s+   g  |  _  |  j  j |  _ |  j  j |  _ d  S(   N(   t   _clause_listt   appendt   extend(   t   self(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   __init__   s    	c         C` s   t  |  j ƒ S(   u2   
        Return number of stored clauses.
        (   t   lenR
   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   get_clause_count   s    c         C` s   t  |  j ƒ S(   u§   
        Get state information to be able to revert temporary additions of
        supplementary clauses.  _ClauseList: state is simply the number of clauses.
        (   R   R
   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt
   save_state$   s    c         C` s   | } g  |  j  | )d S(   u~   
        Restore state saved via `save_state`.
        Removes clauses that were added after the sate has been saved.
        N(   R
   (   R   t   saved_statet   len_clauses(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   restore_state+   s    c         C` s   |  j  S(   u+   Return clauses as a list of tuples of ints.(   R
   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   as_list3   s    c         C` s>   t  d ƒ } x+ |  j D]  } | j | ƒ | j d ƒ q W| S(   uX   
        Return clauses as a flat int array, each clause being terminated by 0.
        u   ii    (   R   R
   R   R   (   R   t   clause_arrayt   c(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   as_array7   s
    (	   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR	      s   					t   _ClauseArrayc           B` sV   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   up   
    Storage for the CNF clauses, represented as a flat int array.
    Each clause is terminated by int(0).
    c         C` s1   t  d ƒ |  _ |  j j |  _ |  j j |  _ d  S(   Nu   i(   R   t   _clause_arrayR   t   _array_appendR   t   _array_extend(   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   G   s    c         C` s"   x | D] } |  j  | ƒ q Wd  S(   N(   R   (   R   t   clausest   clause(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   N   s    c         C` s   |  j  | ƒ |  j d ƒ d  S(   Ni    (   R   R   (   R   R!   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   R   s    c         C` s   |  j  j d ƒ S(   uã   
        Return number of stored clauses.
        This is an O(n) operation since we don't store the number of clauses
        explicitly due to performance reasons (Python interpreter overhead in
        self.append).
        i    (   R   t   count(   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   V   s    c         C` s   t  |  j ƒ S(   uÅ   
        Get state information to be able to revert temporary additions of
        supplementary clauses. _ClauseArray: state is the length of the int
        array, NOT number of clauses.
        (   R   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   _   s    c         C` s   | } t  d ƒ |  j | )d S(   u~   
        Restore state saved via `save_state`.
        Removes clauses that were added after the sate has been saved.
        u   iN(   R   R   (   R   R   t   len_clause_array(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   g   s    c         c` sO   g  } xB |  j  D]7 } | d k r: t | ƒ V| j ƒ  q | j | ƒ q Wd S(   u+   Return clauses as a list of tuples of ints.i    N(   R   t   tuplet   clearR   (   R   R!   t   v(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   o   s    c         C` s   |  j  S(   uX   
        Return clauses as a flat int array, each clause being terminated by 0.
        (   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   y   s    (   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   B   s   								
t
   _SatSolverc           B` s_   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   uX   
    Simple wrapper to call a SAT solver given a _ClauseList/_ClauseArray instance.
    c         K` s=   | p	 i  |  _  t ƒ  |  _ |  j j |  _ |  j j |  _ d  S(   N(   t   _run_kwargsR	   t   _clausesR   t
   add_clauseR   t   add_clauses(   R   t
   run_kwargs(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   …   s    c         C` s   |  j  j ƒ  S(   N(   R)   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   Œ   s    c         C` s   |  j  j ƒ  S(   N(   R)   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR      s    c         C` s   |  j  j ƒ  S(   N(   R)   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   ’   s    c         C` s   |  j  j | ƒ S(   N(   R)   R   (   R   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR   •   s    c         K` sP   |  j  j ƒ  } | j | ƒ |  j | |  } |  j | ƒ } |  j | ƒ } | S(   N(   R(   t   copyt   updatet   setupt   invoket   process_solution(   R   t   mt   kwargsR,   t   solvert   sat_solutiont   solution(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   run˜   s    c         K` s   t  ƒ  ‚ d S(   u?   Create a solver instance, add the clauses to it, and return it.N(   t   NotImplementedError(   R   R2   R3   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR/       s    c         C` s   t  ƒ  ‚ d S(   u@   Start the actual SAT solving and return the calculated solution.N(   R8   (   R   R4   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR0   ¤   s    c         C` s   t  ƒ  ‚ d S(   uŽ   
        Process the solution returned by self.invoke.
        Returns a list of satisfied variables or None if no solution is found.
        N(   R8   (   R   R5   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR1   ¨   s    (   R   R   R   R   R   R   R   R   R7   R/   R0   R1   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR'   €   s   								t   _PycoSatSolverc           B` s&   e  Z d  d „ Z d „  Z d „  Z RS(   i    c         K` s/   d d l  m } | |  j j ƒ  d | d | ƒS(   Ni    (   t	   itersolvet   varst
   prop_limit(   t   pycosatR:   R)   R   (   R   R2   t   limitR3   R:   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR/   ±   s    c         C` s1   y t  | ƒ } Wn t k
 r) d } n X~ | S(   Nu   UNSAT(   t   nextt   StopIteration(   R   t   iter_solR5   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR0   »   s    
c         C` s   | d k r d  S| S(   Nu   UNSATu   UNKNOWN(   u   UNSATu   UNKNOWN(   t   None(   R   R5   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR1   Ã   s    (   R   R   R/   R0   R1   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR9   °   s   
	t   _PyCryptoSatSolverc           B` s&   e  Z d  d „ Z d „  Z d „  Z RS(   i   c         K` s9   d d l  m } | d | ƒ } | j |  j j ƒ  ƒ | S(   Ni    (   t   Solvert   threads(   t   pycryptosatRD   R+   R)   R   (   R   R2   RE   R3   RD   R4   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR/   Ê   s    c         C` s%   | j  ƒ  \ } } | s! d  } n  | S(   N(   t   solveRB   (   R   R4   t   satR5   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR0   Ñ   s    	c         C` s9   | s
 d  Sg  t | ƒ D] \ } } | r | ^ q } | S(   N(   RB   t	   enumerate(   R   R6   t   it   b(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR1   ×   s    +(   R   R   R/   R0   R1   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyRC   É   s   	t   _PySatSolverc           B` s#   e  Z d  „  Z d „  Z d „  Z RS(   c         K` s3   d d l  m } | ƒ  } | j |  j j ƒ  ƒ | S(   Ni    (   t   Glucose4(   t   pysat.solversRM   t   append_formulaR)   R   (   R   R2   R3   RM   R4   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR/   à   s    	c         C` s/   | j  ƒ  s d  } n | j ƒ  } | j ƒ  | S(   N(   RG   RB   t	   get_modelt   delete(   R   R4   R5   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR0   ç   s
    	
c         C` s   | d  k r d  } n | } | S(   N(   RB   (   R   R5   R6   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR1   ï   s    	(   R   R   R/   R0   R1   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyRL   ß   s   		u   pycosatu   pycryptosatu   pysatc         C` s   i  |  ] \ } } | | “ q S(    (    (   t   .0t   stringt   cls(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys
   <dictcomp>ý   s   	 t   Clausesc           B` s&  e  Z d  e e d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d e d
 „ Z e d „ Z e d „ Z e d „ Z e d „ Z d d „ Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d  d „ Z d e d  d „ Z d e d „ Z RS(   i    c         C` sw   t  |  _ | |  _ y t | } Wn& t k
 rH t d j | ƒ ƒ ‚ n X| ƒ  |  _ |  j j |  _ |  j j	 |  _	 d  S(   Nu   Unknown SAT solver: {}(
   t   Falset   unsatR2   t   _sat_solver_str_to_clst   KeyErrorR8   t   formatt   _sat_solverR*   R+   (   R   R2   t   sat_solver_strt   sat_solver_cls(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR     s    		c         C` s   |  j  j ƒ  S(   N(   R[   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR     s    c         C` s   |  j  j ƒ  S(   N(   R[   R   (   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyR     s    c         C` s   |  j  d } | |  _  | S(   Ni   (   R2   (   R   R2   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   new_var  s    	c         ` se   t  | t ƒ ra |  j ƒ  ‰  |  j ‡  f d †  | d Dƒ ƒ |  j ‡  f d †  | d Dƒ ƒ ˆ  S| S(   Nc         3` s   |  ] } ˆ  f | Vq d  S(   N(    (   RR   t   y(   t   x(    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>!  s    i    c         3` s   |  ] } ˆ  f | Vq d  S(   N(    (   RR   R_   (   R`   (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>"  s    i   (   t
   isinstanceR$   R^   R+   (   R   t   vals(    (   R`   s2   lib/python2.7/site-packages/conda/common/_logic.pyt   assign  s    !!c         C` sÕ   t  d „  | Dƒ ƒ r t Sg  | D] } | t k r! | ^ q! } t | ƒ } | d k r[ t S| d k ro | d St d „  | Dƒ ƒ rµ t d „  | Dƒ g  ƒ t d „  | Dƒ g  ƒ f S|  j t |  j | ƒ | ƒ Sd  S(   Nc         s` s   |  ] } | t  k Vq d  S(   N(   t   FALSE(   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>'  s    i    i   c         s` s   |  ] } t  | t ƒ Vq d  S(   N(   Ra   R$   (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>/  s    c         s` s   |  ] } | d  Vq d S(   i    N(    (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>0  s    c         s` s   |  ] } | d  Vq d S(   i   N(    (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>0  s    (	   t   anyRd   t   TRUER   t   allt   sumt   Allt   mapRc   (   R   t   argst   polarityR&   t   nv(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   Combine&  s    %0c         C` s¹   |  j  j ƒ  } | d | | Œ } t | t ƒ rU |  j | d ƒ |  j | d ƒ n` | t t h k r‡ |  j | ry | n | f ƒ n. |  j  j | ƒ |  j	 p¯ | t k | k |  _	 d  S(   NRl   i    i   (
   R[   R   Ra   R$   R+   Rf   Rd   R*   R   RW   (   R   t   funcRk   Rl   R   Rb   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   Eval4  s     c         G` s   |  j  | | d t ƒd  S(   NRl   (   Rp   RV   (   R   Ro   Rk   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   PreventA  s    c         G` s   |  j  | | d t ƒd  S(   NRl   (   Rp   t   True(   R   Ro   Rk   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   RequireD  s    c         C` s   | S(   N(    (   R   R`   Rl   t   add_new_clauses(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   NotG  s    c         C` sR  | t  k s | t  k r t  S| t k r, | S| t k r< | S| | k rL | S| | k r] t  S| | k  ry | | } } n  | rõ |  j ƒ  } | t d  f k rÁ |  j | | f | | f g ƒ n  | t d  f k rñ |  j | | | f g ƒ n  | S| t d  f k r| f | f g n g  } | t d  f k rB| | f g n g  } | | f S(   N(   Rd   Rf   R^   Rr   RB   R+   RV   (   R   t   ft   gRl   Rt   R`   t   pvalt   nval(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   AndJ  s,    $*)c         C` sQ  | t  k s | t  k r t  S| t k r, | S| t k r< | S| | k rL | S| | k r] t  S| | k  ry | | } } n  | rô |  j ƒ  } | t d  f k rº |  j | | | f g ƒ n  | t d  f k rð |  j | | f | | f g ƒ n  | S| t d  f k r| | f g n g  } | t d  f k rA| f | f g n g  } | | f S(   N(   Rf   Rd   R^   Rr   RB   R+   RV   (   R   Rv   Rw   Rl   Rt   R`   Rx   Ry   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   Orf  s,    $',c         C` sŽ  | t  k r | S| t k r2 |  j | | d | ƒS| t  k rB | S| t k rS | S| | k rc t  S| | k rt t S| | k  r | | } } n  | r |  j ƒ  } | t d  f k rà |  j | | | f | | | f g ƒ n  | t d  f k r|  j | | | f | | | f g ƒ n  | S| t d  f k rL| | f | | f g n g  } | t d  f k r~| | f | | f g n g  } | | f S(   NRt   (   Rd   Rf   Ru   R^   Rr   RB   R+   RV   (   R   Rv   Rw   Rl   Rt   R`   Rx   Ry   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   Xor~  s0    ,*22c   	      C` sÕ  | t  k r | S| t k r  | S| t  k rE |  j | | | d | ƒS| t k rk |  j | | | d | ƒS| t k r |  j | | | d | ƒS| t  k r¶ |  j | | | d | ƒS| | k rÛ |  j | | | d | ƒS| | k r|  j | | | d | ƒS| | k r'|  j | | | d | ƒS| | k rN|  j | | | d | ƒS| | k r^| S| | k r„|  j | | | d | ƒS| | k  r¨| | | } } } n  | rS|  j ƒ  } | t d  f k r|  j | | | f | | | f | | | f g ƒ n  | t	 d  f k rO|  j | | | f | | | f | | | f g ƒ n  | S| t d  f k r‡| | f | | f | | f g n g  } | t	 d  f k rÅ| | f | | f | | f g n g  } | | f S(   NRt   (
   Rf   Rd   R{   Rz   R|   R^   Rr   RB   R+   RV   (	   R   R   t   tRv   Rl   Rt   R`   Rx   Ry   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   ITE˜  sH    89:>c         C` s  t  ƒ  } xJ | D]B } | t k r( q n  | t k sA | | k rE t S| j | ƒ q Wt | ƒ } | d k rr t S| d k r’ t d „  | Dƒ ƒ S| t d  f k rÀ g  | D] } | f ^ q« n g  } | t d  f k rñ t	 d „  | Dƒ ƒ g n g  } | | f S(   Ni    i   c         s` s   |  ] } | Vq d  S(   N(    (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>Í  s    c         s` s   |  ] } | Vq d  S(   N(    (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>Ï  s    (
   t   setRf   Rd   t   addR   R?   Rr   RB   RV   R$   (   R   t   iterRl   Rb   R&   Rm   Rx   Ry   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyRi   Á  s    	41c         C` sø   t  ƒ  } xJ | D]B } | t k r( q n | t k sA | | k rE t S| j | ƒ q Wt | ƒ } | d k rr t S| d k r’ t d „  | Dƒ ƒ S| t d  f k r³ t | ƒ g n g  } | t	 d  f k rè g  | D] } | f ^ qÒ n g  } | | f S(   Ni    i   c         s` s   |  ] } | Vq d  S(   N(    (   RR   R&   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>Þ  s    (
   R   Rd   Rf   R€   R   R?   Rr   RB   R$   RV   (   R   R   Rl   Rb   R&   Rm   Rx   Ry   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   AnyÒ  s    	'5c         C` s^   g  } xE t  t |  j | ƒ d ƒ D]( \ } } | j |  j | | | ƒ ƒ q" W|  j | | ƒ S(   Ni   (   R   Rj   Ru   R   R{   Rn   (   R   Rb   Rl   t   combost   v1t   v2(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   AtMostOne_NSQã  s    ( c         C` s;   t  | ƒ } d g t | ƒ } |  j | | d d t | ƒ S(   Ni   i    (   t   listR   t   LinearBoundRr   (   R   Rb   Rl   t   litst   coeffs(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   AtMostOne_BDDé  s    c         C` sF   t  | ƒ } |  j | | ƒ } |  j | | ƒ } |  j | | f | ƒ S(   N(   R‡   R†   R‚   Rn   (   R   Rb   Rl   R„   R…   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   ExactlyOne_NSQî  s    c         C` s;   t  | ƒ } d g t | ƒ } |  j | | d d t | ƒ S(   Ni   (   R‡   R   Rˆ   Rr   (   R   Rb   Rl   R‰   RŠ   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   ExactlyOne_BDDô  s    c         C` sØ   g  } d } x’ t  | | ƒ D] \ } } | t k rD | | 7} q n  | t k s | d k rb q n  | d k  rŠ | | 7} | | } } n  | j | | f ƒ q Wt t  t | ƒ Œ  ƒ pÂ d d f \ } } | | | f S(   Ni    (    (    (   t   zipRf   Rd   R   R$   t   sorted(   R   R‰   RŠ   t   equationt   offsett   coefft   lit(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   LB_Preprocessù  s    

*c         C` sâ  t  d „  | |  Dƒ ƒ } | d d | f } | g }	 i  }
 |	 j } |	 j } |
 j } |  j } d } xq|	 rÙ|	 d \ } } } | | } | | } | d k rÁ | | k rÁ t |
 | ƒ  <qi n  | | k sÙ | d k  rì t |
 | ƒ  <qi n  | | } | | } | d 8} | | 8} | | d k  r)| n | | | f } | | ƒ } | d  k ra| | ƒ qi n  | | d k  rz| | n | | f } | | ƒ } | d  k r®| | ƒ qi n  | t | ƒ | | | d t	 ƒ|
 | ƒ  <qi W|
 | S(   Nc         s` s   |  ] } | Vq d  S(   N(    (   RR   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>  s    i   i    iÿÿÿÿRt   (
   Rh   R   t   popt   getR~   Rf   Rd   RB   t   absRr   (   R   R‰   RŠ   t   ntermst   lot   hiRl   t   totalt   targett
   call_stackt   rett   call_stack_appendt   call_stack_popt   ret_getR~   t   csumt   ndxt   lower_limitt   upper_limitt   LAt   LCt   hi_keyt   thit   lo_keyt   tlo(    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   BDD	  sF    						





%
%
,c         ` s‹  | r8 |  j  | | ƒ \ } } } | | 8} ˆ  | 8‰  n  t | ƒ } | rš | d ˆ  k rš t ‡  f d †  | Dƒ ƒ }	 t j d |	 | f ƒ | |	 8} n d }	 t d „  | |  Dƒ ƒ }
 | rç t | d g ƒ } t ˆ  |
 g ƒ ‰  n  | ˆ  k r÷ t S| d k r| d k rt n t } n |  j	 | | | | ˆ  | ƒ } |	 r‡|  j
 g  | | D] } | ^ qS| ƒ } |  j | | f | ƒ } n  | S(   Niÿÿÿÿc         3` s   |  ] } | ˆ  k Vq d  S(   N(    (   RR   R   (   Rš   (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>B  s    u+   Eliminating %d/%d terms for bound violationi    c         s` s   |  ] } | Vq d  S(   N(    (   RR   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>H  s    (   R”   R   Rh   t   logt   tracet   maxt   minRd   Rf   R¬   Ri   Rn   (   R   R‰   RŠ   R™   Rš   t
   preprocessRl   R‘   R˜   t   npruneR›   t   rest   at   prune(    (   Rš   s2   lib/python2.7/site-packages/conda/common/_logic.pyRˆ   ;  s.    
*c         C` sD   t  j t ƒ r( t  j d |  j ƒ  ƒ n  |  j j | d | ƒ} | S(   Nu"   Invoking SAT with clause count: %sR>   (   R­   t   isEnabledForR   t   debugR   R[   R7   (   R   R2   R>   R6   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   _run_satW  s    c         C` s¹   |  j  r d S|  j s g  S|  j j ƒ  } | rq d „  } t | | ƒ ƒ } | rq | d s^ d S|  j | ƒ qq n  |  j |  j d | ƒ} | rµ | d k s¢ | rµ |  j j | ƒ n  | S(   uÁ   
        Calculate a SAT solution for the current clause set.

        Returned is the list of those solutions.  When the clauses are
        unsatisfiable, an empty list is returned.

        c         s` sW   d „  } xG |  D]? } t  | | ƒ ƒ } | s7 | VPn  | d t k r | Vq q Wd  S(   Nc         s` s<   x5 |  D]- } | t  k r q n  | V| t k r Pq q Wd  S(   N(   Rd   Rf   (   t   ccR   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   preproc_l  s    iÿÿÿÿ(   R$   Rf   (   t   eqsRº   R¹   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   preprock  s    	iÿÿÿÿR>   N(	   RW   RB   R2   R[   R   R‡   R+   R¸   R   (   R   t
   additionalt	   includeIfR>   R   R¼   R6   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyRH   ]  s     			
c         ` sŠ  | d k s! t | ƒ |  j k  r= t j d ƒ |  j ƒ  } n  | d k sR |  j r‰ t j d ƒ | | r‚ t d „  | Dƒ ƒ d n d f S| s¦ t j d ƒ | d f S|  j | | ƒ \ } } } t	 | ƒ } d „  } d „  } d ‰  d }	 x’| d k rt
 t f n t f D]o}
 |
 r/t j d	 ƒ | } n t j d
 ƒ | } d „  t | | ƒ Dƒ } | | | ƒ } | } |  j } t j t ƒ r—|  j ƒ  } n  |  j j ƒ  } | rÀ|
 rÀ| d }	 n  t j d ˆ  | f ƒ xÞt
 r·|	 d k rýˆ  | d ‰ n |	 ‰ |
 rˆt ‡ f d †  t | | ƒ Dƒ ƒ } t ‡  ‡ f d †  t | | ƒ Dƒ ƒ } |  j |  j | ƒ | r§|  j |  j | ƒ q§n |  j |  j | | ˆ  ˆ t ƒ t j t ƒ ràt j d ˆ  ˆ | |  j ƒ  | f ƒ n  |  j ƒ  } | d k r,ˆ d ‰  t j d ˆ  | f ƒ ˆ  | k rtPqtnH ˆ  ˆ k } | } | | | ƒ } | } t j d ˆ  | f ƒ | rtPn  | |  _ |  j j ƒ  | k r¥|  j j | ƒ n  t |  _ d }	 qÚWt j d |
 rÍd n d | f ƒ | d k rëPq|
 rbg  t | | ƒ D] \ } } | | k r| ^ q} g  | D] } | | k r,| ^ q,} | | | ƒ }	 | ‰  qt j d | | | ƒ ƒ qW| | f S(   uý   
        Minimize the objective function given by (coeff, integer) pairs in
        zip(coeffs, lits).
        The actual minimization is multiobjective: first, we minimize the
        largest active coefficient value, then we minimize the sum.
        u#   Clauses added, recomputing solutionu   Constraints are unsatisfiablec         s` s   |  ] } t  | ƒ Vq d  S(   N(   R—   (   RR   R   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>  s    i   u!   Empty objective, trivial solutioni    c         ` s   t  ‡  f d †  |  Dƒ ƒ S(   Nc         3` s!   |  ] } ˆ  j  | d  ƒ Vq d S(   i    N(   R–   (   RR   t   s(   t   objective_dict(    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>™  s    (   R¯   (   t   solRÀ   (    (   RÀ   s2   lib/python2.7/site-packages/conda/common/_logic.pyt   peak_val˜  s    c         ` s   t  ‡  f d †  |  Dƒ ƒ S(   Nc         3` s!   |  ] } ˆ  j  | d  ƒ Vq d S(   i    N(   R–   (   RR   R¿   (   RÀ   (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>œ  s    (   Rh   (   RÁ   RÀ   (    (   RÀ   s2   lib/python2.7/site-packages/conda/common/_logic.pyt   sum_val›  s    u   Beginning peak minimizationu   Beginning sum minimizationc         S` s   i  |  ] \ } } | | “ q S(    (    (   RR   R   R´   (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pys
   <dictcomp>¨  s   	 u   Initial range (%d,%d)i   c         3` s'   |  ] \ } } | ˆ  k r | Vq d  S(   N(    (   RR   R   R´   (   t   mid(    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>½  s    c         3` s7   |  ]- \ } } ˆ  | k o& ˆ k n r | Vq d  S(   N(    (   RR   R   R´   (   R™   RÄ   (    s2   lib/python2.7/site-packages/conda/common/_logic.pys	   <genexpr>¾  s    u+   Bisection attempt: (%d,%d), (%d+%d) clausesu$   Bisection failure, new range=(%d,%d)u$   Bisection success, new range=(%d,%d)u   Final %s objective: %du   peaku   sumu   New peak objective: %dN(   RB   R   R2   R­   R·   RH   RW   Rh   R”   R¯   Rr   RV   R®   RŽ   R¶   R   R   R[   R   R$   Rq   R‚   Rs   Rˆ   R   (   R   R‰   RŠ   t   bestsolt   trymaxR‘   t   maxvalRÂ   RÃ   t   try0t   peakt   objvalRÀ   t   bestvalRš   t   m_origt   nzR   t   preventt   requiret   newsolt   doneR   R´   (    (   R™   RÄ   s2   lib/python2.7/site-packages/conda/common/_logic.pyt   minimize„  s’    !*
		(			%(	!
		
#4%	N(    R   R   t   _sat_solver_cls_to_strR9   R   R   R   R^   Rc   Rn   Rp   Rq   Rs   RB   RV   Ru   Rz   R{   R|   R~   Ri   R‚   R†   R‹   RŒ   R   R”   R¬   Rˆ   R¸   RH   RÒ   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyRU     s4   								)						2	'N(   t
   __future__R    R   R   R   R   t	   itertoolsR   t   loggingR   R   t   sysR   R   R­   t   _BIG_NUMBERRf   Rd   t   objectR	   R   R'   R9   RC   RL   RX   t   itemsRÓ   RU   (    (    (    s2   lib/python2.7/site-packages/conda/common/_logic.pyt   <module>   s(   "->0
