B
    lz]                 @   s  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/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ee?Z@edZAe2ZBe1Z1e!ejCe)fejDe(fejEe*fgZFeejCfddZGd ddZHdd ZIG dd deJZKdS )!    )absolute_importdivisionprint_functionunicode_literals)defaultdictOrderedDictdequeN)DEBUG	getLogger   )
frozendict)memoizememoizemethod)concatgroupby)tqdm)ChannelPriorityMAX_CHANNEL_PRIORITYSatSolverChoice)context)	iteritemsiterkeys
itervaluesodicton_win	text_type)time_recorder)ClausesCryptoMiniSatSolverPycoSatSolverPySatSolverminimal_unsatisfiable_subset)toposort)CondaDependencyErrorInvalidSpecResolvePackageNotFoundUnsatisfiableError)ChannelMultiChannel)
NoarchTypePackageType)	MatchSpec)PackageRecord)VersionOrderzconda.stdoutlogc             C   s   t |  }y| d W n> tk
rV } z td|  tjd|dd W d d }~X Y nX td|  |S xft  D ]Z\}}y| d W n0 tk
r } ztd| | W d d }~X Y qrX td|  |S qrW td	d S )
Nr   z0Could not run SAT solver through interface '%s'.zSAT interface error due to: %sT)exc_infoz Using SAT solver interface '%s'.z7Attempted SAT interface '%s' but unavailable due to: %sz*Falling back to SAT solver interface '%s'.z@Cannot run solver. No functioning SAT implementations available.)_sat_solversrun	ExceptionlogZwarningdebugitemsr#   )Zsat_solver_choiceclseZsolver_choice r7   ,lib/python3.7/site-packages/conda/resolve.py_get_sat_solver_cls+   s"    "r9      c                s   d  fdd| D S )N c             3   s&   | ]}d d   d t | V  qdS )
 z- N)str).0x)indentr7   r8   	<genexpr>C   s    zdashlist.<locals>.<genexpr>)join)iterablerA   r7   )rA   r8   dashlistB   s    rE   c             C   sJ   |j dkr@| |}d}|rFx(|d jD ]}|t|j 7 }q(W n|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+   )Zresolve_objmsprecvaluedepr7   r7   r8   exactness_and_number_of_depsF   s    

rN   c                   s  e Zd Zd`ddZ fddZdadd	ZdbddZdcddZddddZdd Z	dd Z
dd ZdeddZdd Zdd ZdfddZdd  Zed!d" Zd#d$ Zee d%dgd&d'Zd(d) Zd*d+ Zd,d- Zdhd.d/Zed0d1 Zdid2d3Zed4d5 Zed6d7 Zd8d9 Zee d%d:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'djdJdKZ(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dkdVdWZ.dldXdYZ/dZd[ Z0d\d] Z1ee d%dmd^d_Z2  Z3S )nResolveFr7   c             C   s*  || _ || _|r| |ni | _tj| _tj| _t	dt
|}tt}xt|D ]l}dd || D }|rztd| |||< dd || D }x*|D ]"}	x|	jD ]}
||
 |	 qW qW qLW || _|| _i | _i | _i | _i | _i | _dd |D | _x.| j D ] \}}t|| jd	d
| j|< qW d S )Nnamec             S   s   g | ]}|j r|qS r7   )Zis_unmanageable)r?   rK   r7   r7   r8   
<listcomp>d   s    z$Resolve.__init__.<locals>.<listcomp>z(restricting to unmanageable packages: %sc             s   s   | ]}|j r|V  qd S )N)track_features)r?   rK   r7   r7   r8   rB   h   s    z#Resolve.__init__.<locals>.<genexpr>c             S   s&   h | ]}t |d r|jtjkr|qS )package_type)hasattrrS   r*   ZVIRTUAL_SYSTEM)r?   _r7   r7   r8   	<setcomp>u   s    z#Resolve.__init__.<locals>.<setcomp>T)keyreverse)indexchannels_make_channel_priorities_channel_priorities_mapr   channel_priority_channel_priorityZsolver_ignore_timestamps_solver_ignore_timestampsr   r   r   listr2   r3   rR   appendgroupstrackers_cached_find_matchesms_depends__reduced_index_cache_pool_cache_strict_channel_cache_system_precsr4   sortedversion_key)selfrY   Z	processedrZ   rb   rc   rP   Zunmanageable_precsZtf_precsrK   feature_namegroupr7   r7   r8   __init__X   s4    

zResolve.__init__c                s   t t|  tt| jA tt| jA t| jA t| j	A ttdd | j
 D A ttdd | j D A ttdd | j D A S )Nc             s   s   | ]\}}|t |fV  qd S )N)tuple)r?   kvr7   r7   r8   rB      s    z#Resolve.__hash__.<locals>.<genexpr>c             s   s   | ]\}}|t |fV  qd S )N)rp   )r?   rq   rr   r7   r7   r8   rB      s    c             s   s   | ]\}}|t |fV  qd S )N)rp   )r?   rq   rr   r7   r7   r8   rB      s    )superrO   __hash__hash	frozensetrZ   r   r\   r^   r_   rb   r4   rc   re   )rl   )	__class__r7   r8   rt      s    tzResolve.__hash__Nc                s`   ddl m  |d kri }n|  | fddt| jD  |r\| fdd|D  |S )Nr   )make_feature_recordc                s   i | ]}d  |qS )Fr7   )r?   fstr)rx   r7   r8   
