ó
l‚z]c           @` sd  d  d l  m Z m Z m Z m Z d  d l m Z m Z m Z d  d l	 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	 l m Z d d
 l m Z m Z m Z d d l m Z d d l m Z m Z m  Z  m! Z! m" Z" 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- d d l. m/ Z/ m0 Z0 m1 Z1 m2 Z2 d d l3 m4 Z4 m5 Z5 d d l6 m7 Z7 m8 Z8 d d l9 m: Z: d d l; m< Z< d d l= m> Z> e e? ƒ Z@ e d ƒ ZA e2 ZB e1 Z1 e! e jC e) f e jD e( f e jE e* f g ƒ ZF e e jC d „ ƒ ZG d d „ ZH d „  ZI d eJ f d „  ƒ  YZK d S(   i    (   t   absolute_importt   divisiont   print_functiont   unicode_literals(   t   defaultdictt   OrderedDictt   dequeN(   t   DEBUGt	   getLoggeri   (   t
   frozendict(   t   memoizet   memoizemethod(   t   concatt   groupby(   t   tqdm(   t   ChannelPriorityt   MAX_CHANNEL_PRIORITYt   SatSolverChoice(   t   context(   t	   iteritemst   iterkeyst
   itervaluest   odictt   on_wint	   text_type(   t   time_recorder(   t   Clausest   CryptoMiniSatSolvert   PycoSatSolvert   PySatSolvert   minimal_unsatisfiable_subset(   t   toposort(   t   CondaDependencyErrort   InvalidSpect   ResolvePackageNotFoundt   UnsatisfiableError(   t   Channelt   MultiChannel(   t
   NoarchTypet   PackageType(   t	   MatchSpec(   t   PackageRecord(   t   VersionOrderu   conda.stdoutlogc         C` sì   t  |  } y | ƒ  j d ƒ Wn9 t k
 rY } t j d |  ƒ t j d | d t ƒn Xt j d |  ƒ | Sxk t  j ƒ  D]] \ } } y | ƒ  j d ƒ Wn& t k
 rÃ } t j d |  | ƒ q{ Xt j d |  ƒ | Sq{ Wt d ƒ ‚ d  S(	   Ni    u0   Could not run SAT solver through interface '%s'.u   SAT interface error due to: %st   exc_infou    Using SAT solver interface '%s'.u7   Attempted SAT interface '%s' but unavailable due to: %su*   Falling back to SAT solver interface '%s'.u@   Cannot run solver. No functioning SAT implementations available.(	   t   _sat_solverst   runt	   Exceptiont   logt   warningt   debugt   Truet   itemsR    (   t   sat_solver_choicet   clst   et   solver_choice(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   _get_sat_solver_cls+   s"    
	i   c         ` s   d j  ‡  f d †  |  Dƒ ƒ S(   Nu    c         3` s+   |  ]! } d  d ˆ  d t  | ƒ Vq d S(   u   
u    u   - N(   t   str(   t   .0t   x(   t   indent(    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>C   s    (   t   join(   t   iterableR<   (    (   R<   s,   lib/python2.7/site-packages/conda/resolve.pyt   dashlistB   s    c         C` sh   | j  d k r[ |  j | ƒ } d } | rd x+ | d j D] } | t | ƒ j  7} q8 Wqd n	 | j  } | S(   uÜ   Sorting key to emphasize packages that have more strict
    requirements. More strict means the reduced index can be reduced
    more, so we want to consider these more constrained deps earlier in
    reducing the index.i   i    (   t
   strictnesst   find_matchest   dependsR(   (   t   resolve_objt   mst   prect   valuet   dep(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   exactness_and_number_of_depsF   s    	t   Resolvec           B` s*  e  Z e d. d  „ Z d „  Z d/ d/ d „ Z e d „ Z e d „ Z	 e d „ Z
 d „  Z d „  Z d „  Z d/ d/ d	 „ Z d
 „  Z d „  Z d/ d/ d „ Z d „  Z e d „  ƒ Z d „  Z e d e  ƒ e d „ ƒ Z d „  Z d „  Z d „  Z d/ d „ Z e d „  ƒ Z e d „ Z e d „  ƒ Z e d „  ƒ Z  d „  Z! e d e  ƒ d „  ƒ Z" d „  Z# d „  Z$ d „  Z% d „  Z& d  „  Z' d! „  Z( d" „  Z) e d# „ Z* d$ „  Z+ d% „  Z, d& „  Z- d' „  Z. d( „  Z/ e d) „ Z0 d/ e e d* „ Z1 d+ „  Z2 d, „  Z3 e d e  ƒ e e d/ d/ e d- „ ƒ Z4 RS(0   c         C` s¥  | |  _  | |  _ | r' |  j | ƒ n i  |  _ t j |  _ t j |  _ t	 d t
 | ƒ ƒ } t t ƒ } x¡ | D]™ } g  | | D] } | j r | ^ q } | r¿ t j d | ƒ | | | <n  d „  | | Dƒ }	 x3 |	 D]+ } x" | j D] }
 | |
 j | ƒ qê WqÚ Wqp W| |  _ | |  _ i  |  _ i  |  _ i  |  _ i  |  _ i  |  _ d „  | Dƒ |  _ x? |  j j ƒ  D]. \ } } t | d |  j d t ƒ|  j | <qoWd  S(   Nu   nameu(   restricting to unmanageable packages: %sc         s` s   |  ] } | j  r | Vq d  S(   N(   t   track_features(   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>h   s    c         S` s7   h  |  ]- } t  | d  ƒ r | j t j k r | ’ q S(   u   package_type(   t   hasattrt   package_typeR'   t   VIRTUAL_SYSTEM(   R:   t   _(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <setcomp>u   s   	 t   keyt   reverse(   t   indext   channelst   _make_channel_prioritiest   _channel_priorities_mapR   t   channel_priorityt   _channel_priorityt   solver_ignore_timestampst   _solver_ignore_timestampsR   R   R   t   listt   is_unmanageableR/   R1   RJ   t   appendt   groupst   trackerst   _cached_find_matchest   ms_depends_t   _reduced_index_cachet   _pool_cachet   _strict_channel_cachet   _system_precsR3   t   sortedt   version_keyR2   (   t   selfRQ   t	   processedRR   R\   R]   t   nameRE   t   unmanageable_precst   tf_precst   feature_namet   group(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   __init__X   s4    		&							c         C` s¼   t  t |  ƒ j ƒ  t t |  j ƒ ƒ At t |  j ƒ ƒ At |  j ƒ At |  j	 ƒ At t d „  |  j
 j ƒ  Dƒ ƒ ƒ At t d „  |  j j ƒ  Dƒ ƒ ƒ At t d „  |  j j ƒ  Dƒ ƒ ƒ AS(   Nc         s` s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   t   tuple(   R:   t   kt   v(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>†   s    c         s` s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   Rn   (   R:   Ro   Rp   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>‡   s    c         s` s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   Rn   (   R:   Ro   Rp   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ˆ   s    (   t   superRI   t   __hash__t   hasht	   frozensetRR   R	   RT   RV   RX   R\   R3   R]   R_   (   Rf   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyRr   €   s    ˜c         ` s   d d l  m ‰  | d  k r% i  } n
 | j ƒ  | j ‡  f d †  t |  j ƒ Dƒ ƒ | r{ | j ‡  f d †  | Dƒ ƒ n  | S(   Ni   (   t   make_feature_recordc         ` s   i  |  ] } t  ˆ  | ƒ “ q S(    (   t   False(   R:   t   fstr(   Ru   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>”   s   	 c         ` s   i  |  ] } t  ˆ  | ƒ “ q S(    (   R2   (   R:   Rw   (   Ru   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>–   s   	 (   t   core.subdir_dataRu   t   Nonet   cleart   updateR   R]   (   Rf   t   featurest   filter(    (   Ru   s,   lib/python2.7/site-packages/conda/resolve.pyt   default_filter‹   s    	
& c         ` sL   ‡ ‡ f d †  } ‡ ‡ ‡ f d †  ‰ ‡  ‡ ‡ f d †  ‰ | | ƒ } | S(   uí  Tests if a package, MatchSpec, or a list of both has satisfiable
        dependencies, assuming cyclic dependencies are always valid.

        Args:
            spec_or_prec: a package record, a MatchSpec, or an iterable of these.
            filter: a dictionary of (fkey,valid) pairs, used to consider a subset
                of dependencies, and to eliminate repeated searches.
            optional: if True (default), do not enforce optional specifications
                when considering validity. If False, enforce them.

        Returns:
            True if the full set of dependencies can be satisfied; False otherwise.
            If filter is supplied and update is True, it will be updated with the
            search results.
        c         ` s#   t  |  t ƒ r ˆ |  ƒ Sˆ  |  ƒ S(   N(   t
   isinstanceR(   (   t   spec(   t   v_fkey_t   v_ms_(    s,   lib/python2.7/site-packages/conda/resolve.pyt   v_©   s    c         ` s2   ˆ  r |  j  p1 t ‡ f d †  ˆ j |  ƒ Dƒ ƒ S(   Nc         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R:   t   fkey(   R   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>®   s    (   t   optionalt   anyRA   (   RD   (   R…   Rf   R   (    s,   lib/python2.7/site-packages/conda/resolve.pyR‚   ¬   s    c         ` s…   ˆ  j  |  ƒ } | d  k r t ˆ  |  <y ˆ j |  ƒ } Wn t k
 rY t } ˆ  |  <q Xt ‡ f d †  | Dƒ ƒ } ˆ  |  <n  | S(   Nc         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R:   RD   (   R‚   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>¹   s    (   t   getRy   R2   t
   ms_dependsR!   Rv   t   all(   RE   t   valRB   (   R}   Rf   R‚   (    s,   lib/python2.7/site-packages/conda/resolve.pyR   °   s    
'(    (   Rf   t   spec_or_precR}   R…   Rƒ   t   result(    (   R}   R…   Rf   R   R‚   s,   lib/python2.7/site-packages/conda/resolve.pyt   valid™   s
    c         ` sL   ‡ ‡ f d †  } t  ‡ ‡ ‡ f d †  ƒ ‰ ‡  ‡ ‡ f d †  ‰ | | ƒ S(   Nc         ` s'   t  |  t ƒ r ˆ |  ƒ Sˆ  |  ƒ Sd  S(   N(   R   R(   (   t   _spec_or_prec(   t   is_valid_prect   is_valid_spec(    s,   lib/python2.7/site-packages/conda/resolve.pyt   is_validÀ   s    
c         ` s2   ˆ r |  j  p1 t ‡  f d †  ˆ j |  ƒ Dƒ ƒ S(   Nc         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R:   t   _prec(   R   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>É   s    (   R…   R†   RA   (   t   _spec(   R   R…   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pyR   Æ   s    c         ` s’   ˆ  j  |  ƒ } | d  k r t ˆ  |  <y) t ‡ f d †  ˆ j |  ƒ Dƒ ƒ } Wn t k
 ro d } ˆ  |  <q X| r| t n d } ˆ  |  <n  | S(   Nc         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R:   RD   (   R   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>Ñ   s    u   invalid dep specsu   invalid depends specs(   R‡   Ry   Rv   R‰   Rˆ   R!   (   RE   RŠ   t   has_valid_deps(   t
   filter_outR   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pyR   Ì   s    
)(   R   (   Rf   R‹   R•   R…   R‘   (    (   R•   R   R   R…   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   valid2¿   s    c         ` s(   ‡  ‡ ‡ ‡ f d †  ‰  ˆ  | t  ƒ  ƒ S(   u  Constructs a set of 'dependency chains' for invalid specs.

        A dependency chain is a tuple of MatchSpec objects, starting with
        the requested spec, proceeding down the dependency tree, ending at
        a specification that cannot be satisfied.

        Args:
            spec: a package key or MatchSpec
            filter: a dictionary of (prec, valid) pairs to be used when
                testing for package validity.

        Returns:
            A tuple of tuples, empty if the MatchSpec is valid.
        c   
      3` s	  |  j  | k r d  S| j |  j  ƒ ˆ j |  ˆ ˆ ƒ r< d  Sˆ j |  ƒ } t } t ƒ  } xa | D]Y } xP ˆ j | ƒ D]? } x6 ˆ  | | ƒ D] } t } |  f | Vq W| j | ƒ qw Wqa W| st d „  | ƒ } x, | j	 ƒ  D] }	 |  f t
 j |	 ƒ Vqã Wn  d  S(   Nc         S` s   |  j  S(   N(   Rh   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   <lambda>û   t    (   Rh   t   addR   RA   Rv   t   setRˆ   R2   R   t   valuesR(   t   union(
   R€   t   namest   precst   foundt   conflict_depsRE   t   m2R;   t   conflict_groupsRl   (   t   chains_R}   R…   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pyR£   é   s$    	(   Rš   (   Rf   R€   R}   R…   (    (   R£   R}   R…   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   invalid_chainsÚ   s    c         ` sš   g  } g  } t  ƒ  } x@ | D]8 } | j d ƒ } | rG | j | ƒ q | j | ƒ q W| j ‡  f d †  | Dƒ ƒ | rŠ t | ƒ ‚ n  t | ƒ | f S(   uO  Perform a quick verification that specs and dependencies are reasonable.

        Args:
            specs: An iterable of strings or MatchSpec objects to be tested.

        Returns:
            Nothing, but if there is a conflict, an error is thrown.

        Note that this does not attempt to resolve circular dependencies.
        u   track_featuresc         3` s2   |  ]( } | j  r ˆ  j | ƒ r | f Vq d  S(   N(   R…   RA   (   R:   R€   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    (   Rš   t   get_exact_valueR{   R[   t   extendR"   Rn   (   Rf   t   specst   non_tf_specst   bad_depst   feature_namesRD   t   _feature_names(    (   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   verify_specs  s    	c      	   ` se  i t  ƒ  d 6t  ƒ  d 6t  ƒ  d 6t  ƒ  d 6} t  d „  | p@ g  Dƒ ƒ } t  d „  | p\ g  Dƒ ƒ } x¡| D]™‰  ˆ  d j d k rwt ˆ  ƒ d k rwt d	 „  | Dƒ ƒ rwt d
 „  | Dƒ ƒ rwg  | D]# } | d j d k rÌ | d ^ qÌ } | r| d } t  |  j | ƒ ƒ t  |  j ˆ  d ƒ ƒ @st| d j t ˆ  d ˆ  d g ƒ t t | d d  ƒƒ f ƒ qtqqm ˆ  d j d k rîg  |  j
 D] } | j d k r”| ^ q”}	 |	 rÈ|	 d j n d }	 | d j t ˆ  ƒ |	 f ƒ qm ˆ  d | k r¢t }
 x\ | D]T } | j ˆ  d j k r| d j t ˆ  ƒ t t | d d  ƒƒ f ƒ t }
 qqW|
 s| d j t ˆ  ƒ t t ˆ  d d d  ƒƒ f ƒ qqm t ˆ  ƒ d k sÐt ‡  f d †  | Dƒ ƒ rm | d j t ˆ  ƒ t t ˆ  d d d  ƒƒ f ƒ qm qm W| d rag  | d D]5 } | d j d ƒ sNt | d ƒ d k r| ^ q| d <n  | S(   Nu   pythonu   request_conflict_with_historyu   directu   cudac         s` s   |  ] } t  | ƒ Vq d  S(   N(   R(   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>   s    c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R(   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>!  s    iÿÿÿÿi   c         s` s   |  ] } | j  d  k Vq d S(   u   pythonN(   Rh   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>%  s    c         s` s,   |  ]" } | d  j  d k r | d  Vq d S(   i    u   pythonN(   Rh   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>&  s    i    t   targetu   __cudau   not availablec         3` s5   |  ]+ } t  | ƒ d  k o, | d ˆ  d k Vq d S(   i   i    N(   t   len(   R:   t   c(   t   chain(    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>=  s    u   python (   Rš   Rh   R®   R†   RA   R™   Rn   R9   R(   Ry   Rc   t   versionRv   R2   t
   startswith(   Rf   R©   t   specs_to_addt   history_specst   strict_channel_priorityt   classesRN   t   python_first_specst   python_spect   cuda_versiont   matchR€   (    (   R°   s,   lib/python2.7/site-packages/conda/resolve.pyt   _classify_bad_deps  sJ    

%0
!%+ 
%9.'
<c         ` sE   |  j  | ƒ } | s | S|  j | j ƒ ‰  t ‡  f d †  | Dƒ ƒ S(   Nc         3` s'   |  ] } | j  j ˆ  k r | Vq d  S(   N(   t   channelRh   (   R:   t   f(   t   sole_source_channel_name(    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>L  s    (   RA   t   _get_strict_channelRh   Rn   (   Rf   RD   Rµ   t   matches(    (   R¾   s,   lib/python2.7/site-packages/conda/resolve.pyt   find_matches_with_strictG  s
    c         C` se   t  j r7 t  j s t d ƒ n  |  j | | | ƒ } n i  } t  j t j k } t | d | ƒ‚ d  S(   Nuk   
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.t   strict(	   R   t   unsatisfiable_hintst   jsont   printt   build_conflict_mapRU   R   t   STRICTR#   (   Rf   R§   R³   R´   R©   Rµ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   find_conflictsN  s    		c         C` sÈ   g  } t  d „  | ƒ } x© | j ƒ  D]› \ } } t | ƒ d k r³ yL t j d „  | Dƒ ƒ d } | d d d !} | j | ƒ | j | ƒ WqÀ t k
 r¯ | j | ƒ qÀ Xq% | j | ƒ q% W| S(   Nc         S` s   |  d j  o t |  ƒ S(   Niÿÿÿÿ(   Rh   R®   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   [  R˜   i   c         s` s   |  ] } | d  Vq d S(   iÿÿÿÿN(    (   R:   t   ch(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>_  s    i    iÿÿÿÿ(   R   R3   R®   R(   Rœ   R[   t
   ValueErrorR¦   (   Rf   t   bad_deps_for_specR©   t   bdRN   Rl   t   last_merged_spect   bad_dep(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   group_and_merge_specsY  s    c         C` se  g  } | j  | g ƒ g  } xB| r`| j d ƒ } | d } | | k rP q n  | j  | ƒ | | k rm | Sg  } | j | j ƒ  k r° g  | j | j ƒ D] }	 |	 j ^ q› n d }
 |
 d k rÈ q n  x4 |
 D], } | j g  | D] } t | ƒ ^ qâ ƒ qÏ Wx[ | D]S } | j | j k r3| j	 | j	 k r3qt
 | ƒ } | j  | ƒ | j  | ƒ qWq Wd S(   u/   Return shorted path from root_spec to spec_namei    iÿÿÿÿN(   R[   t   popRh   t   keysR‡   RB   Ry   R¦   R(   R±   RY   (   Rf   t	   root_spect   target_spect   allowed_specst   queuet   visitedt   patht   nodet   childrenRN   R§   t   depst   dt   adjt   new_path(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   breadth_first_search_by_speci  s.    	
C*$c         ` s†  t  j t j k } t | ƒ | p' t ƒ  B} t | ƒ d k r‰ ˆ j t t | ƒ ƒ ƒ } t | ƒ d k r‰ t ˆ j	 | d ƒ ƒ } q‰ n  | j
 d „  ˆ j Dƒ ƒ ‡ f d †  | Dƒ } g  } t d „  | j ƒ  Dƒ ƒ } | rð t j | Œ  n g  }	 t d t |	 ƒ d d d	 t d
 t  j ƒ ”}
 xŠ|	 D]‚‰  |
 j d j ˆ  ƒ ƒ |
 j
 ƒ  i  } x3 | j ƒ  D]% \ } } ˆ  | k rc| | | <qcqcWt | ƒ d k r¤q*n  t t j g  | j ƒ  D] } | ˆ  ^ qºŒ  ƒ rÜq*n  | j ƒ  } xÁt | d d d	 t d
 t  j ƒD]ž} | | } g  } xb | j ƒ  D]T \ } } | g  | D] } | j ^ qCk r-| j g  | D] } | j ^ qhƒ q-q-W‡  f d †  | Dƒ } | j
 ‡  f d †  | j ƒ  Dƒ ƒ g  } t d t | ƒ d d d	 t d
 t  j ƒ ™ } x | D]‡ } | j d j | ƒ ƒ | j
 ƒ  | j | j k rT| j | j k rK| g n d } n ˆ j | | | ƒ } | rø| j | ƒ qøqøWWd QX| r
| j ˆ j | ƒ ƒ q
q
Wq*WWd QX| sjg  } x¥ | D]š } ˆ j | ƒ } t j g  | D]$ } t ˆ j  j! | ƒ p	g  ƒ ^ qëŒ  }	 t" d „  |	 ƒ }	 | j g  |	 j ƒ  D] } | t# j | ƒ d g ^ q=ƒ qÉWn  ˆ j$ | | | | ƒ } | S(   uh  Perform a deeper analysis on conflicting specifications, by attempting
        to find the common dependencies that might be the cause of conflicts.

        Args:
            specs: An iterable of strings or MatchSpec objects to be tested.
            It is assumed that the specs conflict.

        Returns:
            Nothing, because it always raises an UnsatisfiableError.

        Strategy:
            If we're here, we know that the specs conflict. This could be because:
            - One spec conflicts with another; e.g.
                  ['numpy 1.5*', 'numpy >=1.6']
            - One spec conflicts with a dependency of another; e.g.
                  ['numpy 1.5*', 'scipy 0.12.0b1']
            - Each spec depends on *the same package* but in a different way; e.g.,
                  ['A', 'B'] where A depends on numpy 1.5, and B on numpy 1.6.
            Technically, all three of these cases can be boiled down to the last
            one if we treat the spec itself as one of the "dependencies". There
            might be more complex reasons for a conflict, but this code only
            considers the ones above.

            The purpose of this code, then, is to identify packages (like numpy
            above) that all of the specs depend on *but in different ways*. We
            then identify the dependency chains that lead to those packages.
        i   i    c         S` s   h  |  ] } | j  ƒ  ’ q S(    (   t   to_match_spec(   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <setcomp>ª  s   	 c         ` s%   i  |  ] } ˆ  j  | f ƒ | “ q S(    (   t   _get_package_pool(   R:   Ro   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>®  s   	 c         s` s!   |  ] } t  | j ƒ  ƒ Vq d  S(   N(   Rš   RÑ   (   R:   t   sdep(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>²  s    t   totalt   descu   Finding conflictst   leavet   disableu   Examining {}u)   Comparing specs that have this dependencyc         ` s5   h  |  ]+ } | D] } ˆ  | k r t  | ƒ ’ q q S(    (   R(   (   R:   t   pkgst   p(   RG   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <setcomp>Ë  s   	 c         3` s$   |  ] } | j  ˆ  k r | Vq d  S(   N(   Rh   (   R:   t   msspec(   RG   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>Ì  s    u   Finding conflict pathsu%   Finding shortest conflict path for {}Nc         S` s   |  j  S(   N(   Rh   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   ë  R˜   (%   R   RU   R   RÇ   Rš   R®   RA   t   nextt   iterRˆ   R{   Rc   Rn   R›   Rœ   R   Rv   RÄ   t   set_descriptiont   formatR3   t   boolt   intersectionRÑ   Rh   R¦   RB   R±   Ry   RÞ   R[   RÏ   R_   R‡   R   R(   R»   (   Rf   R§   R³   R´   Rµ   RÀ   t   sdepsR©   t   dep_collectionsRÚ   t   tt   sdeps_with_depRo   Rp   t
   spec_orderR€   RÔ   t   dep_versRO   RŠ   RN   t   dep_msRË   t   t2t   conflicting_specR°   Rž   RE   (    (   RG   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyRÆ   …  sv    
2
"*#

$':@	c         ` s™   d  } y ˆ  j | } Wn{ t k
 r” | ˆ  j k r• t d „  ˆ  j | Dƒ ƒ } ‡  f d †  | Dƒ } t | ƒ d } | | } ˆ  j | <q• n X| S(   Nc         s` s   |  ] } | j  j Vq d  S(   N(   R¼   Rh   (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ù  s    c         ` s(   i  |  ] } | ˆ  j  j | d  ƒ “ q S(   i   (   RT   R‡   (   R:   t   cn(   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>ú  s   	 i    (   Ry   Rb   t   KeyErrorR\   Rš   Rd   (   Rf   t   package_namet   channel_namet   all_channel_namest   by_cpt   highest_priority(    (   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyR¿   ó  s    c         C` s   | s
 t  S| j | d j k  S(   uH   prevent introduction of matchspecs that broaden our selection of choicesi    (   Rv   R@   (   Rf   RD   t   specs_by_name(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   _broaderÿ  s    c         C` ss   t  | ƒ } | |  j k r+ |  j | } nD |  j | ƒ } t d „  | ƒ } d „  t | ƒ Dƒ } | |  j | <| S(   Nc         S` s   |  j  S(   N(   Rh   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—     R˜   c         S` s%   i  |  ] \ } } t  | ƒ | “ q S(    (   Rš   (   R:   Ro   Rp   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>  s   	 (   Rt   Ra   t   get_reduced_indexR   R   (   Rf   R§   t   poolt   grouped_pool(    (    s,   lib/python2.7/site-packages/conda/resolve.pyRà     s    t   module_namec      
   ` sË  d d l  m ‰ t j t j k ‰	 ˆ	 t | ƒ f } | ˆ j k rN ˆ j | St j	 t
 ƒ r† t j d t t d „  | Dƒ ƒ ƒ ƒ n  ˆ j | ƒ \ } } d „  t ˆ j | ƒ ƒ Dƒ ‰ t ƒ  ‰ d  ‰
 t ƒ  ‰  | rt t | ƒ d ‡ f d †  d t ƒ} n  t | ƒ } i  ‰ x@ | D]8 } ˆ j | j t ƒ  ƒ t ˆ j | ƒ ƒ Bˆ | j <qW‡  ‡ ‡ ‡ ‡ ‡ ‡	 ‡
 f d	 †  ‰ xt t d
 ƒ D]f } ˆ j ƒ  t | ƒ } t } xA | rí| j ƒ  } | ‰
 ˆ | g ƒ } | r­| j | ƒ q­q­WqˆWd „  ‡ f d †  | Dƒ Dƒ ‰ t ƒ  }	 x4 | D], } |	 j | j t ƒ  ƒ | g |	 | j <q"WxY| D]Q}
 t ‡ ‡ ‡ f d †  ˆ j |
 ƒ Dƒ ƒ } ˆ	 rË| rËˆ j | d j ƒ ‰ t ‡ f d †  | Dƒ ƒ } n  ˆ j  d „  | Dƒ ƒ xÅ| D]½} t ƒ  } t! j" |	 ƒ } t ˆ j# | ƒ ƒ } xo | D]g } | j | j t ƒ  ƒ } | | k r}| sj| j$ | d j$ k r}| j% d | ƒ n  | | | j <q#Wx| r¥| j& ƒ  } | j' | ƒ xï ‡ f d †  ˆ j | ƒ Dƒ D]Î } ˆ j( | ˆ ƒ sîqÐn  ˆ	 sˆ j | j ƒ | j) j k rÐ| ˆ | <t ˆ j# | ƒ ƒ | } xe | D]Z } d | k rŠˆ j* | t | j | j t ƒ  ƒ ƒ ƒ rŠ| j' | ƒ q=| j' | ƒ q=WqÐqÐWq‘WqéWqYWt+ ˆ ƒ ‰ ˆ ˆ j | <ˆ S(   Ni   (   Ru   u   Retrieving packages for: %sc         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   R:   t   s(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    c         S` s+   i  |  ]! \ } } | r t  n d  | “ q S(   u   feature not enabled(   Rv   (   R:   RE   RŠ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>!  s   	RO   c         ` s   t  ˆ  |  ƒ |  j ƒ  f S(   N(   RH   t   dist_str(   R;   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   )  s    RP   c         ` sÛ  t  t |  ƒ ƒ j } ˆ j j | d ƒ } | r‘ ˆ r‘ | ˆ  k r‘ ˆ j | ƒ } x- | D]% } | j j | k rX d ˆ | <qX qX Wˆ  j | ƒ n  d } } x| D]} ˆ j | t	 ƒ s¢ | d 7} ˆ j
 |  | ƒ sö ˆ j | ƒ r
| ˆ | k r
d ˆ ˆ | <q¢ n  t ƒ  } xW ˆ j | ƒ D]F } | j r#t ‡ f d †  ˆ j | ƒ Dƒ ƒ r#| j | ƒ q#q#W| ršd d j d „  | Dƒ ƒ ˆ | <q¢ n  t	 ˆ | <| d 7} q¢ q¢ W| | k  }	 |	 rät j d	 | | | f ƒ n  t d
 „  |  Dƒ ƒ rþ|	 S| d k rd  S|	 s | ˆ k r×ˆ j | ƒ t d „  ‡ ‡ f d †  | Dƒ ƒ }
 |
 j d d  ƒ xr t |
 j ƒ  d d „  ƒD]R \ } } t | ƒ | k r~ˆ t | ƒ ƒ } | r½t }	 qÐ| d  k rÐd  Sq~q~Wn  |	 S(   Nu&   removed due to strict channel priorityi    i   u"   incompatible with required spec %sc         3` s'   |  ] } ˆ  j  | t ƒ s | Vq d  S(   N(   R‡   Rv   (   R:   t   rec(   R•   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>N  s    u   unsatisfiable dependencies %su    c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R9   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>S  s    u   %s: pruned from %d -> %dc         s` s   |  ] } | j  Vq d  S(   N(   R…   (   R:   RD   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>\  s    c         S` s   |  j  S(   N(   Rh   (   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   j  R˜   c         3` sF   |  ]< } ˆ  j  | t ƒ s ˆ j | ƒ D] } | j s( | Vq( q d  S(   N(   R‡   Rv   Rˆ   R…   (   R:   RE   t   dep_spec(   R•   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>k  s   u   *RO   c         S` s   t  d „  |  d Dƒ ƒ S(   Nc         s` s   |  ] } | j  Vq d  S(   N(   R…   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>r  s    i   (   R†   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   r  R˜   (    (   Ré   Rê   Rh   R\   R‡   R¿   R¼   R™   t
   setdefaultRv   t	   match_anyRš   Rˆ   R…   R†   RA   R=   R/   R1   Ry   R   RÐ   Rd   R3   R®   R2   (   t   _specsRh   Rl   R¾   RE   t   noldt   nnewt   unsatisfiable_dep_specsRD   t   reducedt
   _dep_specst	   deps_nameRÚ   t   res(   t   cp_filter_appliedt   explicit_spec_package_poolt   filter_groupR•   Rf   t   snamesRµ   t   top_level_spec(    s,   lib/python2.7/site-packages/conda/resolve.pyR  3  sd    

	#	
		i   c         S` s   i  |  ] } | | “ q S(    (    (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>Ž  s   	 c         3` s   |  ] } ˆ  | ƒ Vq d  S(   N(    (   R:   Rw   (   Ru   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>Ž  s    c         3` s3   |  ]) } | ˆ k r ˆ j  | ˆ  ƒ r | Vq d  S(   N(   R–   (   R:   RE   (   R•   t   reduced_index2Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>”  s    i    c         3` s'   |  ] } | j  j ˆ  k r | Vq d  S(   N(   R¼   Rh   (   R:   RE   (   t   strict_channel_name(    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>›  s    c         s` s   |  ] } | | f Vq d  S(   N(    (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    c         3` s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R:   RN   (   R  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>´  s    u   track_features(,   Rx   Ru   R   RU   R   RÇ   Rn   R`   R/   t   isEnabledForR   R1   R?   Rd   R¬   R   R~   Rš   Ry   RY   R2   R‡   Rh   RA   t   rangeRz   R   Rv   t   popleftR[   R   R¿   R{   t   copyt   deepcopyRˆ   R@   t   insertRÐ   R™   R–   R¼   R   R	   (   Rf   t   explicit_specst   sort_by_exactnesst	   cache_keyR|   R  RN   t   slistR  t   specs_by_name_seedt   explicit_spect   add_these_precs2t   pkgt
   seen_specsRÿ   t	   dep_specsRG   R§   RD   t   dep_pkgt	   new_specst   new_ms(    (   R  R  R  R•   Ru   R  Rf   R  R  Rµ   R  s,   lib/python2.7/site-packages/conda/resolve.pyR    s’    		0$O
	 	*(	)	&
	%$	c         ` s   t  ‡  f d †  | Dƒ ƒ S(   Nc         3` s   |  ] } | j  ˆ  ƒ Vq d  S(   N(   Rº   (   R:   RD   (   RE   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>Þ  s    (   R†   (   Rf   t   mssRE   (    (   RE   s,   lib/python2.7/site-packages/conda/resolve.pyR
  Ý  s    c         ` sË   ˆ  j  j ˆ d  ƒ } | d  k	 r% | Sˆ j d ƒ } | rR ˆ  j j | d ƒ } nL ˆ j d ƒ r ˆ j d ƒ } t ‡  f d †  | Dƒ ƒ } n t ˆ  j ƒ } t ‡ f d †  | Dƒ ƒ } | ˆ  j  ˆ <| S(   Nu   nameu   track_featuresc         3` s$   |  ] } ˆ  j  j | d ƒ Vq d  S(   N(    (   R]   R‡   (   R:   Rk   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ì  s    c         3` s$   |  ] } ˆ  j  | ƒ r | Vq d  S(   N(   Rº   (   R:   Rç   (   R€   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ñ  s    (    (	   R^   R‡   Ry   R¥   R\   R   R   RQ   Rn   (   Rf   R€   R  t	   spec_namet   candidate_precsRª   (    (   Rf   R€   s,   lib/python2.7/site-packages/conda/resolve.pyRA   à  s    c         C` sn   |  j  j | ƒ } | d  k rj g  | j D] } t | ƒ ^ q( } | j d „  | j Dƒ ƒ | |  j  | <n  | S(   Nc         s` s   |  ] } t  d  | ƒ Vq d S(   RJ   N(   R(   (   R:   t   feat(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ú  s    (   R_   R‡   Ry   t   combined_dependsR(   R¦   R|   (   Rf   RE   RÚ   RÛ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyRˆ   õ  s    "c         C` s  | j  } |  j j | j d ƒ } | t k  r3 d n d } t | j d d ƒ ƒ } | j d d ƒ } | j d ƒ } t | j d k ƒ }	 |  j t	 j
 k r³ | | | | |	 g }
 n | | | | |	 g }
 |  j râ |
 j | ƒ n |
 j | j d d ƒ | f ƒ |
 S(	   Ni   i    u   versionu    u   build_numberu   buildu   noarchu	   timestamp(   R¼   RT   R‡   Rh   R   R*   t   intt   subdirRV   R   t   DISABLEDRX   R[   R¦   (   Rf   RE   t   vtypeR¼   RU   R   t   version_comparatort   build_numbert   build_stringt   noarcht   vkey(    (    s,   lib/python2.7/site-packages/conda/resolve.pyRe   þ  s    		c         C` sv   t  ƒ  } xf t t d „  d „  |  Dƒ Dƒ ƒ ƒ D]> \ } } | j } | | k rW q0 n  t | t d ƒ | | <q0 W| S(   Nc         s` s:   |  ]0 } t  | t ƒ r+ d  „  | j Dƒ n | f Vq d S(   c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R$   (   R:   t   cc(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    N(   R   R%   t	   _channels(   R:   R¯   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s   c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R$   (   R:   R¯   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    i   (   R   t	   enumerateR   Rh   t   minR   (   RR   t   priorities_mapt   priority_countert   chnRû   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyRS     s    		$	c         C` sQ   t  | ƒ } |  j | ƒ } | r> | r> t | f g ƒ ‚ n  t | d |  j ƒS(   NRO   (   R(   RA   R"   Rd   Re   (   Rf   RD   t   emptyokRž   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   get_pkgs  s
    c         C` sV   t  |  t ƒ r |  j ƒ  St  |  t ƒ rI d t |  ƒ |  j rD d n d St ƒ  ‚ d  S(   Nu   @s@u   ?u    (   R   R)   R  R(   R   R…   t   NotImplementedError(   RŠ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   to_sat_name%  s
    
!c         C` s   d |  | f S(   Nu	   @fm@%s@%s(    (   t   prec_dist_strR0  (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   to_feature_metric_id/  s    c         C` sI  t  | ƒ } |  j | ƒ } | j | ƒ } | d  k	 r: | S| j ƒ  } | j d ƒ } t d „  d „  | j d ƒ pv d Dƒ Dƒ ƒ } | r¦ |  j j | g  ƒ } }	 ne | rò t	 | ƒ d k sÄ t
 ‚ t t | ƒ ƒ }
 |  j j |
 g  ƒ } }	 n |  j j ƒ  } }	 t } | s<g  | D] } | j | ƒ r| ^ q}	 n  t	 |	 ƒ t	 | ƒ k r®| j rft } q®| s®| rt  d | ƒ n	 t  | ƒ } | j |  j | | ƒ ƒ } q®n  | d  k r5g  |	 D] } |  j | ƒ ^ qÁ} | j r#| rút  d | ƒ n	 t  | ƒ } | j d |  j | ƒ ƒ n  | j | ƒ } n  | j | | ƒ | S(	   Nu   namec         s` s   |  ] } | r | Vq d  S(   N(    (   R:   t   _tf(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>=  s    c         s` s   |  ] } | j  ƒ  Vq d  S(   N(   t   strip(   R:   R½   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>>  s    u   track_featuresi   RJ   u   !(    (   R(   RE  t	   from_nameRy   t
   _is_singleR¥   Rt   R\   R‡   R®   t   AssertionErrorRé   Rê   R]   RQ   RÑ   Rv   Rº   R…   R2   t   push_MatchSpecR[   t   Anyt   name_var(   Rf   t   CR€   t   sat_namet   mt   simplet   nmt   tft   tgroupt   libsRo   R„   t   ms2RE   t	   sat_names(    (    s,   lib/python2.7/site-packages/conda/resolve.pyRM  3  sB    	&+		!!"	!c   	      C` sS  t  d t t j ƒ ƒ } xž t |  j ƒ D] \ } } g  | D] } |  j | ƒ ^ q; } x | D] } | j | ƒ q] W| j |  j t | ƒ ƒ ƒ } | j	 | j
 | | j | ƒ g ƒ q( Wxk t |  j ƒ D]Z } | j |  j | ƒ ƒ } x9 |  j | ƒ D]( } | j	 | j | |  j | | ƒ ƒ q÷ WqÉ Wt j t ƒ rOt j d | j ƒ  ƒ n  | S(   Nt   sat_solver_clsu+   gen_clauses returning with clause count: %d(   R   R8   R   t
   sat_solverR   R\   RE  t   new_varR(   t   Requiret
   ExactlyOnet   NotR   RQ   Rˆ   t   OrRM  R/   R  R   R1   t   get_clause_count(	   Rf   RP  Rh   Rl   RE   RQ  RR  t   nkeyRD   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   gen_clauses[  s    "'*c         C` sT   g  | D] } |  j  | | ƒ f ^ q } t j t ƒ rP t j d | j ƒ  ƒ n  | S(   Nu9   generate_spec_constraints returning with clause count: %d(   RM  R/   R  R   R1   Ra  (   Rf   RP  R§   RD   RŒ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_spec_constraintst  s    (c         ` sN   ‡  ‡ f d †  t  ˆ j ƒ Dƒ } t j t ƒ rJ t j d ˆ  j ƒ  ƒ n  | S(   Nc         ` s.   i  |  ]$ } d  ˆ j  ˆ  t d | ƒ ƒ “ q S(   i   RJ   (   RM  R(   (   R:   Rh   (   RP  Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>}  s   	u6   generate_feature_count returning with clause count: %d(   R   R]   R/   R  R   R1   Ra  (   Rf   RP  RŒ   (    (   RP  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_feature_count|  s    c         ` s   ‡  f d †  | Dƒ S(   Nc         ` s;   i  |  ]1 } | j  r ˆ  j | j  ƒ r d  d | j  “ q S(   i   u   !(   R­   RJ  (   R:   RD   (   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>…  s   	 (    (   Rf   RP  R§   (    (   RP  s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_update_count„  s    c         ` sñ   i  } xä t  ˆ  j ƒ D]Ó \ } } ‡  f d †  | Dƒ } t j | j ƒ  Œ  j ˆ  j ƒ } x | D]… } ˆ  j | t d | ƒ ƒ } xa | j	 ƒ  D]S \ }	 }
 | |
 k rŽ ˆ  j
 |	 | ƒ } | j | j |	 | ƒ | ƒ d | | <qŽ qŽ Wq` Wq W| S(   Nc         ` s+   i  |  ]! } t  | j ƒ ˆ  j | ƒ “ q S(    (   Rš   R|   RE  (   R:   RE   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>  s   	 RJ   i   (   R   R\   Rš   Rœ   R›   Rî   R]   RM  R(   R3   RG  RO  t   And(   Rf   RP  t   eqRh   Rl   t
   prec_featst   active_featsR0  t   clause_id_for_featuret   prec_sat_nameR|   t   feature_metric_id(    (   Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_feature_metric‡  s    !c         ` s   ‡  ‡ f d †  | Dƒ S(   Nc         ` s,   i  |  ]" } d  d ˆ j  ˆ  | j ƒ “ q S(   i   u   !(   RM  Rh   (   R:   RD   (   RP  Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>›  s   	 (    (   Rf   RP  R§   (    (   RP  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_removal_countš  s    c         ` s   ‡  ‡ f d †  | Dƒ S(   Nc         ` s1   i  |  ]' } | j  r d  ˆ j ˆ  | j ƒ “ q S(   i   (   R…   RM  Rh   (   R:   RD   (   RP  Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>ž  s   	 (    (   Rf   RP  R§   (    (   RP  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_install_count  s    c         ` s   ‡  ‡ f d †  | Dƒ S(   Nc         ` s%   i  |  ] } d  ˆ j  ˆ  | ƒ “ q S(   i   (   RM  (   R:   RT  (   RP  Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>¡  s   	 (    (   Rf   RP  t   missing(    (   RP  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_package_count   s    c         ` sª  i  } i  } i  } i  } i  } i  }	 x- | D]% }
 t  |
 ƒ }
 |	 j |
 j g  ƒ q+ Wx@t |	 ƒ D]2\ } } g  |  j j | g  ƒ D] } |  j | ƒ | f ^ qƒ } d  } xæ| D]Þ\ } ‰  | rå t ‡  f d †  | Dƒ ƒ rå q± n  | d  k r
