
    wBf                   ,   d Z ddlmZ ddl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 dd	lmZ dd
l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 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+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 	 ddl8m8Z8  ee<      Z= ed      Z>e+Z?e*Z*ej                  e!ej                  e"ej                  e#iZC e	d      ej                  fd       ZDd ZE G d d      ZFy# e9$ r	 ddl:m;Z8 Y pw xY w)zuLow-level SAT solver wrapper/interface for the classic solver.

See conda.core.solver.Solver for the high-level API.
    )annotationsN)defaultdictdeque)	lru_cache)DEBUG	getLogger)tqdm   memoizemethod)MAX_CHANNEL_PRIORITYChannelPrioritySatSolverChoice)context)on_win)dashlisttime_recorder)groupby_to_dict)TRUEClausesPycoSatSolverPyCryptoSatSolverPySatSolverminimal_unsatisfiable_subset)toposort)CondaDependencyErrorInvalidSpecResolvePackageNotFoundUnsatisfiableError)ChannelMultiChannel)
NoarchTypePackageType	MatchSpec)PackageRecord)VersionOrder)
frozendict)FrozenOrderedDictzconda.stdoutlog)maxsizec                   d }t         |    }	  ||       t        j                  d|        |S # t        $ r8}t        j	                  d|        t        j                  d|d       Y d }~nd }~ww xY wt         j                         D ]Q  }	  ||       t        j                  d|        |c S # t        $ r!}t        j                  d| |       Y d }~Kd }~ww xY w t        d	      )
Nc                   t        |       }|j                         |j                         h} |j                  |j                  g|  t	        |j                               }|j                  |      st        d| d|       y )N
sat_solverzWrong SAT solution: z. Required: )r   new_varRequireAndsetsatissubsetRuntimeError)r.   crequiredsolutions       -lib/python3.12/site-packages/conda/resolve.pytry_out_solverz+_get_sat_solver_cls.<locals>.try_out_solverB   st    z*IIK-		!%%#(#quuw<  *!5hZ|H:VWW +    z Using SAT solver interface '%s'.z0Could not run SAT solver through interface '%s'.zSAT interface error due to: %sT)exc_infoz*Falling back to SAT solver interface '%s'.z7Attempted SAT interface '%s' but unavailable due to: %sz@Cannot run solver. No functioning SAT implementations available.)_sat_solverslogdebug	Exceptionwarningvaluesr   )sat_solver_choicer:   r.   es       r9   _get_sat_solver_clsrE   @   s    X /0J	z" 			46GH  F>@Q	
 			2A	EE	F #))+ 

	:& IIBDUV  	III! 	 J s,   . 	A/.A**A/
B,,	C5CCc                    |j                   dk(  rC| j                  |      }d}|r,|d   j                  D ]  }|t        |      j                   z  } |S |j                   }|S )zSorting 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.
       r   )
strictnessfind_matchesdependsr%   )resolve_objmsprecvaluedeps        r9   exactness_and_number_of_depsrP   f   sj     
}}''+Aw 332223 L Lr;   c                      e Zd Zd/dZ fdZd0dZd1dZd1dZd1dZd Z	d Z
d	 Zd0d
Z	 d2dZd Zd0dZd Zed        Zd Z ee       	 d3d       Zd Zd4dZd5dZd6dZed        Zd7dZed        Zed        Zd Z ee       d        Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd7d$Z(	 	 	 	 d8d%Z)d& Z*d' Z+d( Z,d) Z-d1d*Z.d9d+Z/d, Z0d- Z1 ee       	 	 	 	 	 d:	 	 	 	 	 d;d.       Z2 xZ3S )<Resolvec                r   || _         || _        |r| j                  |      ni | _        t        j
                  | _        t        j                  | _        t        d |j                               }t        t              }|D ]v  }||   D cg c]  }|j                  s| }}|rt        j                  d|       |||<   d ||   D        }	|	D ]'  }|j                   D ]  }
||
   j#                  |        ) x || _        || _        i | _        i | _        i | _        i | _        i | _        |D ch c]-  }t3        |d      r|j4                  t6        j8                  k(  r|/ c}| _        | j$                  j=                         D ]*  \  }}t?        || j@                  d      | j$                  |<   , y c c}w c c}w )Nc                    | j                   S Nnamexs    r9   <lambda>z"Resolve.__init__.<locals>.<lambda>   s
    166 r;   z(restricting to unmanageable packages: %sc              3  :   K   | ]  }|j                   s|  y wrU   track_features.0rM   s     r9   	<genexpr>z#Resolve.__init__.<locals>.<genexpr>   s     M9L9LMs   package_typeTkeyreverse)!indexchannels_make_channel_priorities_channel_priorities_mapr   channel_priority_channel_prioritysolver_ignore_timestamps_solver_ignore_timestampsgroupbyrB   r   listis_unmanageabler>   r?   r]   appendgroupstrackers_cached_find_matchesms_depends__reduced_index_cache_pool_cache_strict_channel_cachehasattrra   r#   VIRTUAL_SYSTEM_system_precsitemssortedversion_key)selfre   	processedrf   rq   rr   rW   rM   unmanageable_precstf_precsfeature_name_groups                r9   __init__zResolve.__init__x   s   
 7?D))(3R 	$ ")!9!9)0)I)I&)5<<>:t$ 	8D39$<!X44CWCW$!X!X!		DdK1tMMH  8$($7$7 8L\*11$788	8  $&!$&!%'" 
>*NNk&@&@@	 
  ;;,,. 	RKD% &u$2B2BD QDKK	R? "Y"
s   	F/F/-2F4c                ,   t         |          t        t        | j                              z  t        t        | j                              z  t        | j                        z  t        | j                        z  t        t        d | j                  j                         D                    z  t        t        d | j                  j                         D                    z  t        t        d | j                  j                         D                    z  S )Nc              3  <   K   | ]  \  }}|t        |      f  y wrU   tupler_   kvs      r9   r`   z#Resolve.__hash__.<locals>.<genexpr>   s     L1q%(mL   c              3  <   K   | ]  \  }}|t        |      f  y wrU   r   r   s      r9   r`   z#Resolve.__hash__.<locals>.<genexpr>   s     N1q%(mNr   c              3  <   K   | ]  \  }}|t        |      f  y wrU   r   r   s      r9   r`   z#Resolve.__hash__.<locals>.<genexpr>   s     Q1q%(mQr   )super__hash__hash	frozensetrf   r(   rh   rj   rl   rq   r{   rr   rt   )r~   	__class__s    r9   r   zResolve.__hash__   s    G9T]]+,-:d::;<= 4))*+ 4112	3
 :L8I8I8KLLMN :N8K8K8MNNOP :Q8H8H8N8N8PQQRS		
r;   c                   ddl m} |i }n|j                          |j                  | j                  j                         D ci c]  } ||      d c}       |r&|j                  |D ci c]  } ||      d c}       |S c c}w c c}w )Nr
   make_feature_recordFT)core.subdir_datar   clearupdaterr   keys)r~   featuresfilterr   fstrs        r9   default_filterzResolve.default_filter   s    9>FLLN:>--:L:L:NO$ &-O	
 MMxPt.t4d:PQ	 P Qs   B+B	c                H     fd} fd fd ||      }|S )a  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                D    t        | t              r |       S  |       S rU   