<dictcomp>   s    z*Resolve.default_filter.<locals>.<dictcomp>c                s   i | ]}d  |qS )Tr7   )r?   ry   )rx   r7   r8   rz      s    )core.subdir_datarx   clearupdater   rc   )rl   featuresfilterr7   )rx   r8   default_filter   s    zResolve.default_filterTc                s:   fdd}fdd fd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                s   t | tr| S  | S )N)
isinstancer+   )spec)v_fkey_v_ms_r7   r8   v_   s    zResolve.valid.<locals>.v_c                s&    r
| j p$tfdd| D S )Nc             3   s   | ]} |V  qd S )Nr7   )r?   fkey)r   r7   r8   rB      s    z/Resolve.valid.<locals>.v_ms_.<locals>.<genexpr>)optionalanyrH   )rJ   )r   rl   r   r7   r8   r      s    
zResolve.valid.<locals>.v_ms_c                sl     | }|d krhd | < y| }W n  tk
rH   d } | < Y n X tfdd|D  } | < |S )NTFc             3   s   | ]} |V  qd S )Nr7   )r?   rJ   )r   r7   r8   rB      s    z1Resolve.valid.<locals>.v_fkey_.<locals>.<genexpr>)get
ms_dependsr$   all)rK   valrI   )r   rl   r   r7   r8   r      s    
zResolve.valid.<locals>.v_fkey_r7   )rl   spec_or_precr   r   r   resultr7   )r   r   rl   r   r   r8   valid   s
    zResolve.validc                s:   fdd}t fdd fdd||S )Nc                s   t | tr| S  | S d S )N)r   r+   )Z_spec_or_prec)is_valid_precis_valid_specr7   r8   is_valid   s    
z Resolve.valid2.<locals>.is_validc                s&   r
| j p$t fdd| D S )Nc             3   s   | ]} |V  qd S )Nr7   )r?   Z_prec)r   r7   r8   rB      s    z8Resolve.valid2.<locals>.is_valid_spec.<locals>.<genexpr>)r   r   rH   )_spec)r   r   rl   r7   r8   r      s    z%Resolve.valid2.<locals>.is_valid_specc                sv     | }|d krpd | < y tfdd| D }W n  tk
rZ   d } | < Y nX |rddnd } | < | S )NFc             3   s   | ]} |V  qd S )Nr7   )r?   rJ   )r   r7   r8   rB      s    z8Resolve.valid2.<locals>.is_valid_prec.<locals>.<genexpr>zinvalid dep specszinvalid depends specs)r   r   r   r$   )rK   r   Zhas_valid_deps)
filter_outr   rl   r7   r8   r      s    
 z%Resolve.valid2.<locals>.is_valid_prec)r   )rl   r   r   r   r   r7   )r   r   r   r   rl   r8   valid2   s    zResolve.valid2c                s    fd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   s   | j |krd S || j  | r,d S | }d}t }xN|D ]F}x@|D ]2}x, ||D ]}d}| f| V  qfW || qVW qFW |stdd |}x"| D ]}	| ft	|	 V  qW d S )NFTc             S   s   | j S )N)rP   )r@   r7   r7   r8   <lambda>       z9Resolve.invalid_chains.<locals>.chains_.<locals>.<lambda>)
rP   addr   rH   setr   r   valuesr+   union)
r   namesprecsfoundZconflict_depsrK   Zm2r@   Zconflict_groupsrn   )chains_r   r   rl   r7   r8   r      s$    


z'Resolve.invalid_chains.<locals>.chains_)r   )rl   r   r   r   r7   )r   r   r   rl   r8   invalid_chains   s    zResolve.invalid_chainsc                sp   g }g }t  }x0|D ](}|d}|r2|| q|| qW | fdd|D  |rdt|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.
        rR   c             3   s$   | ]}|j s |s|fV  qd S )N)r   rH   )r?   r   )rl   r7   r8   rB     s    z'Resolve.verify_specs.<locals>.<genexpr>)r   get_exact_valuer}   ra   extendr%   rp   )rl   specsZnon_tf_specsbad_depsfeature_namesrJ   Z_feature_namesr7   )rl   r8   verify_specs  s    

zResolve.verify_specsc          
      s>  t  t  t  t  d}t dd |p$g D }t dd |p:g D }x|D ]ʉ  d jdkrt dkrtdd |D std	d |D rd
d |D }|r|d }t | |t |  d @ s|d t d  d gtt|d df qJ d jdkrDdd | j	D }|r(|d j
nd}|d t |f qJ d |krd}	xF|D ]>}
|
j d jkr\|d t tt|
d df d}	q\W |	s|d t tt d d df qJt dkst fdd|D rJ|d t tt d d df qJW |d r:dd |d D |d< |S )N)pythonrequest_conflict_with_historydirectcudac             s   s   | ]}t |V  qd S )N)r+   )r?   rU   r7   r7   r8   rB      s    z-Resolve._classify_bad_deps.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r+   )r?   rU   r7   r7   r8   rB   !  s    r   r   c             s   s   | ]}|j d kV  qdS )r   N)rP   )r?   rU   r7   r7   r8   rB   %  s    c             s   s$   | ]}|d  j dkr|d  V  qdS )r   r   N)rP   )r?   rU   r7   r7   r8   rB   &  s    c             S   s"   g | ]}|d  j dkr|d  qS )r   r   )rP   )r?   rU   r7   r7   r8   rQ   '  s    z.Resolve._classify_bad_deps.<locals>.<listcomp>r   )target__cudac             S   s   g | ]}|j d kr|qS )r   )rP   )r?   rU   r7   r7   r8   rQ   /  s    znot availabler   Fr   Tr   c             3   s*   | ]"}t |d ko |d  d kV  qdS )r   r   N)len)r?   c)chainr7   r8   rB   =  s    c             S   s.   g | ]&}|d   ds&t|d d kr|qS )r   zpython r   )
startswithr   )r?   rU   r7   r7   r8   rQ   C  s    )r   rP   r   r   rH   r   rp   r>   r+   ri   version)rl   r   specs_to_addhistory_specsstrict_channel_priorityclassesZpython_first_specsZpython_specZcuda_versionmatchr   r7   )r   r8   _classify_bad_deps  sH    


($
zResolve._classify_bad_depsc                s4   |  |}|s|S | |j t fdd|D S )Nc             3   s   | ]}|j j kr|V  qd S )N)channelrP   )r?   f)sole_source_channel_namer7   r8   rB   L  s    z3Resolve.find_matches_with_strict.<locals>.<genexpr>)rH   _get_strict_channelrP   rp   )rl   rJ   r   matchesr7   )r   r8   find_matches_with_strictG  s
    