d } } } } } nó | d | d k s2| d | d k rQ| d 7} d } } } } n¬ | d | d k r€| d 7} d } } } n} | d | d k r«| d 7} d } } nR | d | d k rÒ| d 7} d } n+ |  j	 rý| d | d k rý| d 7} n  |  j
 ˆ  ƒ } | s| r%| | | <n  | s1| r>| | | <n  | sJ| rW| | | <n  | sc| rp| | | <n  | s|| r‰| | | <n  | } q± Wqa W| | | | | f S(   Nc         3` s   |  ] } ˆ  | k Vq d  S(   N(    (   R:   Rñ   (   RE   (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>À  s    i    i   i   i   i   i   (   R(   R	  Rh   R   R\   R‡   Re   Ry   R†   RX   RE  (   Rf   RP  R§   t   include0t   eqct   eqvt   eqbt   eqat   eqtt   sdictR  Rh   t   targetsRç   Ræ   t   pkeyRe   t   ict   ivt   ibt   itt   iaRl  (    (   RE   s,   lib/python2.7/site-packages/conda/resolve.pyt   generate_version_metrics£  sX    	7"(



	c   
      C` sC  t  | t ƒ s t ‚ i  } xO t | ƒ D]A \ } } | |  j k r( t d „  |  j | ƒ Dƒ ƒ | | <q( q( Wt ræ d | k ræ xd t | ƒ D]S \ } } |  j j | ƒ } t	 | d ƒ rŒ | j
 t j k rŒ | | j d ƒ qŒ qŒ Wn  t | ƒ } | j ƒ  } g  | D]! } | | k r| j | ƒ ^ q}	 |	 j | j ƒ  ƒ |	 S(   Nc         s` s   |  ] } | j  Vq d  S(   N(   Rh   (   R:   RD   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>í  s    u   condau   noarch(   R   t   dictRL  R   RQ   Rš   Rˆ   R   R‡   RK   R9  R&   t   pythonR™   R   R  RÐ   R¦   R›   (
   Rf   t	   must_havet   digraphRú   RE   t   distt   recordt   sorted_keysRO   RŒ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   dependency_sortæ  s    *!.c   	      C` sÕ   t  j d ƒ | s d  g  f Si  } g  } xJ | D]B } | | |  j | ƒ <| j t d | j | j | j f ƒ ƒ q0 Wt	 t
 d „  | Dƒ ƒ t d |  j ƒ} | j ƒ  } | j | | ƒ } | j | ƒ } t | ƒ S(   Nu1   Checking if the current environment is consistentu   %s %s %sc         s` s   |  ] } | | f Vq d  S(   N(    (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    RR   (   R/   R1   Ry   RE  R[   R(   Rh   R±   t   buildRI   R   R2   RR   Rc  Rd  t   satRí   (	   Rf   t	   installedt   sat_name_mapR§   RE   t   r2RP  t   constraintst   solution(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   environment_is_consistent
  s    
-(c         ` sÏ   | s
 d St  | ƒ t  | ƒ B} |  j | ƒ } t ‡  ‡ f d † } t | t d |  j ƒ‰ ˆ j ƒ  ‰  | | t ƒ } d } | sÅ t |  j t d |  j ƒ‰ ˆ j ƒ  ‰  t | d | d | ƒ} n  t	 | ƒ S(   Nc         ` s"   ˆ j  ˆ  |  ƒ } ˆ  j | | ƒ S(   N(   Rd  R‹  (   R§   t   add_ifR  (   RP  RŽ  (    s,   lib/python2.7/site-packages/conda/resolve.pyt   mysat!  s    RR   R‹  R   (    (    (
   Rš   R  Rv   RI   R2   RR   Rc  RQ   R   Rn   (   Rf   R§   R   t	   all_specst   reduced_indexR“  R  t   final_unsat_specs(    (   RP  RŽ  s,   lib/python2.7/site-packages/conda/resolve.pyt   get_conflicting_specs  s    c         ` s˜  t  j d ƒ | s d  g  f Si  ‰ g  } xJ | D]B } | ˆ ˆ j | ƒ <| j t d | j | j | j f ƒ ƒ q0 Wd „  t	 ˆ ƒ Dƒ } d „  | Dƒ } d | k rd | k r| | d } d | j
 k rg  | j
 D] } | d k rÛ | ^ qÛ }	 |	 | _
 qn  t | t d ˆ j ƒ}
 |
 j ƒ  ‰  |
 j ˆ  | ƒ } ˆ  j | ƒ } d  } } | sd| ru‡ ‡ f d †  ‰ t ƒ  } |
 j ˆ  | ƒ } ˆ  j | ˆ  j ƒ  ƒ \ } } | j ‡ f d	 †  ‡  f d
 †  | Dƒ Dƒ ƒ x$ | D] } ˆ t | ƒ j | ƒ qãWt | ƒ t ˆ ƒ k  ru| } g  t ˆ ƒ D]" \ } } | d | k r.| ^ q.} t  j d d j | ƒ ƒ qun  | rŽt  j d | ƒ n  | | f S(   Nu1   Checking if the current environment is consistentu   %s %s %sc         S` s   i  |  ] } | | “ q S(    (    (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>;  s   	 c         S` s   i  |  ] } | | j  “ q S(    (   Rh   (   R:   Rç   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp><  s   	 u   pythonu   pipRR   c         ` sj   |  | k rf | j  |  ƒ xJ ˆ j j |  g  ƒ D]0 } x' ˆ j | ƒ D] } ˆ  | j | ƒ qE Wq/ Wn  d  S(   N(   R™   R\   R‡   Rˆ   Rh   (   Rh   R  t   fnRD   (   t   get_Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pyR™  I  s
    c         3` s?   |  ]5 } | r | d  d k r d | k r ˆ  | d Vq d S(   i    u   !u   @u   nameN(    (   R:   RQ  (   R  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>U  s   c         3` s   |  ] } ˆ  j  | ƒ Vq d  S(   N(   t
   from_index(   R:   R  (   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>V  s    u   nameu-   Limiting solver to the following packages: %su   , u   Packages to be preserved: %s(   R/   R1   Ry   RE  R[   R(   Rh   R±   RŠ  R   RB   RI   R2   RR   Rc  Rd  R‹  Rš   Ro  t   minimizeR{   R®   R   R=   (   Rf   RŒ  R+  R§   RE   t	   new_indext   name_mapt   python_precRÛ   t   new_depsRŽ  R  R  t   limitt   xtraR  t   eq_optional_cRN   R€   RQ  R  (    (   RP  R™  R  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyt   bad_installed2  sJ    
-(
		c         ` s:   | r6 d „  | Dƒ ‰  | j  ‡  f d †  | Dƒ ƒ n  d  S(   Nc         S` s   i  |  ] } | | j  “ q S(    (   Rh   (   R:   RE   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>f  s   	 c         3` s$   |  ] } | j  ˆ  k r | Vq d  S(   N(   Rh   (   R:   Rç   (   Ry  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>g  s    (   R¦   (   Rf   Ræ   t   preserve(    (   Ry  s,   lib/python2.7/site-packages/conda/resolve.pyt   restore_badd  s    c      
   C` s(  t  t t | ƒ ƒ } d „  | Dƒ } t j d ƒ |  j | | ƒ \ } } xË | D]Ã } | |  j k rl qQ n  | j | j | j	 } }	 }
 | j
 j } | | k sQ | d  k	 r¿ | | k r¿ qQ n  | rã t d | d | j ƒ  ƒ } n! t d | d |	 d |
 d | ƒ } | j d | ƒ qQ Wt | ƒ | f S(	   Nc         S` s   h  |  ] } | j  ’ q S(    (   Rh   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <setcomp>k  s   	 u*   Checking satisfiability of current installRh   R­   R±   RŠ  R¼   i    (   RY   t   mapR(   R/   R1   R£  RQ   Rh   R±   RŠ  R¼   t   canonical_nameRy   R  R  Rn   (   Rf   R§   RŒ  t   update_depsR  R   R¤  RE   Rh   R±   RŠ  t   schannelR€   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   install_specsi  s"    $c         C` s_   |  j  | | p g  | ƒ \ } } g  } | rK |  j | d | d t ƒ} n  |  j | | ƒ | S(   Nt	   returnallt   _remove(   Rª  t   solveRv   R¥  (   Rf   R§   RŒ  R¨  R«  R¤  Ræ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   install  s    !c         C` s5  g  } x^ t  t | ƒ D]M } | j ƒ  rJ | j t | d d d t ƒƒ q | j t | d t ƒƒ q Wt d „  | Dƒ ƒ } |  j | | ƒ \ } } g  } x | D]… }	 |	 j |	 j }
 } |
 | k rÍ q¢ q¢ | d  k	 ré | j |	 ƒ q¢ | j t d |
 d | rd | n d  d t d |	 j
 ƒ  ƒ ƒ q¢ W| | f S(   NR±   u   @R…   c         s` s!   |  ] } | j  r | j  Vq d  S(   N(   Rh   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>˜  s    Rh   u   >=R­   (   R¦  R(   RK  R[   R2   Rš   R£  Rh   R±   Ry   R  (   Rf   R§   RŒ  t   nspecsR  R  R   RN   R¤  RE   RT  t   ver(    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   remove_specs‰  s&    "c         C` sA   |  j  | | ƒ \ } } |  j | d t ƒ} |  j | | ƒ | S(   NR¬  (   R±  R­  R2   R¥  (   Rf   R§   RŒ  R¤  Ræ   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   remove©  s    c   ;      ` s1	  t  j t ƒ r> t d „  t | ƒ Dƒ ƒ } t  j d | ƒ n  | rq t | d t ƒ rq t d „  | Dƒ ƒ } n  t	 | ƒ } | sŠ t ƒ  St  j d ƒ t
 | ƒ } ˆ j | ƒ }	 |	 st	 ƒ  }
 t	 ƒ  } xO | D]G } ˆ j | ƒ sÑ | j ˆ j k r| j | ƒ q|
 j | ƒ qÑ qÑ W|
 r1t |
 ƒ ‚ n1 | rbt g  | D] } | g ^ qAd t ƒ‚ n  | rwt i  ƒ ‚ qˆ j | | | ƒ n  t  j d ƒ t ‡  ‡ f d † } ‡  f d	 †  ‰ ‡  ‡ f d
 †  } t |	 t d ˆ j ƒ‰ ˆ j ƒ  ‰  | | t ƒ } | s4| rt i  ƒ ‚ q4ˆ j | | | ƒ n  g  } g  } g  } t	 ˆ j ƒ } xÀ t | ƒ D]² \ } } | j | k r| j | j ƒ n  | j sÄ| j s®| | k r´| n | j | ƒ qbt ˆ j | ƒ ƒ rbt | j d t d | j ƒ} | j | ƒ | j | ƒ qbqbW| j d „  | Dƒ ƒ t  j t ƒ rÙt  j d t t d „  | Dƒ ƒ ƒ ƒ t  j d t t d „  | Dƒ ƒ ƒ ƒ t  j d t t d „  | Dƒ ƒ ƒ ƒ t  j d t t d „  | Dƒ ƒ ƒ ƒ n  t  j d ƒ | r)ˆ j ˆ  | ƒ } ˆ  j  | | ƒ \ } } t  j d | ƒ n  t  j d ƒ ˆ j! ˆ  | ƒ \ } } } } } ˆ  j  | | ƒ \ } } ˆ  j  | | ƒ \ } } t  j d | | ƒ t  j d ƒ ˆ j" ˆ  ƒ } ˆ  j  | | ƒ \ } }  t  j d |  ƒ ˆ j# ˆ  ƒ }! ˆ  j  |! | ƒ \ } }" t  j d |" ƒ t  j d ƒ ˆ  j  | | ƒ \ } }# t  j d |# ƒ t  j d  ƒ ˆ  j  | | ƒ \ } }$ t  j d! |$ ƒ | sÏt  j d" ƒ ˆ j$ ˆ  | ƒ }% ˆ  j  |% | ƒ \ } }& t  j d# |& ƒ n  t  j d$ ƒ ˆ j% ˆ  | ƒ }' ˆ  j  |' | ƒ \ } }( t  j d% |( ƒ t  j d& ƒ ˆ j! ˆ  | ƒ \ }) }* }+ }, }- ˆ  j  |) | ƒ \ } }. ˆ  j  |* | ƒ \ } }/ ˆ  j  |+ | ƒ \ } }0 ˆ  j  |, | ƒ \ } }1 t  j d' |. |/ |0 |1 ƒ t  j d( ƒ ˆ j& ˆ  | ƒ }) ˆ  j  |) | d) t ƒ\ } } t  j d* | ƒ | | ƒ sN|- j' | ƒ ˆ  j  |- | ƒ \ } }2 t  j d+ |2 ƒ n  t  j d, ƒ d- }3 g  }4 ˆ | ƒ }5 |4 j |5 ƒ x‹ t rt ‡  f d. †  |5 Dƒ ƒ }6 ˆ  j( |6 f t ƒ } | d  k rÊPn  |3 d- 7}3 |3 d/ k rñt  j d0 ƒ Pn  ˆ | ƒ }5 |4 j |5 ƒ qƒW|3 d- k rÄt* t+ t	 |4 ƒ ƒ }7 t	 j, |7 Œ  }8 g  |7 D] }9 t t	 |9 ƒ |8 ƒ ^ qE}: t- j. sÄt/ j0 d1 |3 d/ k r‹d2 n |3 t d3 „  |: Dƒ ƒ |3 d/ k r³d4 n d5 f ƒ qÄn  ‡ f d6 †  t1 ˆ j2 ƒ Dƒ ‰ | r
	t
 |4 ƒ d- k r
	t3 ƒ  ‚ q
	n  t ‡ f d7 †  |4 d Dƒ d8 d9 „  ƒS(:   Nc         s` s7   |  ]- \ } } t  d  | | | j | j f ƒ Vq d S(   u   %i: %s target=%s optional=%sN(   R   R­   R…   (   R:   t   iR  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>´  s   u   Solving for: %si    c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R(   (   R:   RN   (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>º  s    u2   Solve: Getting reduced index of compliant packagest   chainsu!   Solve: determining satisfiabilityc         ` s"   ˆ j  ˆ  |  ƒ } ˆ  j | | ƒ S(   N(   Rd  R‹  (   R§   R’  R  (   RP  RŽ  (    s,   lib/python2.7/site-packages/conda/resolve.pyR“  Þ  s    c         ` sI   g  ‡  f d †  |  Dƒ D]. } | r | d d k r d | k r | ^ q S(   Nc         3` s   |  ] } ˆ  j  | ƒ Vq d  S(   N(   Rš  (   R:   R  (   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ä  s    i    u   !u   @(    (   t   solt   q(   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pyt   cleanã  s    c         ` sN   ˆ |  ƒ } t  ‡  f d †  | Dƒ ƒ } ˆ  j | f d t ƒd k rJ t St S(   uz   Determine if the SAT problem has converged to a single solution.

            This is determined by testing for a SAT solution with the current
            clause set and a clause in which at least one of the packages in
            the current solution is excluded. If a solution exists the problem
            has not converged as multiple solutions still exist.
            c         3` s'   |  ] } ˆ  j  ˆ  j | ƒ ƒ Vq d  S(   N(   R_  RJ  (   R:   R¶  (   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>ð  s    t	   includeIfN(   Rn   R‹  Rv   Ry   R2   (   R  t	   psolutiont   nclause(   RP  R·  (    s,   lib/python2.7/site-packages/conda/resolve.pyt   is_convergedç  s
    RR   R…   R­   c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R(   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    u   Requested specs: %sc         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    u   Optional specs: %sc         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    u   All other specs: %sc         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    u   missing specs: %sc         s` s   |  ] } t  | ƒ Vq d  S(   N(   R   (   R:   R  (    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>  s    u    Solve: minimize removed packagesu   Package removal metric: %du.   Solve: maximize versions of requested packagesu-   Initial package channel/version metric: %d/%du#   Solve: minimize track_feature countu   Track feature count: %du   Package misfeature count: %du3   Solve: maximize build numbers of requested packagesu    Initial package build metric: %du5   Solve: prefer arch over noarch for requested packagesu   Noarch metric: %du0   Solve: minimize number of optional installationsu#   Optional package install metric: %du,   Solve: minimize number of necessary upgradesu   Dependency update count: %duh   Solve: maximize versions and builds of indirect dependencies.  Prefer arch over noarch where equivalent.uD   Additional package channel/version/build/noarch metrics: %d/%d/%d/%du!   Solve: prune unnecessary packagest   trymaxu   Weak dependency count: %du   Timestamp metric: %du   Looking for alternate solutionsi   c         3` s'   |  ] } ˆ  j  ˆ  j | ƒ ƒ Vq d  S(   N(   R_  RJ  (   R:   R¶  (   RP  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>g  s    i
   u   Too many solutions; terminatinguP   
Warning: %s possible package resolutions (only showing differing packages):%s%su   >10c         s` s   |  ] } d  j  | ƒ Vq d S(   u   , N(   R=   (   R:   t   diff(    (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>{  s    u   
  ... and othersu    c         ` s"   i  |  ] } | ˆ  j  | ƒ “ q S(    (   RE  (   R:   RE   (   Rf   (    s,   lib/python2.7/site-packages/conda/resolve.pys
   <dictcomp>  s   	 c         3` s   |  ] } ˆ  | Vq d  S(   N(    (   R:   RQ  (   Rœ  (    s,   lib/python2.7/site-packages/conda/resolve.pys	   <genexpr>Œ  s    RO   c         S` s   |  j  S(   N(   Rh   (   R;   (    (    s,   lib/python2.7/site-packages/conda/resolve.pyR—   Œ  R˜   (4   R/   R  R   R?   R=  R1   R   R(   Rn   Rš   R®   R  RA   Rh   R\   R™   R"   R#   Rv   RÈ   RI   R2   RR   Rc  R²  R…   R­   R[   R†   R¦   Rd   Ro  R›  R  Re  Rn  Rp  Rf  Rr  R{   R‹  Ry   RY   R¦  Rî   R   RÄ   t	   stdoutlogt   infoR   RQ   t   RuntimeError(;   Rf   R§   R«  R¬  R³   R´   t   should_retry_solvet   dlistt   len0R•  t   not_found_packagest   wrong_version_packagesR  RÛ   R“  R»  R  t   specot   specrt   specat   specmRo   R¢  t   obj7t   eq_req_ct   eq_req_vt   eq_req_bt   eq_req_at   eq_req_tt   obj3at   obj3t   eq_feature_countt   obj1t   eq_feature_metrict   obj2t   obj4t
   noarch_objt   eq_optional_installt   obj49t   eq_ut   obj50t   eq_ct   eq_vt   eq_bt   eq_at   eq_tt   obj5at   obj5t   obj6t   obj6at   obj6tt   nsolt
   psolutionsR¹  Rº  t   psols2t   commonRµ  t   diffs(    (   RP  R·  Rœ  RŽ  Rf   s,   lib/python2.7/site-packages/conda/resolve.pyR­  ¯  s   			+	+&&&)!	!		
)	#(    N(5   t   __name__t
   __module__Rv   Rm   Rr   Ry   R~   R2   R   R–   R¤   R¬   R»   RÁ   RÈ   RÏ   RÞ   RÆ   R¿   R   R   Rà   R   R  R
  RA   Rˆ   Re   t   staticmethodRS   RC  RE  RG  RM  Rc  Rd  Re  Rf  Rn  Ro  Rp  Rr  R  R‰  R‘  R—  R£  R¥  Rª  R®  R±  R²  R­  (    (    (    s,   lib/python2.7/site-packages/conda/resolve.pyRI   V   s`   (	&'		,			n		Ë				
	(							C	$			2		 	(L   t
   __future__R    R   R   R   t   collectionsR   R   R   R  t   loggingR   R   t   _vendor.auxlib.collectionR	   t   _vendor.auxlib.decoratorsR
   R   t   _vendor.toolzR   R   t   _vendor.tqdmR   t   base.constantsR   R   R   t   base.contextR   t   common.compatR   R   R   R   R   R   t	   common.ioR   t   common.logicR   R   R   R   R   t   common.toposortR   t
   exceptionsR    R!   R"   R#   t   models.channelR$   R%   t   models.enumsR&   R'   t   models.match_specR(   t   models.recordsR)   t   models.versionR*   Rë  R/   R¾  t   Unsatisfiablet   PYCOSATt   PYCRYPTOSATt   PYSATR,   R8   R?   RH   t   objectRI   (    (    (    s,   lib/python2.7/site-packages/conda/resolve.pyt   <module>   s@   ".("	