isinstancer%   )specv_fkey_v_ms_s    r9   v_zResolve.valid.<locals>.v_   s    ",T9"=5;P74=Pr;   c                n    xr | j                   xs# t        fdj                  |       D              S )Nc              3  .   K   | ]  } |        y wrU    )r_   fkeyr   s     r9   r`   z/Resolve.valid.<locals>.v_ms_.<locals>.<genexpr>   s     Gwt}G   optionalanyrI   )rL   r   r~   r   s    r9   r   zResolve.valid.<locals>.v_ms_   s6      KKHG1B1B21FGGr;   c                    j                  |       }|2d| <   	 j                  |       }t        fd|D              x}| <   |S |S # t        $ r dx}| <   Y |S w xY w)NTc              3  .   K   | ]  } |        y wrU   r   )r_   rL   r   s     r9   r`   z1Resolve.valid.<locals>.v_fkey_.<locals>.<genexpr>   s     ,I2U2Y,Ir   F)get
ms_dependsallr   )rM   valrJ   r   r~   r   s      r9   r   zResolve.valid.<locals>.v_fkey_   s}    **T"C{#tJ"ood3G *-,I,I)IIC&,J3J	 # /)..C&, J	/s   A	 	AAr   )r~   spec_or_precr   r   r   resultr   r   s   ` ``  @@r9   validzResolve.valid   s$    "	Q	
	 L!r;   c                V     fd}t          fd        fd ||      S )Nc                D    t        | t              r |       S  |       S rU   r   )_spec_or_precis_valid_precis_valid_specs    r9   is_validz Resolve.valid2.<locals>.is_valid   s#    -3$]33$]33r;   c                n    xr | j                   xs# t        fdj                  |       D              S )Nc              3  .   K   | ]  } |        y wrU   r   )r_   _precr   s     r9   r`   z8Resolve.valid2.<locals>.is_valid_spec.<locals>.<genexpr>   s     R}U+Rr   r   )_specr   r   r~   s    r9   r   z%Resolve.valid2.<locals>.is_valid_spec   s8      #NNSR9J9J59QRRr;   c                    j                  |       }|7d| <   	 t        fdj                  |       D              }|rdndx}| <   | S | S # t        $ r dx}| <   Y | S w xY w)NFc              3  .   K   | ]  } |        y wrU   r   )r_   rL   r   s     r9   r`   z8Resolve.valid2.<locals>.is_valid_prec.<locals>.<genexpr>  s      ).0b))r   zinvalid depends specszinvalid dep specs)r   r   r   r   )rM   r   has_valid_deps
filter_outr   r~   s      r9   r   z%Resolve.valid2.<locals>.is_valid_prec   s    ..&C{#(
4 	%( )48OOD4I) &N "05LC*T* 7Ns7N # A-@@C*T*
 7NAs   #A A$#A$r   )r~   r   r   r   r   r   r   s   ` `` @@r9   valid2zResolve.valid2   s.    	4 
	 
		  %%r;   c                <      fd |t                     S )a  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    K   | j                   |v ry |j                  | j                          j                  |       ry j                  |       }d}t	               }|D ]A  }j                  |      D ]+  } 
||      D ]  }d}| f|z     |j                  |       - C |s>t        d |      }|j                         D ]  }	| ft        j                  |	      z     y y w)NFTc                    | j                   S rU   rV   rX   s    r9   rZ   z9Resolve.invalid_chains.<locals>.chains_.<locals>.<lambda>1  s
    AFF r;   )
rW   addr   rI   r2   r   rm   rB   r%   union)r   namesprecsfoundconflict_depsrM   m2rY   conflict_groupsr   chains_r   r   r~   s             r9   r   z'Resolve.invalid_chains.<locals>.chains_  s     yyE!IIdii zz$1%%d+EEEM .//$/ .B$R/ . $#gk). &))"-.. ")*:M"J,335 ;E'IOOE$:::; s   C#C&)r2   )r~   r   r   r   r   s   ` ``@r9   invalid_chainszResolve.invalid_chains  s     	;, tSU##r;   c                    g }g }t               }|D ]8  }|j                  d      }|r|j                  |       (|j                  |       : |j	                   fd|D               |rt        |      t        |      |fS )aO  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.
        r]   c              3  ^   K   | ]$  }|j                   sj                  |      s|f & y wrU   )r   rI   )r_   r   r~   s     r9   r`   z'Resolve.verify_specs.<locals>.<genexpr>K  s/      
MM$*;*;D*A G
   *-)r2   get_exact_valuer   rp   extendr   r   )r~   specsnon_tf_specsbad_depsfeature_namesrL   _feature_namess   `      r9   verify_specszResolve.verify_specs7  s      	(B//0@AN$$^4##B'	( 	 
$
 	

 (22\"M11r;   c                V   t               t               t               t               d}|xs g D ch c]  }t        |       }}|xs g D ch c]  }t        |       }}|D ]i  t              dkD  r؉d   j                  dk(  rt	        d |D              st	        d |D              r|D cg c]  }|d   j                  dk(  s|d    }}|sp|d   }t        | j                  |            t        | j                  d               z  r|d   j                  t        d   d   g      t        t        |d             f       d   j                  j                  d	      rj| j                  D cg c]!  }|j                  d   j                  k(  s |# }	}|	r|	d   j                  nd
}
|d   j                  t              |
f       rd   |v rd}|D ]T  }|j                  d   j                  k(  s |d   j                  t              t        t        |d             f       d}V |r|d   j                  t              t        t        d   d             f       t              dkD  st	        fd|D              s4|d   j                  t              t        t        d   d             f       l |d   r;|d   D cg c])  }|d   j                  d      st        |d         dkD  r|+ c}|d<   |S c c}w c c}w c c}w c c}w c c}w )N)pythonrequest_conflict_with_historydirectvirtual_packager
   r   c              3  :   K   | ]  }|j                   d k(    yw)r   NrV   r_   r   s     r9   r`   z-Resolve._classify_bad_deps.<locals>.<genexpr>d  s     E1AFFh.Es   c              3  L   K   | ]  }|d    j                   dk(  s|d      yw)r   r   NrV   r   s     r9   r`   z-Resolve._classify_bad_deps.<locals>.<genexpr>e  s#     H!A$))x2G!Hs   $