z Resolve.find_matches_with_strictc             C   sD   t jr$t jstd | |||}ni }t jtjk}t||dd S )Nzk
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.)strict)	r   Zunsatisfiable_hintsjsonprintbuild_conflict_mapr]   r   STRICTr&   )rl   r   r   r   r   r   r7   r7   r8   find_conflictsN  s    zResolve.find_conflictsc          	   C   s   g }t dd |}x| D ]\}}t|dkry@tdd |D d }|d dd }|| || W q tk
r   || Y qX q|| qW |S )Nc             S   s   | d j ot| S )Nr   )rP   r   )r@   r7   r7   r8   r   [  r   z/Resolve.group_and_merge_specs.<locals>.<lambda>r   c             s   s   | ]}|d  V  qdS )r   Nr7   )r?   Zchr7   r7   r8   rB   _  s    z0Resolve.group_and_merge_specs.<locals>.<genexpr>r   r   )r   r4   r   r+   r   ra   
ValueErrorr   )rl   bad_deps_for_specr   ZbdrU   rn   Zlast_merged_specZbad_depr7   r7   r8   group_and_merge_specsY  s    
zResolve.group_and_merge_specsc             C   s   g }| |g g }x|r|d}|d }||kr6q| | ||krL|S g }|j| krtdd ||jD nd}	|	dkrqx |	D ]}
|dd |
D  qW xB|D ]:}|j|jkr|j|jkrqt|}| | | | qW qW dS )z/Return shorted path from root_spec to spec_namer   r   c             S   s   g | ]
}|j qS r7   )rI   )r?   rU   r7   r7   r8   rQ   w  s    z8Resolve.breadth_first_search_by_spec.<locals>.<listcomp>Nc             S   s   g | ]}t |qS r7   )r+   )r?   dr7   r7   r8   rQ   |  s    )ra   poprP   keysr   r   r   r`   )rl   Z	root_specZtarget_specallowed_specsZqueueZvisitedpathZnodeZchildrenr   depsZadjnew_pathr7   r7   r8   breadth_first_search_by_speci  s.    

(


z$Resolve.breadth_first_search_by_specc                s"  t jtjk}t||pt B }t|dkrZtt|}t|dkrZt	|d }|
dd jD  fdd|D }g }tdd | D }|rtj| ng }	tt|	d	d
t jd}
x|	D ]ȉ |
d  |

  i }x$| D ]\}} |kr|||< qW t|dkr(qttj fdd| D  rLq| }xBt|dd
t jdD ]*| }g }x>| D ]2\}}|dd |D kr|dd |D  qW  fdd|D }|
 fdd| D  g }tt|dd
t jdt}xl|D ]d}|d| |
  |jjkrP|jjkrJ|gnd}n||}|r|| qW W dQ R X |rj|| qjW qW W dQ R X |sg }xZ|D ]R}tjfdd|D  }	tdd |	}	|fdd|	 D  qW ||||}|S )ah  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.
        r   r   c             S   s   h | ]}|  qS r7   )Zto_match_spec)r?   rU   r7   r7   r8   rV     s    z-Resolve.build_conflict_map.<locals>.<setcomp>c                s   i | ]}  |f|qS r7   )_get_package_pool)r?   rq   )rl   r7   r8   rz     s    z.Resolve.build_conflict_map.<locals>.<dictcomp>c             s   s   | ]}t | V  qd S )N)r   r   )r?   Zsdepr7   r7   r8   rB     s    z-Resolve.build_conflict_map.<locals>.<genexpr>zFinding conflictsF)ZtotaldescleavedisablezExamining {}c                s   g | ]}|  qS r7   r7   )r?   rr   )rM   r7   r8   rQ     s    z.Resolve.build_conflict_map.<locals>.<listcomp>z)Comparing specs that have this dependency)r   r   r   c             S   s   g | ]
}|j qS r7   )rP   )r?   rU   r7   r7   r8   rQ     s    c             S   s   g | ]
}|j qS r7   )rI   )r?   rr   r7   r7   r8   rQ     s    c                s&   h | ]}|D ]} |krt |qqS r7   )r+   )r?   pkgsp)rM   r7   r8   rV     s    c             3   s   | ]}|j  kr|V  qd S )N)rP   )r?   Zmsspec)rM   r7   r8   rB     s    zFinding conflict pathsz%Finding shortest conflict path for {}Nc                s    g | ]}t  j|pg qS r7   )r   re   r   )r?   rK   )rl   r7   r8   rQ     s    c             S   s   | j S )N)rP   )r@   r7   r7   r8   r     r   z,Resolve.build_conflict_map.<locals>.<lambda>c                s   g | ]} t |d  gqS )r   )r+   r   )r?   rU   )r   r7   r8   rQ     s    )r   r]   r   r   r   r   rH   nextiterr   r}   ri   rp   r   r   r   r   Zset_descriptionformatr4   boolintersectionr   r   rP   r   r   ra   r   r   r   )rl   r   r   r   r   r   Zsdepsr   Zdep_collectionsr   tZsdeps_with_deprq   rr   Z
spec_orderr   Zdep_versrW   r   Zdep_msr   Zt2Zconflicting_specr   r   r7   )rM   rl   r   r8   r     sv    
"



$

"
zResolve.build_conflict_mapc                s~   d }y j | }W nf tk
rx   | jkrttdd  j| D } fdd|D }t|d }||  } j |< Y nX |S )Nc             s   s   | ]}|j jV  qd S )N)r   rP   )r?   rK   r7   r7   r8   rB     s    z.Resolve._get_strict_channel.<locals>.<genexpr>c                s   i | ]}| j |d qS )r   )r\   r   )r?   Zcn)rl   r7   r8   rz     s    z/Resolve._get_strict_channel.<locals>.<dictcomp>r   )rh   KeyErrorrb   r   rj   )rl   package_namechannel_nameZall_channel_namesZby_cpZhighest_priorityr7   )rl   r8   r     s    
zResolve._get_strict_channelc             C   s   |sdS |j |d j k S )zHprevent introduction of matchspecs that broaden our selection of choicesFr   )rG   )rl   rJ   specs_by_namer7   r7   r8   _broader  s    zResolve._broaderc             C   sV   t |}|| jkr| j| }n4| |}tdd |}dd t|D }|| j|< |S )Nc             S   s   | j S )N)rP   )r@   r7   r7   r8   r     r   z+Resolve._get_package_pool.<locals>.<lambda>c             S   s   i | ]\}}t ||qS r7   )r   )r?   rq   rr   r7   r7   r8   rz     s    z-Resolve._get_package_pool.<locals>.<dictcomp>)rv   rg   get_reduced_indexr   r   )rl   r   ZpoolZgrouped_poolr7   r7   r8   r     s    


zResolve._get_package_pool)Zmodule_namec                s  ddl m tjtjk		t|f}|jkr8j| S t	t
r`tdttdd |D  |\}}dd t|D t d 
t  |rtt|fdd	d
d}t|}i x0|D ](}|jt t|B |j< qW  	
fddxZtdD ]N}  t|}d}x2|r`| }|
|g}|r0|| q0W qW dd fdd|D D t }	x*|D ]"}|	|jt |g |	|j< qW x|D ]}
tfdd|
D }	r|r|d jtfdd|D }dd |D  x`|D ]V}t }t|	}t |}xV|D ]N}||jt }||kr|r|j!|d j!kr|"d| |||j< q\W x|r|# }|$| xfdd|D D ]}%|sq	r|j|j&jkr||< t || }xL|D ]D}d|krl'|t||jt sl|$| n
|$| q4W qW qW q2W qW t(j|< S )Nr   )rx   zRetrieving packages for: %sc             s   s   | ]}t |V  qd S )N)r   )r?   sr7   r7   r8   rB     s    z,Resolve.get_reduced_index.<locals>.<genexpr>c             S   s   i | ]\}}|rd nd|qS )Fzfeature not enabledr7   )r?   rK   r   r7   r7   r8   rz   !  s   z-Resolve.get_reduced_index.<locals>.<dictcomp>c                s   t  | |  fS )N)rN   dist_str)r@   )rl   r7   r8   r   )  s    z+Resolve.get_reduced_index.<locals>.<lambda>T)rW   rX   c                s  t t| j}j|d}|rbrb| krb|}x |D ]}|jj|kr<d|< q<W  | d }}x|D ]}|dsp|d7 }	| |r|r|| krd |< qpt
 }x>|D ]0}|jstfdd|D s|| qW |r"d	d
dd |D  |< qpd|< |d7 }qpW ||k }	|	rXtd|||f  tdd | D rp|	S |dkr~d S |	s|kr| tdd fdd|D }
|
dd  xVt|
 dd dD ]>\}}t||kr؈t
|}|rd}	n|d krd S qW |	S )Nr7   z&removed due to strict channel priorityr   Fr   z"incompatible with required spec %sc             3   s   | ]}  |d s|V  qdS )FN)r   )r?   rec)r   r7   r8   rB   N  s    zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>zunsatisfiable dependencies %sr=   c             s   s   | ]}t |V  qd S )N)r>   )r?   r   r7   r7   r8   rB   S  s    z%s: pruned from %d -> %dc             s   s   | ]}|j V  qd S )N)r   )r?   rJ   r7   r7   r8   rB   \  s    c             S   s   | j S )N)rP   )r   r7   r7   r8   r   j  r   zAResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>c             3   s4   | ],}  |d s|D ]}|js|V  qqdS )FN)r   r   r   )r?   rK   Zdep_spec)r   rl   r7   r8   rB   k  s   *c             S   s   t dd | d D S )Nc             s   s   | ]}|j V  qd S )N)r   )r?   rU   r7   r7   r8   rB   r  s    zTResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>.<locals>.<genexpr>r   )r   )r@   r7   r7   r8   r   r  r   )rW   T)r   r   rP   rb   r   r   r   r   
setdefault	match_anyr   r   r   r   rH   rC   r2   r3   r   r   rj   r4   r   )Z_specsrP   rn   r   rK   ZnoldZnnewZunsatisfiable_dep_specsrJ   reducedZ
_dep_specsZ	deps_namer   res)cp_filter_appliedexplicit_spec_package_poolfilter_groupr   rl   snamesr   top_level_specr7   r8   r   3  sd    