$r   )target__znot availabler   Fr   Tr   c              3  T   K   | ]  }t        |      d k\  xr |d   d   k(   ! yw)r
   r   Nlen)r_   r6   chains     r9   r`   z-Resolve._classify_bad_deps.<locals>.<genexpr>  s3      )9:CFaK4AaDE!H$44)   %(zpython )r2   r%   r   rW   r   rI   r   r   str
startswithrz   version)r~   r   specs_to_addhistory_specsstrict_channel_priorityclassesr   python_first_specspython_specr   virtual_package_versionmatchr   r   s                @r9   _classify_bad_depszResolve._classify_bad_depsT  s    e-0Ue"u	
 /;.@bA	!AA/</BC!1CC .	E E
Q"INNh.EEEHhHH4<%Vq!		X@Uad%V"%V%"4Q"7KD--k:;d//b	:;<  )-- %uQxr&; < #Ik$$G H r**40&*&8&8UAFFeBinn<T1UU*1GAJ&& ( )*..e>U/VWq\)) %DyyE"INN2 ?@DD"5\3yd/K+LM !%% H%))us9U1Xd+K'LM u:>S )>F) & H%))us9U1Xd+K'LMY.	` 8 !*!Q4??9-QqTQ !GH
 s BC &W V8!s)   LL/LL9!L!L!.L&c                    | j                  |      }|s|S | j                  |j                        t        fd|D              S )Nc              3  V   K   | ]   }|j                   j                  k(  s| " y wrU   channelrW   )r_   fsole_source_channel_names     r9   r`   z3Resolve.find_matches_with_strict.<locals>.<genexpr>  s!     V1199>>=U+UQVs   )))rI   _get_strict_channelrW   r   )r~   rL   r   matchesr  s       @r9   find_matches_with_strictz Resolve.find_matches_with_strict  sA    ##B'&N#'#;#;BGG#D VVVVr;   c                    t         j                  r/t         j                  st        d       | j	                  |||      }ni }t         j
                  t        j                  k(  }t        ||      )Nzk
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.)strict)	r   unsatisfiable_hintsjsonprintbuild_conflict_mapri   r   STRICTr   )r~   r   r   r   r   r   s         r9   find_conflictszResolve.find_conflicts  s`    &&<<M ..ulMRHH")":":o>T>T"T 2IJJr;   c                   g }|j                  |g       g }g }|rb|j                  d      d   }||v r|j                  |       |j                  |k(  rt        |      dk(  r|j                         t        |d         t              k(  r,t	        j
                  d   |d   d   f      d   }	|	|d   d<   n|j                         t        |      |k(  xr t        fd|D              }
t        |      dk(  s|
r|S |}dd D ]  }||   }	 |j                  |i       D cg c]  }| }}||D ]>  }t        |      |k  st              }|j                  |       |j                  |       @ |rb|S c c}w )z1Return shorted path from root_spec to target_namer   r   c              3  L   K   | ]  }t        |      t              k7    y wrU   r   )r_   r   paths     r9   r`   z=Resolve.breadth_first_search_for_dep_graph.<locals>.<genexpr>  s%      M,-CFc$i'Ms   !$)	rp   poprW   r   r%   r   r   r   rn   )r~   	root_spectarget_name	dep_graphnum_targetsqueuevisitedtarget_pathsnode	last_specfound_all_targets	sub_graphpr   childrenadjnew_pathr  s                    @r9   "breadth_first_search_for_dep_graphz*Resolve.breadth_first_search_for_dep_graph  s    i[!99Q<D8DwNN4 yyK'|$) ''-|B'(CI5 )b<;KB;O0P QRS TI+4L$R( ''-$'$5$D % M16M J! u:?&7''!I!BZ )%aL	)#,==r#:;a;H; +|${2#DzHOOC(LL*	+5 >  <s   )	Fc                   |i i}t               }|gg}|r|j                  d      }|}|D ]  }||   }	 |d   }| j                  |      }	|	D ]  }
t        |
j                        dkD  s|
j                  D ]{  }t        |      }|j                  |i i       |j                  |       t        |      }|j                  |       t        |      t        j                  k  sk|j                  |       }  |r||fS )Nr   r   )r2   r  rI   r   rJ   r%   r   r   rn   rp   r   unsatisfiable_hints_check_depth)r~   r   r  all_depsr  r  r  r  parent_noder  matinew_noder  s                 r9   build_graph_of_depszResolve.build_graph_of_deps  s    2J	599Q<D!I )%aL	)r(K''4G 	3s{{#a' [[ 3#,Q<!(((B8 X.#': 1x=G,S,SS!LL23	3 " (""r;   c           
     H
   t         j                  t        j                  k(  }t	        |      |xs
 t	               z  }|D ch c]   }|j
                  j                  d      r|" }}t        |      dk(  rN| j                  t        t        |                  }t        |      dk(  rt	        | j                  |d               }|j                  | j                  D ch c]  }|j                          c}       |D ]  }| j                  |f        i }i }	t!        t        |      ddt         j"                        5 }
|D ]  }|
j%                  d|        |
j                          | j'                  |      \  }}|j                  |       |	j)                  |j
                        r|	|j
                     j+                  |       n|g|	|j
                  <   |D ]L  }|	j)                  |j
                        r|	|j
                     j+                  |       =|g|	|j
                  <   N  	 ddd       g }i }|	j-                         D ]x  \  }t/        |      }t        |      dkD  r-|j)                  |      g||<   7||   j+                         Lj                  d      s^t1        fd	|D              ssg||<   z t!        t        |      d
dt         j"                        5 }
|j-                         D ]  \  }}|
j%                  dj3                  dj5                  d |D                           |
j                          |D cg c]  }| }}g }d}t/        |      j7                  |D ch c]  }|j
                   c}      }|r|j+                  |D cg c]  }|j
                  |v s| c}       |d   d   }|D ]S  }||d   d   k7  s|j
                  }|	|   j9                  |      }| j;                  ||||      }|j=                  |       U $|D ]k  }|	|   j9                  |d         }| j;                  |d   |||      }|j=                  |       t        |      dk(  st        |      t        |      k  sh|}|}m |dd D ];  }|	|   j9                  |      }| j;                  ||||      }|j=                  |       =  	 ddd       | j?                  ||||      }|S c c}w c c}w # 1 sw Y   xY wc c}w c c}w c c}w # 1 sw Y   ExY w)aU  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:
            bad_deps: A list of lists of bad deps

        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.
        r   r
   r   zBuilding graph of depsF)totaldescleavedisablez
Examining Nc              3  B   K   | ]  }|j                   k7  s|  y wrU   rV   )r_   sr   s     r9   r`   z-Resolve.build_conflict_map.<locals>.<genexpr>9  s     +L!!A+Ls   zDetermining conflictszExamining conflict for {} c              3  4   K   | ]  }|j                     y wrU   rV   r   s     r9   r`   z-Resolve.build_conflict_map.<locals>.<genexpr>D  s     ?V1?V   r   ) r   ri   r   r  r2   rW   r   r   rI   nextiterr   r   rz   to_match_spec_get_package_poolr	   r  set_descriptionr(  r   rp   r{   r   r   formatjoinintersectioncountr   r   r   ) r~   r   r   r   r   r   r  r   r  dep_listtdep_graph_for_specall_deps_for_specrO   chainsconflicting_pkgs_pkgsr   set_vrootsnodeslrootscurrent_shortest_chainshortest_noderequested_spec_unsatrootsearch_nodenum_occurancesr6   r  r   r   r   s                                   @r9   r
  zResolve.build_conflict_map  s   < #*":":o>T>T"TE
l3ce4"'J$tyy/C/CD/IJJu:?''T%[(9:G7|q DOOGAJ781C1CDAaoo'DE 	,D""D7+	, 	e*)LL	
 	4
  4!!Jtf"56
8<8P8PQU8V5"$5  !34<<		*TYY'..t4+/&HTYY', 4C||CHH- *11$7.2V*	44	4*  "NN$ 
	3DAqaLE5zA~(,,U3;453)%0)%077:d#+Lu+L(L01s%e,
	3 e*(LL	
 -	)
  5 ; ; = ')u!!/66sxx?VPU?V7VW 