z/Resolve.get_reduced_index.<locals>.filter_groupr:   Fc             S   s   i | ]
}||qS r7   r7   )r?   rK   r7   r7   r8   rz     s    c             3   s   | ]} |V  qd S )Nr7   )r?   ry   )rx   r7   r8   rB     s    c             3   s&   | ]}|kr | r|V  qd S )N)r   )r?   rK   )r   reduced_index2rl   r7   r8   rB     s    r   c             3   s   | ]}|j j kr|V  qd S )N)r   rP   )r?   rK   )strict_channel_namer7   r8   rB     s    c             s   s   | ]}||fV  qd S )Nr7   )r?   rK   r7   r7   r8   rB     s    c             3   s   | ]}| kr|V  qd S )Nr7   )r?   rU   )r   r7   r8   rB     s    rR   ))r{   rx   r   r]   r   r   rp   rf   r2   isEnabledForr	   r3   rE   rj   r   r   r   r   r`   r   rP   rH   ranger|   r   popleftra   r   r   r}   copydeepcopyr   rG   insertr   r   r   r   r   r   )rl   explicit_specsZsort_by_exactnessZ	cache_keyr~   r   rU   Zslistr   Zspecs_by_name_seedZexplicit_specZadd_these_precs2pkgZ
seen_specsr   Z	dep_specsrM   r   rJ   Zdep_pkg	new_specsZnew_msr7   )r   r   r   r   rx   r   rl   r   r   r   r   r8   r     s    



$O

"

"


	(	
zResolve.get_reduced_indexc                s   t  fdd|D S )Nc             3   s   | ]}|  V  qd S )N)r   )r?   rJ   )rK   r7   r8   rB     s    z$Resolve.match_any.<locals>.<genexpr>)r   )rl   ZmssrK   r7   )rK   r8   r     s    zResolve.match_anyc                s    j d }|d k	r|S d}|r8 j|d}n6drdd}t fdd|D }n
t j}tfdd|D }| j < |S )NrP   r7   rR   c             3   s   | ]} j |d V  qdS )r7   N)rc   r   )r?   rm   )rl   r7   r8   rB     s    z'Resolve.find_matches.<locals>.<genexpr>c             3   s   | ]}  |r|V  qd S )N)r   )r?   r   )r   r7   r8   rB     s    )rd   r   r   rb   r   r   rY   rp   )rl   r   r   Z	spec_nameZcandidate_precsr   r7   )rl   r   r8   rH     s    




zResolve.find_matchesc             C   sH   | j |}|d krDdd |jD }|dd |jD  || j |< |S )Nc             S   s   g | ]}t |qS r7   )r+   )r?   r   r7   r7   r8   rQ     s    z&Resolve.ms_depends.<locals>.<listcomp>c             s   s   | ]}t |d V  qdS ))rR   N)r+   )r?   featr7   r7   r8   rB     s    z%Resolve.ms_depends.<locals>.<genexpr>)re   r   Zcombined_dependsr   r~   )rl   rK   r   r7   r7   r8   r     s    
zResolve.ms_dependsc             C   s   |j }| j|jd}|tk r"dnd}t|dd}|dd}|d}t|jdk }	| jt	j
krz|| |||	g}
n||| ||	g}
| jr|
| n|
|dd|f |
S )	Nr   r   r   r;   build_numberbuildnoarchZ	timestamp)r   r\   r   rP   r   r-   intZsubdirr^   r   ZDISABLEDr_   ra   r   )rl   rK   Zvtyper   r]   r   Zversion_comparatorr   Zbuild_stringr   Zvkeyr7   r7   r8   rk     s    
zResolve.version_keyc             C   sZ   t  }xNttdd dd | D D D ]*\}}|j}||kr@q(t|td ||< q(W |S )Nc             s   s.   | ]&}t |tr d d |jD n|fV  qdS )c             s   s   | ]}t |V  qd S )N)r'   )r?   Zccr7   r7   r8   rB     s    z=Resolve._make_channel_priorities.<locals>.<genexpr>.<genexpr>N)r   r(   Z	_channels)r?   r   r7   r7   r8   rB     s   z3Resolve._make_channel_priorities.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r'   )r?   r   r7   r7   r8   rB     s    r   )r   	enumerater   rP   minr   )rZ   Zpriorities_mapZpriority_counterZchnr   r7   r7   r8   r[     s    z Resolve._make_channel_prioritiesc             C   s4   t |}| |}|s&|s&t|fgt|| jdS )N)rW   )r+   rH   r%   rj   rk   )rl   rJ   Zemptyokr   r7   r7   r8   get_pkgs  s
    
zResolve.get_pkgsc             C   s@   t | tr|  S t | tr6dt|  | jr0dnd S t d S )Nz@s@?r;   )r   r,   r   r+   r   r   NotImplementedError)r   r7   r7   r8   to_sat_name%  s
    

zResolve.to_sat_namec             C   s   d| |f S )Nz	@fm@%s@%sr7   )Zprec_dist_strr   r7   r7   r8   to_feature_metric_id/  s    zResolve.to_feature_metric_idc                s  t  }||}|d k	r(|S  }d}tdd dd dpTdD D }|rx j|g  }}	nF|rt|dkst	t
t|}
 j|
g  }}	n j  }}	d}|sԇfd	d
|D }	t|	t|kr"jrd}n0|s"|rt |dnt |}| ||}|d kr| fdd
|	D }jrr|rVt |dnt |}|d |  ||}||| |S )NrP   c             s   s   | ]}|r|V  qd S )Nr7   )r?   Z_tfr7   r7   r8   rB   =  s    z)Resolve.push_MatchSpec.<locals>.<genexpr>c             s   s   | ]}|  V  qd S )N)strip)r?   r   r7   r7   r8   rB   >  s    rR   r7   r   Fc                s   g | ]}  |r|qS r7   )r   )r?   r   )r   r7   r8   rQ   K  s    z*Resolve.push_MatchSpec.<locals>.<listcomp>T)rR   c                s   g | ]}  |qS r7   )r  )r?   rK   )rl   r7   r8   rQ   S  s    !)r+   r  	from_name
_is_singler   rv   rb   r   r   AssertionErrorr   r   rc   rY   r   r   push_MatchSpecra   ZAnyname_var)rl   Cr   sat_namemZsimplenmZtfZtgroupZlibsrq   Zms2Z	sat_namesr7   )rl   r   r8   r  3  sB    




zResolve.push_MatchSpecc       	   
      s   t ttjd}xnt jD ]`\}} fdd|D }x|D ]}|| q<W | t|}|	|j
|||g  qW xNt jD ]@}| |}x* |D ]}|	|j| || qW qW ttrtd|  |S )N)Zsat_solver_clsc                s   g | ]}  |qS r7   )r  )r?   rK   )rl   r7   r8   rQ   _  s    z'Resolve.gen_clauses.<locals>.<listcomp>z+gen_clauses returning with clause count: %d)r   r9   r   Z
sat_solverr   rb   Znew_varr  r+   ZRequireZ
ExactlyOneNotr   rY   r   ZOrr  r2   r   r	   r3   get_clause_count)	rl   r  rP   rn   r  r  rK   ZnkeyrJ   r7   )rl   r8   gen_clauses[  s    
 
zResolve.gen_clausesc                s2    fdd|D }t tr.t d   |S )Nc                s   g | ]}  |fqS r7   )r  )r?   rJ   )r  rl   r7   r8   rQ   u  s    z5Resolve.generate_spec_constraints.<locals>.<listcomp>z9generate_spec_constraints returning with clause count: %d)r2   r   r	   r3   r  )rl   r  r   r   r7   )r  rl   r8   generate_spec_constraintst  s    

z!Resolve.generate_spec_constraintsc                s8    fddt jD }ttr4td   |S )Nc          	      s    i | ]}d   t|dqS )r   )rR   )r  r+   )r?   rP   )r  rl   r7   r8   rz   }  s   z2Resolve.generate_feature_count.<locals>.<dictcomp>z6generate_feature_count returning with clause count: %d)r   rc   r2   r   r	   r3   r  )rl   r  r   r7   )r  rl   r8   generate_feature_count|  s    
zResolve.generate_feature_countc                s    fdd|D S )Nc                s*   i | ]"}|j r |j rd d|j  qS )r   r  )r   r  )r?   rJ   )r  r7   r8   rz     s    z1Resolve.generate_update_count.<locals>.<dictcomp>r7   )rl   r  r   r7   )r  r8   generate_update_count  s    zResolve.generate_update_countc          	      s   i }xt  jD ]\}} fdd|D }tj|   j}xd|D ]\} |t|d}xD|	 D ]8\}	}
||
krf 
|	|}|||	|| d||< qfW qFW qW |S )Nc                s   i | ]}t |j |qS r7   )r   r~   r  )r?   rK   )rl   r7   r8   rz     s    z3Resolve.generate_feature_metric.<locals>.<dictcomp>)rR   r   )r   rb   r   r   r   r   rc   r  r+   r4   r  r  ZAnd)rl   r  eqrP   rn   Z
prec_featsZactive_featsr   Zclause_id_for_featureprec_sat_namer~   Zfeature_metric_idr7   )rl   r8   generate_feature_metric  s    
zResolve.generate_feature_metricc                s    fdd|D S )Nc                s    i | ]}d d  |j qS )r   r  )r  rP   )r?   rJ   )r  rl   r7   r8   rz     s    z2Resolve.generate_removal_count.<locals>.<dictcomp>r7   )rl   r  r   r7   )r  rl   r8   generate_removal_count  s    zResolve.generate_removal_countc                s    fdd|D S )Nc                s"   i | ]}|j rd  |jqS )r   )r   r  rP   )r?   rJ   )r  rl   r7   r8   rz     s    z2Resolve.generate_install_count.<locals>.<dictcomp>r7   )rl   r  r   r7   )r  rl   r8   generate_install_count  s    zResolve.generate_install_countc                s    fdd|D S )Nc                s   i | ]}d   |qS )r   )r  )r?   r  )r  rl   r7   r8   rz     s    z2Resolve.generate_package_count.<locals>.<dictcomp>r7   )rl   r  Zmissingr7   )r  rl   r8   generate_package_count  s    zResolve.generate_package_countc                s  i }i }i }i }i }i }	x"|D ]}
t |
}
|	|
jg  qW xt|	D ]\}}fddj|g D }d }x|D ]|\} |rt fdd|D rqz|d krd } } } }}n|d |d ks|d |d kr|d7 }d } } }}n|d |d kr |d7 }d } }}nf|d |d krD|d7 }d }}nB|d	 |d	 krd|d7 }d}n"js|d
 |d
 kr|d7 } }|s|r|||< |s|r|||< |s|r|||< |s|r|||< |s|r|||< |}qzW qHW |||||fS )Nc                s   g | ]}  ||fqS r7   )rk   )r?   r   )rl   r7   r8   rQ     s    z4Resolve.generate_version_metrics.<locals>.<listcomp>c             3   s   | ]} |kV  qd S )Nr7   )r?   r   )rK   r7   r8   rB     s    z3Resolve.generate_version_metrics.<locals>.<genexpr>r   r   r:   rF         )	r+   r   rP   r   rb   r   r   r_   r  )rl   r  r   Zinclude0ZeqcZeqvZeqbZeqaZeqtsdictr   rP   Ztargetsr   Zpkeyrk   ZicZivZibitZiar  r7   )rK   rl   r8   generate_version_metrics  sX    
	 

z Resolve.generate_version_metricsc       	         s   t  tsti }x:t D ].\}}|| jkrtdd | |D ||< qW trd|krxDt D ]8\}}| j|}t	|drd|j
tjkrd|| d qdW t|}    fdd|D }|   |S )Nc             s   s   | ]}|j V  qd S )N)rP   )r?   rJ   r7   r7   r8   rB     s    z*Resolve.dependency_sort.<locals>.<genexpr>Zcondar   c                s   g | ]}| kr  |qS r7   )r   )r?   rW   )	must_haver7   r8   rQ     s    z+Resolve.dependency_sort.<locals>.<listcomp>)r   dictr
  r   rY   r   r   r   r   rT   r   r)   r   r   r"   r   r   r   )	rl   r"  Zdigraphr   rK   ZdistrecordZsorted_keysr   r7   )r"  r8   dependency_sort  s    
 zResolve.dependency_sortc       	      C   s   t d |sd g fS i }g }x8|D ]0}||| |< |td|j|j|jf  q$W tt	dd |D d| j
d}| }|||}||}t|S )Nz1Checking if the current environment is consistentz%s %s %sc             s   s   | ]}||fV  qd S )Nr7   )r?   rK   r7   r7   r8   rB     s    z4Resolve.environment_is_consistent.<locals>.<genexpr>T)rZ   )r2   r3   r  ra   r+   rP   r   r   rO   r   rZ   r  r  satr   )	rl   	installedsat_name_mapr   rK   r2r  constraintssolutionr7   r7   r8   environment_is_consistent
  s    

"
z!Resolve.environment_is_consistentc                s   |sdS t |t |B }| |}d fdd	}t|d| jd  ||d}d}|st| jd| jd  t|||d}t|S )	Nr7   Fc                s     | } ||S )N)r  r&  )r   add_ifr*  )r  r)  r7   r8   mysat!  s    z,Resolve.get_conflicting_specs.<locals>.mysatT)rZ   )r&  r   )F)r   r   rO   rZ   r  rY   r!   rp   )rl   r   r   Z	all_specsreduced_indexr.  r+  Zfinal_unsat_specsr7   )r  r)  r8   get_conflicting_specs  s    