%*+!++)+& $'0'7'D'D%*+QVV+($ (MMe"VqvvAU7U1"VW$*2JqMM % -6!9Q</*7*<*<K-5k-B-H-H-NN $ G G $k9n!A #MM!,- !& 
1)1$)=)=fQi)H $ G G"1ItY! e,56!;s5zC2M @ 6;2,0M
1 !'qr
 ))1-)@)F)Ft)L CC -N a()E')-	)^ **L-1H
 A K
 E	4 	4\ , , #W%-	) -	)sj    S2"S2S7>C,S<(A"T
	T	T1TTT0T4TB2TAT<T	TT!c                v   d }	 | j                   |   }|S # t        $ r || j                  v r| j                  |   D ch c]  }|j                  j                   nc c}w }}|D ci c]  }| j
                  j                  |d      |! nc c}w }}t        |      d   }||   x}| j                   |<   Y |S w xY w)Nr
   r   )rw   KeyErrorrq   r   rW   rh   r   r|   )r~   package_namechannel_namerM   all_channel_namescnby_cphighest_prioritys           r9   r  zResolve._get_strict_channelp  s    	55lCL    	t{{*26++l2K%*.DLL%%% %! %
 0 0044R;R?   $*%=$  KP$K t99,G 	s&    (B8AB8&$B
*B87B8c                @    |sy|j                   |d   j                   k  S )zIPrevent introduction of matchspecs that broaden our selection of choices.Fr   )rH   )r~   rL   specs_by_names      r9   _broaderzResolve._broader  s$     }}}Q/::::r;   c                   t        |      }|| j                  v r| j                  |   }|S | j                  |      }t        d |      }|j	                         D ci c]  \  }}|t        |       }}}|| j                  |<   |S c c}}w )Nc                    | j                   S rU   rV   rX   s    r9   rZ   z+Resolve._get_package_pool.<locals>.<lambda>  s
    QVV r;   )r   rv   get_reduced_indexrm   r{   r2   )r~   r   poolgrouped_poolr   r   s         r9   r6  zResolve._get_package_pool  s    % D$$$##E*D 	 ))%0D"#3T:L*6*<*<*>?$!QAs1vI?D?&*DU# @s   B)module_namec                t	    !" ddl m t        j                  t        j
                  k(  !!t        |      f}| j                  v r j                  |   S t        j                  t              r/t        j                  dt        t        d |D                            j                  |      \  }} j                  |      j!                         D ci c]  \  }}||rdnd c}}t#               d "t#               |rt        t%        |       fdd	      }t        |      }i |D ]N  }j'                  |j(                  t#                     t#         j+                  |            z  |j(                  <   P  !"fd
t#               }	t-        d      D ]_  }
j/                          t1        |      }|s!|j3                         } |g      r|j5                  |       n|	j7                  |       |r?a |	r|ri S fd|D        D ci c]  }|| c}i }|D ]/  }|j'                  |j(                  g       |gz   ||j(                  <   1 |D ]2  }t         fd j+                  |      D              }!r4|r2 j9                  |d   j(                         t         fd|D              }j;                  d |D               |D ]  }t#               }t=        j>                  |      }t#         jA                  |            }|D ]a  }|j'                  |j(                  g       }||vr0|r|jB                  |d   jB                  k\  r|jE                  d|       |||j(                  <   c |s|jG                         }|j7                  |       fd j+                  |      D        D ]  } jI                  |      s!r3 j9                  |j(                        |jJ                  j(                  k(  sK||<   t#         jA                  |            |z
  }|D ]^  }d|vrG jM                  |t        |j'                  |j(                  d                  s|j7                  |       N|j7                  |       `  |r 5 tO               j                  |<   S c c}}w c c}w )Nr
   r   zRetrieving packages for: %sc              3  2   K   | ]  }t        |        y wrU   r   r_   r/  s     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr>  s     ?1A?   Fzfeature not enabledc                <    t        |       | j                         fS rU   )rP   dist_str)rY   r~   s    r9   rZ   z+Resolve.get_reduced_index.<locals>.<lambda>  s    ;D!DajjlS r;   Trb   c                t   t        t        |             j                  }j                  j	                  |d      }|rNrL|vrHj                  |      }|D ]!  }|j                  j                  |k7  sd|<   # j                  |       dx}}|D ]  }j                  |d      r|dz  }j                  | |      rj	                  |      r||   vr	dz  |<   Nt               }j                  |      D ]D  }|j                  rt        fdj                  |      D              r4|j                  |       F |rdd	j                  d
 |D              z  |<   d|<   |dz  } ||k  }	|	rt         j#                  d|||fz         t        d | D              r|	S |dk(  ry |	s|vrj                  |       t%        d fd|D              }
|
j'                  dd        t)        |
j+                         d       D ].  \  }}t-        |      |k\  s t        |            }|rd}	+|. y  |	S )Nr   z&removed due to strict channel priorityr   Fr
   z"incompatible with required spec %sc              3  F   K   | ]  }j                  |d       s|  ywFN)r   )r_   recr   s     r9   r`   zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>  s'      7 ##->>#u#=  7s   !zunsatisfiable dependencies %sr0  c              3  2   K   | ]  }t        |        y wrU   r_  r`  s     r9   r`   zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>  s      V'(CFVra  z%s: pruned from %d -> %dc              3  4   K   | ]  }|j                     y wrU   r   )r_   rL   s     r9   r`   zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>  s     022;;0r2  c                    | j                   S rU   rV   )r/  s    r9   rZ   zAResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>   s
    aff r;   c              3     K   | ]:  }j                  |d       s&j                  |      D ]  }|j                  s|  < ywrf  )r   r   r   )r_   rM   dep_specr   r~   s      r9   r`   zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>  sN       )~~dE:(,(=	 %'00	 ! s   A A*c                ,    t        d | d   D              S )Nc              3  4   K   | ]  }|j                     y wrU   rj  r   s     r9   r`   zTResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>.<locals>.<genexpr>  s     9S!**9Sr2  r
   r   rX   s    r9   rZ   zAResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>  s    c9SaPQd9S6S r;   rc   T)r3  r4  rW   rq   r   r  r   r   
setdefault	match_anyr2   r   r   r   rI   r9  r>   r?   rm   r  r|   r{   r   )_specsrW   r   r  rM   noldnnewunsatisfiable_dep_specsrL   reduced
_dep_specs	deps_namedepsrescp_filter_appliedexplicit_spec_package_poolfilter_groupr   r~   snamesr   top_level_specs                 r9   r  z/Resolve.get_reduced_index.<locals>.filter_group  s~   V%**DKKOOD"-E 0TAR5R+/+C+CD+I(! TD||((,DD+S
4(T "%%d+ OD4 !,,T59AID NN648266t< (B4(HH A>Q #4( !.1e+"ood3 <!{{3 7'+'8'8'<7 4
 477;< /+JSXX V,CV N ,
4( !',Jt$AID36 TkG		4dD7IIJ000 $f,

4 $$$)	
 sD)'-$$&,S( 	(OIt 4yD(*3t95&*G [#'	( Nr;      c              3  .   K   | ]  } |        y wrU   r   )r_   r   r   s     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr>-  s     #S$$7$=#Sr   c              3  N   K   | ]  }|vrj                  |      r|  y wrU   )r   )r_   rM   r   reduced_index2r~   s     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr>3  s.      %~-$++dJ2O %s   "%r   c              3  T   K   | ]  }|j                   j                  k(  r| ! y wrU   r   )r_   rM   strict_channel_names     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr><  s,      )||((,?? )r   c              3  $   K   | ]  }||f 
 y wrU   r   r^   s     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr>A  s     !L44,!L   c              3  ,   K   | ]  }|vs|  y wrU   r   )r_   r   r  s     r9   r`   z,Resolve.get_reduced_index.<locals>.<genexpr>Z  s      $A^<S$s   	r]   r   )(r   r   r   ri   r   r  r   ru   r>   isEnabledForr   r?   r   r|   r   r   r{   r2   rn   r   rW   rI   ranger   r   popleftrp   r   r  r   copydeepcopyr   rH   insertr  r   r   rV  r(   )#r~   explicit_specssort_by_exactnessexit_on_conflict	cache_keyr   rM   r   r/  pruned_to_zeror   slistspecs_by_name_seedexplicit_specadd_these_precs2pkg
seen_specsrU  	dep_specsrO   r   rL   dep_pkg	new_specsnew_msr~  r  r  r   r   r  r  r  r   r  s#   `                        @@@@@@@@@@r9   rY  zResolve.get_reduced_index  s   
 	:")":":o>T>T"T+U>-BB	111,,Y77E"II-???@
 $(#4#4^#D  "00:@@B
c 3%$99

 E $^$SN ~.%'" 	*A1K1O1O2D%%a()2*&qvv.	*
S	 S	t q 	*ALLN.)EMMO$LLO"&&q) 	* .I $T(#S
D$J
   	RA);)?)?)Kqc)Qqvv&	R+ I	;M$ % --m<%   '+;&*&>&>?OPQ?R?W?W&X##( ) 0) $ 
 !!!L;K!LL' 8;
 !U
 $.@ A 45	$ 4C)--chh;E%'!S^^uQx7J7J%JQ,.3M#((+4   #BNN2&$#'#4#4R#8$ !;  ${{7J?$  7 44W\\B&334 7>N73 ),DOOG,D(E
(RI*3 ; $46#A$--$*$)-*;*;FKK*L$MK" %.MM&$9 %/NN6$:#;!!;  #8;#I	;d $N3/=!!),w
B
s   R/
R5c                ,    t        fd|D              S )Nc              3  @   K   | ]  }|j                          y wrU   r   )r_   rL   rM   s     r9   r`   z$Resolve.match_any.<locals>.<genexpr>  s     0b288D>0   rq  )r~   mssrM   s     `r9   rt  zResolve.match_any  s    0C000r;   c                     j                   j                  d       }||S j                  d      }|r j                  j                  |d      }nej                  d      r:j                  d      }t        j
                  j                   fd|D              }n j                  j                         }t        fd|D              }| j                   <   |S )NrW   r   r]   c              3  V   K   | ]   }j                   j                  |d        " yw)r   N)rr   r   )r_   r   r~   s     r9   r`   z'Resolve.find_matches.<locals>.<genexpr>  s'      <8D!!,3<s   &)c              3  F   K   | ]  }j                  |      s|  y wrU   r  )r_   r  r   s     r9   r`   z'Resolve.find_matches.<locals>.<genexpr>  s     @!$**Q-A@s   !!)
rs   r   r   rq   	itertoolsr   from_iterablere   rB   r   )r~   r   r}  	spec_namecandidate_precsr   s   ``    r9   rI   zResolve.find_matches  s    ''++D$7?J((0	"kkooi<O!!"23 001ABM'oo;; <HU< O #jj//1O@@@*-!!$'
r;   c                    | j                   j                  |      }|S|j                  D cg c]  }t        |       }}|j	                  d |j
                  D               || j                   |<   |S c c}w )Nc              3  4   K   | ]  }t        |         yw)r\   Nr$   )r_   feats     r9   r`   z%Resolve.ms_depends.<locals>.<genexpr>  s     Q4	66Qr2  )rt   r   combined_dependsr%   r   r   )r~   rM   r|  ds       r9   r   zResolve.ms_depends  sk    ##D)<*.*?*?@QIaL@D@KKQ4==QQ%)DT" As   A3c                   |j                   }| j                  j                  |j                  d      }|t        k  rdnd}t        |j                  dd            }|j                  dd      }|j                  d      }t        |j                  dk(         }	| j                  t        j                  k7  r	|| |||	g}
n||| ||	g}
| j                  r|
j                  |       |
S |
j                  |j                  dd      |f       |
S )	Nr
   r   r    build_numberbuildnoarch	timestamp)r   rh   r   rW   r   r'   intsubdirrj   r   DISABLEDrl   rp   r   )r~   rM   vtyper   ri   r   version_comparatorr  build_stringr  vkeys              r9   r}   zResolve.version_key  s   ,,77;;LL!
 &(<<!)$((9b*ABxx2xx(dkkX-..!!_%=%==,,.@,PVWD-0@/@,PVWD))KK%  KK+q1<@Ar;   c                    i }t        t        j                  j                  d d | D        D                    D ],  \  }}|j                  }||v rt        |t        dz
        ||<   . |S )Nc              3  h   K   | ]*  }t        |t              rd  |j                  D        n|f , yw)c              3  2   K   | ]  }t        |        y wrU   r    )r_   ccs     r9   r`   z=Resolve._make_channel_priorities.<locals>.<genexpr>.<genexpr>  s     33ra  N)r   r!   	_channelsr_   r6   s     r9   r`   z3Resolve._make_channel_priorities.<locals>.<genexpr>  s9      *  a. 4q{{3T*s   02c              3  2   K   | ]  }t        |        y wrU   r  r  s     r9   r`   z3Resolve._make_channel_priorities.<locals>.<genexpr>  s     7'!*7ra  r
   )	enumerater  r   r  rW   minr   )rf   priorities_mappriority_counterchnrO  s        r9   rg   z Resolve._make_channel_priorities  s    %.OO)) * 8h7	* &
 	!c 88L~-+. "6":,N<(	 r;   c                    t        |      }| j                  |      }|s|st        |fg      t        || j                        S )Nrr  )r%   rI   r   r|   r}   )r~   rL   emptyokr   s       r9   get_pkgszResolve.get_pkgs  sB    r]!!"%W(2%11e!1!122r;   c                    t        | t              r| j                         S t        | t              r!dt	        |       z   | j
                  rdz   S dz   S t               )Nz@s@?r  )r   r&   rc  r%   r   r   NotImplementedError)r   s    r9   to_sat_namezResolve.to_sat_name  sO     c=)<<>!Y'3s8#cllsCCCC%''r;   c                    d|  d| S )Nz@fm@@r   )prec_dist_strr  s     r9   to_feature_metric_idzResolve.to_feature_metric_id  s    m_AdV,,r;   c                F   t        |      }| j                  |      }|j                  |      }||S |j                         }|j	                  d      }t        d d |j	                  d      xs dD        D              }|r| j                  j                  |g       x}}	nc|rCt        |      dk(  sJ t        t        |            }
| j                  j                  |
g       x}}	n| j                  j                         x}}	d}|s!|D cg c]  }|j                  |      s| }	}t        |	      t        |      k(  rO|j                  rt         }n<|s:|rt        |      n
t        |      }|j                  | j#                  ||            }|w|	D cg c]  }| j                  |       }}|j                  r<|rt        |      n
t        |      }|j%                  d	| j                  |      z          |j'                  |      }|j)                  ||       |S c c}w c c}w )
NrW   c              3  $   K   | ]  }|r| 
 y wrU   r   )r_   _tfs     r9   r`   z)Resolve.push_MatchSpec.<locals>.<genexpr>  s      
 
r  c              3  <   K   | ]  }|j                           y wrU   )strip)r_   r   s     r9   r`   z)Resolve.push_MatchSpec.<locals>.<genexpr>  s     Xa	Xr   r]   r   r
   Fr\   !)r%   r  	from_name
_is_singler   r   rq   r   r   r3  r4  rr   re   r   r   r   r   push_MatchSpecrp   Anyname_var)r~   Cr   sat_namemsimplenmtftgrouplibsr   r   ms2rM   	sat_namess                  r9   r  zResolve.push_MatchSpec  s   ##D)KK!=O"!!&) 
X4+?+?@P+Q+WUWX
 
  KKOOB33FTr7a<<T"XA MM--a44FT JJOO--FTF%+@Ttzz$/?D@D@t9F#}}68ir2imKK 3 3As ;<9<@AD))$/AIA}}68ir2im  t'7'7'<!<=i A	

1h A Bs   	H HHc           
     l   t        t        t        j                              }| j                  j                         D ]  \  }}|D cg c]  }| j                  |       }}|D ]  }|j                  |        |j                  | j                  t        |                  }|j                  |j                  ||j                  |      gz           | j                  j                         D ]  }|j                  | j                  |            }| j                  |      D ]K  }|j                  j!                  d      r|j                  |j"                  || j%                  ||             M  t&        j)                  t*              r$t&        j-                  d|j/                                |S c c}w )Nr-   r   z+gen_clauses returning with clause count: %d)r   rE   r   r.   rq   r{   r  r/   r%   r0   
ExactlyOneNotre   rB   r   rW   r   Orr  r>   r  r   r?   get_clause_count)	r~   r  rW   r   rM   r  r  nkeyrL   s	            r9   gen_clauseszResolve.gen_clauses  so   273E3EFG;;,,. 
	8KD%8=>T%%d+>E>! $		(#$ 		$**9T?;<A IIallEQUU1XJ$67
	8 JJ%%' 	FD55))$/0Dood+ Fww))$/IIaddD$*=*=a*DEF	F E"II=q?Q?Q?S / ?s   F1c                    |D cg c]  }| j                  ||      f }}t        j                  t              r$t        j	                  d|j                                |S c c}w )Nz9generate_spec_constraints returning with clause count: %d)r  r>   r  r   r?   r  )r~   r  r   rL   r   s        r9   generate_spec_constraintsz!Resolve.generate_spec_constraints+  s[    :?@B4&&q"-/@@E"IIK""$  As   A c           	        | j                   j                         D ci c]  }| j                  |t        |            d! }}t        j                  t              r$t        j                  d|j                                |S c c}w )Nr\   r
   z6generate_feature_count returning with clause count: %d)	rr   r   r  r%   r>   r  r   r?   r  )r~   r  rW   r   s       r9   generate_feature_countzResolve.generate_feature_count4  s|     **,
 9D#ABAE
 
 E"IIH""$ 
s   $Bc                    |D ci c];  }|j                   s|j                  |j                         s,d|j                   z   d= c}S c c}w Nr  r
   )r   r  r~   r  r   rL   s       r9   generate_update_countzResolve.generate_update_count@  sA    ).
#%"))BII@VC"))OQ
 	
 
s   AAAc           	         i }| j                   j                         D ]  \  }}|D ci c]'  }| j                  |      t        |j                        ) }}t        j
                  |j                          j                  | j                        }|D ]t  }| j                  |t        |            }	|j                         D ]C  \  }
}||vs| j                  |
|      }|j                  |j                  |
|	      |       d||<   E v  |S c c}w )Nr\   r
   )rq   r{   r  r2   r   r   rB   r:  rr   r  r%   r  r  r1   )r~   r  eqrW   r   rM   
prec_featsactive_featsr  clause_id_for_featureprec_sat_namer   feature_metric_ids                r9   generate_feature_metriczResolve.generate_feature_metricE  s     ;;,,. 	2KD%QVW$**40#dmm2DDWJW99j&7&7&9:GGVL$ 2(,(;(;y5)% 0:/?/?/A 	2+M88+,0,E,E)4-) 

EE-1FG- 12,-	2	2	2" 	! Xs   ,Dc                h    |D ci c]"  }d| j                  ||j                        z   d$ c}S c c}w r  )r  rW   r  s       r9   generate_removal_countzResolve.generate_removal_count_  s1    CHIRd))!RWW55q8IIIs   '/c                |    |D ci c],  }|j                   s| j                  ||j                        d. c}S c c}w Nr
   )r   r  rW   r  s       r9   generate_install_countzResolve.generate_install_countb  s2    =BRrbkk##Arww/2RRRs   99c                N    |D ci c]  }| j                  ||      d c}S c c}w r  )r  )r~   r  missingr  s       r9   generate_package_countzResolve.generate_package_counte  s(    8?@"##Ar*A-@@@s   "c                   i }i }i }i }i }i }	|D ])  }
t        |
      }
|	j                  |
j                  g        + |	j                         D ]/  \  }}| j                  j                  |g       D cg c]  }| j                  |      |f }}d }|D ]  \  }|rt        fd|D              r|dx}x}x}x}}n|d   |d   k7  s|d   |d   k7  rdz  }dx}x}x}}n[|d   |d   k7  rdz  }dx}x}}nD|d   |d   k7  r
dz  }dx}}n/|d   |d   k7  rdz  }d}n| j                  s|d   |d   k7  rdz  }| j                        }s|r|||<   s|r|||<   s|r|||<   s|r|||<   s|r|||<   |} 2 |||||fS c c}w )Nc              3  (   K   | ]	  }|k(    y wrU   r   )r_   r=  rM   s     r9   r`   z3Resolve.generate_version_metrics.<locals>.<genexpr>  s     ">419">   r   r
   r  rG         )
r%   rs  rW   r{   rq   r   r}   r   rl   r  )r~   r  r   include0eqceqveqbeqaeqtsdictr/  rW   targetsr  pkgspkeyr}   icivibitiar   rM   s                          @r9   generate_version_metricsz Resolve.generate_version_metricsh  s*     	)A!AQVVR(	) #[[] )	#MD'6:kkoodB6OPT%%a(!,PDPD &* ##!Ts">g">><-..B..b.2!WA.$q'[^2K!GB())B))b2!WA.!GB#$$B$b!WA.!GBKB!WA.!GBB77DG{ST~<U!GB $ 0 0 6)+C&)+C&)+C&)+C&)+C&"G##)	#V Cc3&&U Qs   1Fc                   t        |t              sJ i }|j                         D ]@  \  }}|| j                  v s| j	                  |      D ch c]  }|j
                   c}||<   B t        rvd|v rr|j                         D ]_  \  }}| j                  j                        }t        |d      s.|j                  t        j                  k(  sL||   j                  d       a t        |      }|j                         }|D 	cg c]  }	|	|v s|j                  |	       }
}	|
j!                  |j#                                |
S c c}w c c}	w )Ncondar  )r   dictr{   re   r   rW   r   r   rx   r  r"   r   r   r   r  r  r   rB   )r~   	must_havedigraphrN  rM   rL   distrecordsorted_keysrc   r   s              r9   dependency_sortzResolve.dependency_sort  s.    )T***"+//"3 	RL$tzz!;???4;P(QR(Q%	R  g(&/oo&7 7"d-68,*BSBS1SL)--g67
 w'NN$	 1<Psi?O)--$PPi&&()7 )R0 Qs   E	EEc           
        t         j                  d       |sd g fS i }g }|D ]V  }||| j                  |      <   |j                  t	        |j
                   d|j                   d|j                                X t        |D ci c]  }|| c}d| j                        }|j                         }|j                  ||      }|j                  |      }t        |      S c c}w )N1Checking if the current environment is consistentr0  Trf   )r>   r?   r  rp   r%   rW   r   r  rR   rf   r  r  r3   bool)	r~   	installedsat_name_mapr   rM   r2r  constraintsr8   s	            r9   environment_is_consistentz!Resolve.environment_is_consistent  s    		EF8O 	PD37L))$/0LLdii[$,,q#MNO	P Y7TdDj7VNN221e<55%H~	 8s   
C c                  	 |syt        |      t        |      z  }| j                  |      }d	fd	}|r2t        |d| j                        		j	                          ||d      }nd }|rd}|S t
        j                  rKt        | j                  d| j                        		j	                         t        t        |||            }|S d }|S )Nr   c                L    j                  |       }j                  ||      S rU   r  r3   r   add_ifr0  r  r/  s      r9   mysatz,Resolve.get_conflicting_specs.<locals>.mysat  &    66q%@K55f--r;   Tr+  )r3   r  F)
r2   rY  rR   rf   r  r   r  re   r   r   )
r~   r   r  	all_specsreduced_indexr7  r8   final_unsat_specsr  r/  s
           @@r9   get_conflicting_specszResolve.get_conflicting_specs  s    J^!44	..y9	. t}}EB AY-HH " !  ((TDMMBB A %,u^! !  !%  r;   c           
         t         j                  d       |sd g fS i g }|D ]V  }| j                  |      <   |j                  t	        |j
                   d|j                   d|j                                X j                         D ci c]  }|| }}|D ci c]  }|j
                  | }}d|v r@d|vr<||d      }d|j                  v r&|j                  D 	cg c]
  }	|	dk7  s	|	 }
}	|
|_	        t        |d j                        }|j                         |j                  |      }j                  |      }d x}}|r|r fdt               }|j!                  |      }j#                  |j                               \  }}|j%                  fdfd	|D        D               |D ]  } t	        |      j
                  |         t'        |      t'              k  rP|}j)                         D cg c]  \  }}|d
   |vr| }}}t         j                  ddj+                  |             |rt         j                  d|       ||fS c c}w c c}w c c}	w c c}}w )Nr*  r0  r   pipTr+  c                    | |vr\|j                  |        j                  j                  | g       D ]+  }j                  |      D ]  } |j                  |        - y y rU   )r   rq   r   r   rW   )rW   r  fnrL   get_r~   s       r9   rB  z#Resolve.bad_installed.<locals>.get_  s`    v%JJt$"kkoodB7 2"&//""5 2B &122 &r;   c              3  J   K   | ]  }|r|d    dk7  rd|vr
|   d     yw)r   r  r  rW   Nr   )r_   r  r.  s     r9   r`   z(Resolve.bad_installed.<locals>.<genexpr>'  s8      s 2s(7J X&v.s    #c              3  @   K   | ]  }j                  |        y wrU   
from_indexr_   r/  r  s     r9   r`   z(Resolve.bad_installed.<locals>.<genexpr>)  s      CQa Cr  rW   z-Limiting solver to the following packages: %s, zPackages to be preserved: %s)r>   r?   r  rp   r%   rW   r   r  rB   rJ   rR   rf   r  r  r3   r2   r  minimizer   r   r{   r9  )r~   r-  r  r   rM   	new_indexr  name_mappython_precr  new_depsr/  r0  r8   limitxtrar  eq_optional_cr   r   r  rg  r  rB  r.  s   `                     @@@r9   bad_installedzResolve.bad_installed  sr   		EF8O 	PD37L))$/0LLdii[$,,q#MNO	P -9,?,?,ABDT4ZB	B'01!AFFAI11xE$9#HX$67K+++'2':':I!a5jAII&.#Yt}}=NN221e<55%42 UF55a?M**]AEEG<KHaMM  C( C  " 3Yt_))6236{S.. *6););)=%#6{&0  
 		CTYYuEU II4d;d{a C1
 J@s   
I!I!#
I&.I&I+c                    |r6|D ci c]  }|j                   | c}|j                  fd|D               y y c c}w )Nc              3  @   K   | ]  }|j                   vs|  y wrU   rV   )r_   r  r  s     r9   r`   z&Resolve.restore_bad.<locals>.<genexpr>@  s     CaqvvU/BCs   )rW   r   )r~   r  preserverM   r  s       @r9   restore_badzResolve.restore_bad=  s8    156TYY_6EKKC8CC 6s   ;c                   t        t        t        |            }|D ch c]  }|j                   }}t        j                  d       | j                  ||      \  }}|D ]  }|| j                  vr|j                  |j                  |j                  }}
}	|j                  j                  }|	|v s||	|vrW|rt        |	|j                               }nt        |	|
||      }|j                  d|        t        |      |fS c c}w )Nz*Checking satisfiability of current install)rW   r   )rW   r   r  r   r   )rn   mapr%   rW   r>   r?   rQ  re   r   r  r   canonical_namerc  r  r   )r~   r   r-  update_depsr/  r  rN  rT  rM   rW   r   r  schannelr   s                 r9   install_specszResolve.install_specsB  s    SE*+"'(Q!&&((		>?,,Y>x 	"D4::%#'99dllDJJ5'D||22Hv~!2t57H  d4==?C weX LLD!#	"$ U|X%%+ )s   Dc                    | j                  ||xs g |      \  }}g }|r| j                  ||d      }| j                  ||       |S )NF)	returnall_remove)r[  solverU  )r~   r   r-  rY  r]  rT  r  s          r9   installzResolve.install[  sO    ,,UIO[Qx::ey%:HDx(r;   c           
     &   g }t        t        |      D ]L  }|j                         r|j                  t        |dd             1|j                  t        |d             N |D ch c]  }|j                  s|j                   }}| j                  ||      \  }}g }|D ]f  }	|	j                  |	j                  }}
|
|v r ||j                  |	       4|j                  t        |
|rd|z   nd d|	j                                      h ||fS c c}w )Nr  T)r   r   rj  z>=)rW   r   r   r   )rW  r%   r  rp   rW   rQ  r   rc  )r~   r   r-  nspecsr/  r  rN  r   rT  rM   r  vers               r9   remove_specszResolve.remove_specsc  s
    Y& 	;A ||~i3FGiD9:	; #)3QAFF!&&33%%i8q 	DiiBV|"% .1s
t!%#}}		  x' 4s   &D8Dc                z    | j                  ||      \  }}| j                  |d      }| j                  ||       |S )NT)r^  )rd  r_  rU  )r~   r   r-  rT  r  s        r9   removezResolve.remove  s?    ++E9=xzz%z.x(r;   c           	     T  <=>? |r%t        |d   t              st        d |D              }t        |      }t        j                  t              r1t        d t        |      D              }t        j                  d|       |syt        j                  d       t        |      }| j                  |t        j                         }	|	st               }
t               }|D ]O  }| j                  |      r|j                  | j                   v r|j#                  |       ?|
j#                  |       Q |
rt%        |
      |rt'        |D cg c]  }|g c}d	      |rt'        i       | j)                  |||       t        j                  d
       d<<?fd	}<fd=<=fd}t+        |	d| j,                        ??j/                         < ||d      }|s |rt'        i       | j)                  |||       g }g }g }t        ?j                         }t        |      D ]  \  }}|j                  |v r|j1                  |j                         |j2                  s%|j4                  s||k\  r|n|j7                  |       `t9        ?j                  |            s{t        |j                  d|j4                        }|j7                  |       |j7                  |        |j;                  d |D               t        j                  t              rt        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                           t        j                  d       |r=?j?                  <|      }<jA                  ||      \  }}t        j                  d|       t        j                  d       ?jC                  <|      \  }}}}}<jA                  ||      \  }}<jA                  ||      \  }}t        j                  d||       t        j                  d       ?jE                  <      }<jA                  ||      \  }} t        j                  d|        ?jG                  <      }!<jA                  |!|      \  }}"t        j                  d |"       t        j                  d!       <jA                  ||      \  }}#t        j                  d"|#       t        j                  d#       <jA                  ||      \  }}$t        j                  d$|$       |sRt        j                  d%       ?jI                  <|      }%<jA                  |%|      \  }}&t        j                  d&|&       t        j                  d'       ?jK                  <|      }'<jA                  |'|      \  }}(t        j                  d(|(       t        j                  d)       ?jC                  <|      \  })}*}+},}-<jA                  |)|      \  }}.<jA                  |*|      \  }}/<jA                  |+|      \  }}0<jA                  |,|      \  }}1t        j                  d*|.|/|0|1       t        j                  d+       ?jM                  <|      })<jA                  |)|d,      \  }}t        j                  d-|        ||      s<|-jO                  |       <jA                  |-|      \  }}2t        j                  d.|2       t        j                  d/       d0}3g }4 =|      }5|4j7                  |5       	 t        <fd1|5D              }6<jQ                  |6fd      }|n:|3d0z  }3|3d2kD  rt        j                  d3       n =|      }5|4j7                  |5       d|3d0kD  rtS        tU        t        |4            }7t        jV                  |7 }8|7D 9cg c]  }9t=        t        |9      |8z
         }:}9t        jX                  sDtZ        j]                  d4j_                  |3d2kD  rd5n|3t        d6 |:D              |3d2kD  rd7nd8             | j`                  jc                         D ;ci c]  };| je                  |;      |; c};>|rt        |4      d0kD  r
tg               t=        >fd9|4d   D        d: ;      S c c}w c c}9w c c};w )=Nr   c              3  2   K   | ]  }t        |        y wrU   r$   r   s     r9   r`   z Resolve.solve.<locals>.<genexpr>  s     61)A,6ra  c              3  n   K   | ]-  \  }}t        d |||j                  |j                  fz         / yw)z%i: %s target=%s optional=%sN)r   r   r   )r_   r&  r/  s      r9   r`   z Resolve.solve.<locals>.<genexpr>  s8      Aq 2aAHHajj5QQRs   35zSolving for: %sr   z2Solve: Getting reduced index of compliant packages)r  F)r@  z!Solve: determining satisfiabilityc                L    j                  |       }j                  ||      S rU   r4  r5  s      r9   r7  zResolve.solve.<locals>.mysat  r8  r;   c                \    fd| D        D cg c]  }|r|d   dk7  rd|vr| c}S c c}w )Nc              3  @   K   | ]  }j                  |        y wrU   rE  rG  s     r9   r`   z/Resolve.solve.<locals>.clean.<locals>.<genexpr>  s     7a!,,q/7r  r   r  r  r   )solqr  s     r9   cleanzResolve.solve.<locals>.clean  s=     8371A   s   )c                h     |       }t        fd|D              }j                  |fd      yy)ay  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  ^   K   | ]$  }j                  j                  |             & y wrU   r  r  r_   rn  r  s     r9   r`   z6Resolve.solve.<locals>.is_converged.<locals>.<genexpr>  "     EaAEE!++a.1Er   F)	includeIfT)r   r3   )r8   	psolutionnclauser  ro  s      r9   is_convergedz#Resolve.solve.<locals>.is_converged  s9     hIE9EEGuugZ5u19r;   Tr+  )r   r   c              3  2   K   | ]  }t        |        y wrU   r$   r`  s     r9   r`   z Resolve.solve.<locals>.<genexpr>  s     1aYq\1ra  zRequested specs: %sc              3  2   K   | ]  }t        |        y wrU   r_  r`  s     r9   r`   z Resolve.solve.<locals>.<genexpr>       <SSV<Sra  zOptional specs: %sc              3  2   K   | ]  }t        |        y wrU   r_  r`  s     r9   r`   z Resolve.solve.<locals>.<genexpr>  s     ;RqCF;Rra  zAll other specs: %sc              3  2   K   | ]  }t        |        y wrU   r_  r`  s     r9   r`   z Resolve.solve.<locals>.<genexpr>  r{  ra  zmissing specs: %sc              3  2   K   | ]  }t        |        y wrU   r_  r`  s     r9   r`   z Resolve.solve.<locals>.<genexpr>  s     :Qa3q6:Qra  z Solve: minimize removed packageszPackage removal metric: %dz.Solve: maximize versions of requested packagesz-Initial package channel/version metric: %d/%dz#Solve: minimize track_feature countzTrack feature count: %dzPackage misfeature count: %dz3Solve: maximize build numbers of requested packagesz Initial package build metric: %dz5Solve: prefer arch over noarch for requested packageszNoarch metric: %dz0Solve: minimize number of optional installationsz#Optional package install metric: %dz,Solve: minimize number of necessary upgradeszDependency update count: %dzhSolve: maximize versions and builds of indirect dependencies.  Prefer arch over noarch where equivalent.zDAdditional package channel/version/build/noarch metrics: %d/%d/%d/%dz!Solve: prune unnecessary packages)trymaxzWeak dependency count: %dzTimestamp metric: %dzLooking for alternate solutionsr
   c              3  ^   K   | ]$  }j                  j                  |             & y wrU   rr  rs  s     r9   r`   z Resolve.solve.<locals>.<genexpr>]  rt  r   
   zToo many solutions; terminatingzP
Warning: {} possible package resolutions (only showing differing packages):{}{}z>10c              3  >   K   | ]  }d j                  |        yw)rH  N)r9  )r_   diffs     r9   r`   z Resolve.solve.<locals>.<genexpr>q  s      CT4 Cs   z
  ... and othersr  c              3  (   K   | ]	  }|     y wrU   r   )r_   r  rJ  s     r9   r`   z Resolve.solve.<locals>.<genexpr>  s     ?XYx ?r  c                    | j                   S rU   rV   rX   s    r9   rZ   zResolve.solve.<locals>.<lambda>  s
    qvv r;   rr  r9  )4r   r%   r   r2   r>   r  r   r   r  r?   r   rY  r   r  rI   rW   rq   r   r   r   r  rR   rf   r  rf  r   r   rp   r   r   r|   r  rI  r  r  r  r  r  r
  r   r3   rn   rW  r:  r  	stdoutloginfor8  re   rB   r  r5   )@r~   r   r]  r^  r   r   should_retry_solvedlistlen0r;  not_found_packageswrong_version_packagesr/  r  r7  rx  r8   specospecrspecaspecmr   rP  obj7eq_req_ceq_req_veq_req_beq_req_aeq_req_tobj3aobj3eq_feature_countobj1eq_feature_metricobj2obj4
noarch_objeq_optional_installobj49eq_uobj50eq_ceq_veq_beq_aeq_tobj5aobj5obj6obj6aobj6tnsol
psolutionsrv  rw  psols2commonrm  diffsrM   r  ro  rJ  r/  s@                                                               @@@@r9   r_  zResolve.solve  s    E!Hi8666EE
E" %e, E II'/ 			FG5z..(C(C$C / 
  "%%(U" 2((+vv,.2215*..q12 ",-?@@'("89QaS9%  " ),,##E<G 			56	.
		 ]D4==ANN%!(,,##E<GBIIe$ 	 DAqvvQVV$::((a4iUBB1ER__Q'(afftAHHEQQ	  	1511E"II+Xf<SU<S6S-TUII*HV;RE;R5R,STII+Xf<SU<S6S-TUII)8F:Q5:Q4Q+RS 			4555a?MZZx@NHdII2D9 			BC;=;V;Vu<
8(Hh **Xx8%Hh7$		A5$O 			7844Q7$4h?$		+T2 66q9$5x@$		0$7 			GHHh7$		4d; 			IJ zz(H=*		%z2 IIHI"$";";Au"Ejj)<hGOHeII;UC 			@A''51**T84%		/7 			8	
 (*'B'B1e'L$dD$**T84%D(3$D(3$**T84%		R	
 			56((E2D(4@$		-t4H%KK!jjx8OHeII,e4		34
(O	)$E9EEGuugZ.HAIDby		;<hIi(  !8#c:./F%%v.F:@A3VCHv-.AEA<<==CV!%  CU CC04r	,r> ?Cjj>O>O>QRdT%%d+T1R	:""n$ ?A?EU
 	
S :` B Ss   
d;d d%)Fr   )NN)T)r
   )TF)r   r%   returnztuple[PackageRecord])rM   r&   r  zlist[MatchSpec]rU   r9  )r#  zdict[str, PackageRecord]r  list[PackageRecord])NTF)FFNNF)r   rn   r]  r,  r  r  )4__name__
__module____qualname__r   r   r   r   r   r   r   r   r  r  r   r(  r
  r  r   rV  r6  r   rY  rt  rI   r   r}   staticmethodrg   r  r  r  r  r  r  r  r  r  r  r  r
  r  r(  r1  r=  rQ  rU  r[  r`  rd  rf  r_  __classcell__)r   s   @r9   rR   rR   w   s   .R`

 (T&B&$P2:BHWK >?'R#.BH* ; ;	 x(GLn )n`1((  $3 ( ( - -(T x( )8


4JSAA'F$+$ 
$L !D9vD
&2" H x(   x
x
 x
 
x
 )x
r;   rR   )G__doc__
__future__r   r  r  collectionsr   r   	functoolsr   loggingr   r   r	   auxlib.decoratorsr   base.constantsr   r   r   base.contextr   common.compatr   	common.ior   r   common.iteratorsr   rm   common.logicr   r   r   r   r   r   common.toposortr   
exceptionsr   r   r   r   models.channelr    r!   models.enumsr"   r#   models.match_specr%   models.recordsr&   models.versionr'   r(   ImportError_vendor.frozendictr)   r  r>   r  UnsatisfiablePYCOSATPYCRYPTOSATPYSATr=   rE   rP   rR   r   r;   r9   <module>r     s  
 #   *  $  , R R ! ! . 8  &  2 1 ( ) (D% '(	 #/  ]!2; 4*9*A*A " "J"O
 O
Q  DCDs   D DD