zResolve.get_conflicting_specsc                s  t d |sd g fS i g }x8|D ]0}||< |td|j|j|jf  q$W dd tD }dd |D }d|krd|kr||d  }d|j	krdd	 |j	D }||_	t
|d
jd}	|	  |	 |}
 |
}d  }}|r|rfddt |	 |} |  \}}fdd fdd|D D  x|D ]}t|j qTW ttk r}fdd	tD }t dd| |rt d| ||fS )Nz1Checking if the current environment is consistentz%s %s %sc             S   s   i | ]
}||qS r7   r7   )r?   rK   r7   r7   r8   rz   ;  s    z)Resolve.bad_installed.<locals>.<dictcomp>c             S   s   i | ]}||j qS r7   )rP   )r?   r   r7   r7   r8   rz   <  s    r   pipc             S   s   g | ]}|d kr|qS )r1  r7   )r?   r   r7   r7   r8   rQ   A  s    z)Resolve.bad_installed.<locals>.<listcomp>T)rZ   c                sN   | |krJ| |  x6j| g D ]$}x|D ]} |j| q2W q"W d S )N)r   rb   r   r   rP   )rP   r   fnrJ   )get_rl   r7   r8   r3  I  s
    
z#Resolve.bad_installed.<locals>.get_c             3   s2   | ]*}|r|d  dkrd|kr | d V  qdS )r   r  @rP   Nr7   )r?   r  )r(  r7   r8   rB   U  s   z(Resolve.bad_installed.<locals>.<genexpr>c             3   s   | ]}  |V  qd S )N)
from_index)r?   r   )r  r7   r8   rB   V  s    c                s    g | ]\}}|d   kr|qS )rP   r7   )r?   r  r   )r   r7   r8   rQ   ]  s    z-Limiting solver to the following packages: %sz, zPackages to be preserved: %s)r2   r3   r  ra   r+   rP   r   r   r   rI   rO   rZ   r  r  r&  r   r  minimizer}   r   r   rC   )rl   r'  r   r   rK   	new_indexZname_mapZpython_precZnew_depsr)  r*  r+  limitZxtraeq_optional_crU   r   r7   )r  r3  r(  rl   r   r8   bad_installed2  sH    

"


	
zResolve.bad_installedc                s.   |r*dd |D  |  fdd|D  d S )Nc             S   s   i | ]}||j qS r7   )rP   )r?   rK   r7   r7   r8   rz   f  s    z'Resolve.restore_bad.<locals>.<dictcomp>c             3   s   | ]}|j  kr|V  qd S )N)rP   )r?   r   )r  r7   r8   rB   g  s    z&Resolve.restore_bad.<locals>.<genexpr>)r   )rl   r   preserver7   )r  r8   restore_badd  s    zResolve.restore_badc             C   s   t tt|}dd |D }td | ||\}}x|D ]z}|| jkrLq<|j|j|j	  }}	}
|j
j}||ks<|d k	r||krq<|rt|| d}nt||	|
|d}|d| q<W t||fS )Nc             S   s   h | ]
}|j qS r7   )rP   )r?   r   r7   r7   r8   rV   k  s    z(Resolve.install_specs.<locals>.<setcomp>z*Checking satisfiability of current install)rP   r   )rP   r   r   r   r   )r`   mapr+   r2   r3   r:  rY   rP   r   r   r   Zcanonical_namer   r   rp   )rl   r   r'  update_depsr   r8  r;  rK   rP   r   r   Zschannelr   r7   r7   r8   install_specsi  s"    



zResolve.install_specsc             C   s>   |  ||pg |\}}g }|r.| j||dd}| || |S )NF)	returnall_remove)r?  solver<  )rl   r   r'  r>  r@  r;  r   r7   r7   r8   install  s    zResolve.installc          	   C   s   g }xBt t|D ]4}| r2|t|ddd q|t|dd qW tdd |D }| ||\}}g }x`|D ]X}	|	j|	j }
}|
|krqtqt|d k	r||	 qt|t|
|rd| nd d|	 d qtW ||fS )	Nr4  T)r   r   )r   c             s   s   | ]}|j r|j V  qd S )N)rP   )r?   r   r7   r7   r8   rB     s    z'Resolve.remove_specs.<locals>.<genexpr>z>=)rP   r   r   r   )	r=  r+   r	  ra   r   r:  rP   r   r   )rl   r   r'  Znspecsr   r   r8  rU   r;  rK   r  Zverr7   r7   r8   remove_specs  s&    
zResolve.remove_specsc             C   s.   |  ||\}}| j|dd}| || |S )NT)rA  )rD  rB  r<  )rl   r   r'  r;  r   r7   r7   r8   remove  s    zResolve.removec       8         s  t tr,tdd t|D }t d| |rPt|d tsPtdd |D }t	|}|sbt S t d t
|}|}	|	st	 }
t	 }x8|D ]0}|s|jjkr|| q|
| qW |
rt|
n|rtdd |D d	d
|rti n||| t d dD fdd	} fdd fdd}t|	djd  ||d}|s|r|ti n||| g }g }g }t	j}xt|D ]\}}|j|kr||j |js|js||kr|n|| n6t|rt|jd|jd}|| || qW |dd |D  t trt dttdd |D  t dttdd |D  t dttdd |D  t dttdd |D  t d |r  |} ||\}}t d| t d   |\}}}}} ||\}} ||\}}t d!|| t d"   } ||\}}t d#| ! }  | |\}}!t d$|! t d%  ||\}}"t d&|" t d'  ||\}}#t d(|# |s(t d) " |}$ |$|\}}%t d*|% t d+ # |}& |&|\}}'t d,|' t d-  |\}(})}*}+}, |(|\}}- |)|\}}. |*|\}}/ |+|\}}0t d.|-|.|/|0 t d/ $ |}( j|(|dd0\}}t d1| ||s2|,%|  |,|\}}1t d2|1 t d3 d4}2g }3|}4|3|4 xft fd5d|4D }5 &|5fd}|d krP |2d47 }2|2d6krt d7 P |}4|3|4 qXW |2d4kr8t't(t	|3}6t	j)|6 fd8d|6D }7t*j+s8t,-d9|2d6krd:n|2td;d |7D |2d6kr.d<nd=f  fd>d?t.j/D |rjt
|3d4krjt0 tfd@d|3d D dAdB dCS )ENc             s   s*   | ]"\}}t d |||j|jf V  qdS )z%i: %s target=%s optional=%sN)r   r   r   )r?   ir   r7   r7   r8   rB     s   z Resolve.solve.<locals>.<genexpr>zSolving for: %sr   c             s   s   | ]}t |V  qd S )N)r+   )r?   rU   r7   r7   r8   rB     s    z2Solve: Getting reduced index of compliant packagesc             S   s   g | ]
}|gqS r7   r7   )r?   r   r7   r7   r8   rQ     s    z!Resolve.solve.<locals>.<listcomp>F)Zchainsz!Solve: determining satisfiabilityc                s     | } ||S )N)r  r&  )r   r-  r*  )r  r)  r7   r8   r.    s    zResolve.solve.<locals>.mysatc                s   dd  fdd| D D S )Nc             S   s(   g | ] }|r|d  dkrd|kr|qS )r   r  r4  r7   )r?   qr7   r7   r8   rQ     s    z0Resolve.solve.<locals>.clean.<locals>.<listcomp>c             3   s   | ]}  |V  qd S )N)r5  )r?   r   )r  r7   r8   rB     s    z/Resolve.solve.<locals>.clean.<locals>.<genexpr>r7   )sol)r  r7   r8   clean  s    zResolve.solve.<locals>.cleanc                s:   | }t  fdd|D } j|fdddkr6dS dS )az   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   | ]}   |V  qd S )N)r  r  )r?   rG  )r  r7   r8   rB     s    z6Resolve.solve.<locals>.is_converged.<locals>.<genexpr>F)Z	includeIfNT)rp   r&  )r+  	psolutionnclause)r  rI  r7   r8   is_converged  s
    z#Resolve.solve.<locals>.is_convergedT)rZ   )r   r   c             s   s   | ]}t |V  qd S )N)r+   )r?   r   r7   r7   r8   rB     s    zRequested specs: %sc             s   s   | ]}t |V  qd S )N)r   )r?   r   r7   r7   r8   rB     s    zOptional specs: %sc             s   s   | ]}t |V  qd S )N)r   )r?   r   r7   r7   r8   rB     s    zAll other specs: %sc             s   s   | ]}t |V  qd S )N)r   )r?   r   r7   r7   r8   rB     s    zmissing specs: %sc             s   s   | ]}t |V  qd S )N)r   )r?   r   r7   r7   r8   rB     s    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)ZtrymaxzWeak dependency count: %dzTimestamp metric: %dzLooking for alternate solutionsr   c             3   s   | ]}   |V  qd S )N)r  r  )r?   rG  )r  r7   r8   rB   g  s    
   zToo many solutions; terminatingc                s   g | ]}t t|  qS r7   )rj   r   )r?   rH  )commonr7   r8   rQ   u  s    zP
Warning: %s possible package resolutions (only showing differing packages):%s%sz>10c             s   s   | ]}d  |V  qdS )z, N)rC   )r?   Zdiffr7   r7   r8   rB   {  s    z
  ... and othersr;   c                s   i | ]}|  |qS r7   )r  )r?   rK   )rl   r7   r8   rz     s    z!Resolve.solve.<locals>.<dictcomp>c             3   s   | ]} | V  qd S )Nr7   )r?   r  )r7  r7   r8   rB     s    c             S   s   | j S )N)rP   )r@   r7   r7   r8   r     r   zResolve.solve.<locals>.<lambda>)rW   )F)1r2   r   r	   rE   r   r3   r   r+   rp   r   r   r   rH   rP   rb   r   r%   r&   r   rO   rZ   r  rE  r   r   ra   r   r   rj   r  r6  r!  r  r  r  r  r  r}   r&  r`   r=  r   r   r   	stdoutloginfor   rY   RuntimeError)8rl   r   r@  rA  r   r   Zshould_retry_solveZdlistZlen0r/  Znot_found_packagesZwrong_version_packagesr   r.  rL  r+  ZspecoZspecrZspecaZspecmrq   r9  Zobj7Zeq_req_cZeq_req_vZeq_req_bZeq_req_aZeq_req_tZobj3aZobj3Zeq_feature_countZobj1Zeq_feature_metricZobj2Zobj4Z
noarch_objZeq_optional_installZobj49Zeq_uZobj50Zeq_cZeq_vZeq_bZeq_aZeq_tZobj5aZobj5Zobj6Zobj6aZobj6tZnsolZ
psolutionsrJ  rK  Zpsols2Zdiffsr7   )r  rI  rN  r7  r)  rl   r8   rB    s   










"




	















zResolve.solve)Fr7   )NN)T)T)T)NN)NN)T)N)F)F)T)NTF)FFNNF)4__name__
__module____qualname__ro   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rH   r   rk   staticmethodr[   r  r  r  r  r  r  r  r  r  r  r  r  r!  r%  r,  r0  r:  r<  r?  rC  rD  rE  rB  __classcell__r7   r7   )rw   r8   rO   V   sb   
(

&

',

n L	


(
C$2

  rO   )r:   )LZ
__future__r   r   r   r   collectionsr   r   r   r   Zloggingr	   r
   Z_vendor.auxlib.collectionr   Z_vendor.auxlib.decoratorsr   r   Z_vendor.toolzr   r   Z_vendor.tqdmr   Zbase.constantsr   r   r   Zbase.contextr   Zcommon.compatr   r   r   r   r   r   Z	common.ior   Zcommon.logicr   r   r   r    r!   Zcommon.toposortr"   
exceptionsr#   r$   r%   r&   Zmodels.channelr'   r(   Zmodels.enumsr)   r*   Zmodels.match_specr+   Zmodels.recordsr,   Zmodels.versionr-   rR  r2   rO  ZUnsatisfiableZPYCOSATZPYCRYPTOSATZPYSATr/   r9   rE   rN   objectrO   r7   r7   r7   r8   <module>   s@    
