B
    '\	                 @   s^  d dl mZmZmZ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 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mZ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* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 e
e6Z7e
dZ8e*Z9e)Z)ee#Z#dddZ:G dd de;Z<dS )    )absolute_importdivisionprint_functionunicode_literals)defaultdictOrderedDict)DEBUG	getLogger   )
frozendict)memoizememoizemethod)concatgroupby)ChannelPriorityMAX_CHANNEL_PRIORITY)context)	iteritemsiterkeys
itervaluesodicton_win	text_type)time_recorder)Clausesget_sat_solver_clsminimal_unsatisfiable_subset)toposort)InvalidSpecResolvePackageNotFoundUnsatisfiableError)ChannelMultiChannel)
NoarchType)	MatchSpec)PackageRecord)VersionOrderzconda.stdoutlog   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)indent ,lib/python3.7/site-packages/conda/resolve.py	<genexpr>$   s    zdashlist.<locals>.<genexpr>)join)iterabler.   r/   )r.   r0   dashlist#   s    r4   c                   s  e Zd ZdVddZ fddZdWdd	ZdXddZdYddZdZddZd[ddZ	dd Z
dd Zdd Zedd Zee ddd Zdd Zd d! Zd"d# Zd\d$d%Zed&d' Zd]d(d)Zed*d+ Zed,d- Zd.d/ Zee dd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d^d@dAZ#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(d_dLdMZ)d`dNdOZ*dPdQ Z+dRdS Z,ee ddadTdUZ-  Z.S )bResolveFr/   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 | _x,| j D ]\}}t|| jdd| j|< qW d S )	Nnamec             S   s   g | ]}|j r|qS r/   )Zis_unmanageable)r,   precr/   r/   r0   
<listcomp>5   s    z$Resolve.__init__.<locals>.<listcomp>z(restricting to unmanageable packages: %sc             s   s   | ]}|j r|V  qd S )N)track_features)r,   r7   r/   r/   r0   r1   9   s    z#Resolve.__init__.<locals>.<genexpr>T)keyreverse)indexchannels_make_channel_priorities_channel_priorities_mapr   channel_priority_channel_priorityZsolver_ignore_timestamps_solver_ignore_timestampsr   r   r   listlogdebugr9   appendgroupstrackers_cached_find_matchesms_depends__reduced_index_cache_strict_channel_cacheitemssortedversion_key)selfr<   Z	processedr=   rG   rH   r6   Zunmanageable_precsZtf_precsr7   feature_namegroupr/   r/   r0   __init__)   s0    

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vr/   r/   r0   r1   S   s    z#Resolve.__hash__.<locals>.<genexpr>c             s   s   | ]\}}|t |fV  qd S )N)rT   )r,   rU   rV   r/   r/   r0   r1   T   s    c             s   s   | ]\}}|t |fV  qd S )N)rT   )r,   rU   rV   r/   r/   r0   r1   U   s    )superr5   __hash__hash	frozensetr=   r   r?   rA   rB   rG   rM   rH   rJ   )rP   )	__class__r/   r0   rX   M   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 )Fr/   )r,   fstr)r\   r/   r0   
<dictcomp>a   s    z*Resolve.default_filter.<locals>.<dictcomp>c                s   i | ]}d  |qS )Tr/   )r,   r]   )r\   r/   r0   r^   c   s    )core.subdir_datar\   clearupdater   rH   )rP   featuresfilterr/   )r\   r0   default_filterX   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_r/   r0   v_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 )Nr/   )r,   fkey)rg   r/   r0   r1   {   s    z/Resolve.valid.<locals>.v_ms_.<locals>.<genexpr>)optionalanyfind_matches)ms)rk   rP   rg   r/   r0   rh   y   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 )Nr/   )r,   rn   )rh   r/   r0   r1      s    z1Resolve.valid.<locals>.v_fkey_.<locals>.<genexpr>)get
ms_dependsr   all)r7   valdepends)rc   rP   rh   r/   r0   rg   }   s    
zResolve.valid.<locals>.v_fkey_r/   )rP   spec_or_precrc   rk   ri   resultr/   )rc   rk   rP   rg   rh   r0   validf   s
    zResolve.validc                s6   fdd}fdd fdd||S )Nc                s   t | tr| S  | S d S )N)re   r$   )Z_spec_or_prec)is_valid_precis_valid_specr/   r0   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 )Nr/   )r,   Z_prec)rw   r/   r0   r1      s    z8Resolve.valid2.<locals>.is_valid_spec.<locals>.<genexpr>)rk   rl   rm   )_spec)rw   rk   rP   r/   r0   rx      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 )Nr/   )r,   rn   )rx   r/   r0   r1      s    z8Resolve.valid2.<locals>.is_valid_prec.<locals>.<genexpr>zinvalid dep specszinvalid depends specs)ro   rq   rp   r   )r7   rr   Zhas_valid_deps)
filter_outrx   rP   r/   r0   rw      s    
 z%Resolve.valid2.<locals>.is_valid_precr/   )rP   rt   r{   rk   ry   r/   )r{   rw   rx   rk   rP   r0   valid2   s    zResolve.valid2c                s    fdd  |t  S )aE  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. Uses self.valid_ as a
        filter, both to prevent chains and to allow other routines to
        prune the list of valid packages with additional criteria.

        Args:
            spec: a package key or MatchSpec
            filter: a dictionary of (prec, valid) pairs to be used when
                testing for package validity.
            optional: if True (default), do not enforce optional specifications
                when considering validity. If False, enforce them.

        Returns:
            A generator of tuples, empty if the MatchSpec is valid.
        c             3   s   | j |krd S || j  | r,d S | }d}xD|D ]<}x6|D ](}x" ||D ]}d}| f| V  q`W qPW q@W |s| fV  d S )NFT)r6   addrv   rm   rp   )rf   namesprecsfoundr7   m2r-   )chains_rc   rk   rP   r/   r0   r      s    


z'Resolve.invalid_chains.<locals>.chains_)set)rP   rf   rc   rk   r/   )r   rc   rk   rP   r0   invalid_chains   s    zResolve.invalid_chainsc                s    fdd  |t  S )Nc             3   s   | j |krd S || j  | r,d S | }d}xD|D ]<}x6|D ](}x" ||D ]}d}| f| V  q`W qPW q@W |s| fV  d S )NFT)r6   r}   r|   rm   rp   )rf   r~   r   r   r7   r   r-   )r   r{   rk   rP   r/   r0   r      s    


z(Resolve.invalid_chains2.<locals>.chains_)r   )rP   rf   r{   rk   r/   )r   r{   rk   rP   r0   invalid_chains2   s    zResolve.invalid_chains2c             C   s   g }g }t  }x0|D ](}|d}|r2|| q|| qW | |}x"|D ]}|| ||  qPW |rzt|||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.
        r9   )	r   get_exact_valuera   rF   rd   extendr   copyr   )rP   specsZnon_tf_specsbad_depsfeature_namesrn   Z_feature_namesrc   r/   r/   r0   verify_specs   s    



zResolve.verify_specsc                sh  i x|D ]| i }g}xd|r| }| |jt }xB| |D ]4}||krJ|| |fdd| |D  qJW q"W q
W tjdd 	 D   fdd D  g }xt
D ]\}i }	xF| D ]:\}
}|
jkr|
 krx| |
  D ]}d|	|< q W qW t| |	d} fdd|D }|rL|| q|f qW t|d	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.
        c             3   s   | ]}|j  j kr|V  qd S )N)r6   )r,   Zms3)rn   r/   r0   r1     s    z)Resolve.find_conflicts.<locals>.<genexpr>c             s   s   | ]}t | V  qd S )N)r   keys)r,   sr/   r/   r0   r1   $  s    c                s*   i | ]" t j fd d D   qS )c             3   s   | ]}|  V  qd S )Nr/   )r,   rV   )rU   r/   r0   r1   %  s    z4Resolve.find_conflicts.<locals>.<dictcomp>.<genexpr>)r   intersectionvalues)r,   )sdeps)rU   r0   r^   %  s    z*Resolve.find_conflicts.<locals>.<dictcomp>Fc                s   g | ]}|d  j  kr|qS ))r6   )r,   Znd)commkeysr/   r0   r8   5  s    z*Resolve.find_conflicts.<locals>.<listcomp>N)
setdefaultpopr6   r   rm   r}   r   rp   r   r   r   rM   r   rF   r    )rP   r   recslistms2depsrj   r   Zsdeprc   ZmnrV   Zndepsr/   )r   rn   r   r0   find_conflicts   s4    

*zResolve.find_conflictsc                sp   y j | }W n\ tk
rj   t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)channelr6   )r,   r7   r/   r/   r0   r1   B  s    z.Resolve._get_strict_channel.<locals>.<genexpr>c                s   i | ]}| j |d qS )r
   )r?   ro   )r,   Zcn)rP   r/   r0   r^   C  s    z/Resolve._get_strict_channel.<locals>.<dictcomp>r   )rL   KeyErrorr   rG   rN   )rP   package_namechannel_nameZall_channel_namesZby_cpZhighest_priorityr/   )rP   r0   _get_strict_channel>  s    zResolve._get_strict_channelc             C   sX   |j |krdS ||j  }tdd |D r6d|kr6dS tdd |D rTd|krTdS dS )zHprevent introduction of matchspecs that broaden our selection of choicesFc             s   s   | ]}d |kV  qdS )versionNr/   )r,   _r/   r/   r0   r1   O  s    z#Resolve._broader.<locals>.<genexpr>r   Tc             s   s   | ]}d |kV  qdS )buildNr/   )r,   r   r/   r/   r0   r1   R  s    r   )r6   rl   )rP   rn   specs_by_nameZmatching_specsr/   r/   r0   _broaderH  s    

zResolve._broader)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   	fdd	xtd
D ]v}  t|}d}x:|r
| }|	|g}|r|| q|d krP qW |d krdd t|D P qW dd fdd|D D t|}x|D ]}	tfdd|	D }
r|
r|
d jtfdd|
D }
dd |
D  x@|
D ]6}t }i }t|}i }x2|D ]*}||jt }|| |||j< qW tdd |  D }x|r| }|| xfdd|D D ]}!|sqrr|j|j"jkrr||< t|| }x<|D ]4}d|kr#||s|| n
|| qW qrW q@W qW q^W tj|< S )Nr
   )r\   zRetrieving packages for: %sc             s   s   | ]}t |V  qd S )N)r   )r,   r   r/   r/   r0   r1   b  s    z,Resolve.get_reduced_index.<locals>.<genexpr>c             S   s   i | ]\}}|rd nd|qS )Fzfeature not enabledr/   )r,   r7   rr   r/   r/   r0   r^   e  s   z-Resolve.get_reduced_index.<locals>.<dictcomp>c                s  t t| j}j|d}r^| kr^|}x |D ]}|jj|kr8d|< q8W  | d }}x|D ]}|dsl|d7 }	| |sd |< qlt
fdd|D }|rd	d
dd |D  |< qld|< |d7 }qlW ||k }|rtd|||f  tdd | D r,|S |dkr:d S |sJ|krƈ| tdd fdd|D }	|	dd  xFt|	D ]:}
t|
|krt|
}|rd}n|d krd S qW |S )Nr/   z&removed due to strict channel priorityr   Fr
   z"incompatible with required spec %sc             3   s.   | ]&}t  fd d|D s|V  qdS )c             3   s   | ]}  |d  V  qdS )FN)ro   )r,   r   )r{   r/   r0   r1     s    zLResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>.<genexpr>N)rl   rm   )r,   rn   )r{   rP   r/   r0   r1     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   r/   r/   r0   r1     s    z%s: pruned from %d -> %dc             s   s   | ]}|j V  qd S )N)rk   )r,   rn   r/   r/   r0   r1     s    c             S   s   | j S )N)r6   )r   r/   r/   r0   <lambda>      zAResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>c             3   s4   | ],}  |d s|D ]}|js|V  qqdS )FN)ro   rp   rk   )r,   r7   Zdep_spec)r{   rP   r/   r0   r1     s   *T)nextiterr6   rG   ro   r   r   r}   r   	match_anyrT   rp   r2   rD   rE   rl   r   r   r   lenr   )Z_specsr6   rR   Zsole_source_channel_namer7   ZnoldZnnewZunsatisfiable_dep_specsreducedZ
_dep_specsr   res)cp_filter_appliedfilter_groupr{   rP   snamesstrict_channel_prioritytop_level_specr/   r0   r   l  sX    








z/Resolve.get_reduced_index.<locals>.filter_groupr'   Fc             S   s   i | ]\}}|rd nd|qS )Fzfeature not enabledr/   )r,   r7   rr   r/   r/   r0   r^     s   c             S   s   i | ]
}||qS r/   r/   )r,   r7   r/   r/   r0   r^     s    c             3   s   | ]} |V  qd S )Nr/   )r,   r]   )r\   r/   r0   r1     s    c             3   s&   | ]}|kr | r|V  qd S )N)r|   )r,   r7   )r{   reduced_index2rP   r/   r0   r1     s    r   c             3   s   | ]}|j j kr|V  qd S )N)r   r6   )r,   r7   )strict_channel_namer/   r0   r1     s    c             s   s   | ]}||fV  qd S )Nr/   )r,   r7   r/   r/   r0   r1     s    c             S   s   i | ]\}}t ||qS r/   )rZ   )r,   rU   rV   r/   r/   r0   r^     s    c             3   s   | ]}| kr|V  qd S )Nr/   )r,   r   )r   r/   r0   r1     s    r9   )$r_   r\   r   r@   r   ZSTRICTrZ   rK   rD   isEnabledForr   rE   r4   rN   r   r   rd   r   ranger`   rC   r   rF   rT   rm   r   r6   ra   rp   ro   r}   r   rM   r|   r   r   )rP   r   Z	cache_keyrb   r   r   r   r   Zexplicit_spec_listZexplicit_specZadd_these_precs2pkgZ
seen_specsr   Z	dep_specsZthis_pkg_constraintsZdeprn   Zdep_pkg	new_specsZnew_msr/   )
r   r   r{   r\   r   rP   r   r   r   r   r0   get_reduced_indexV  s    


J





	
(	
zResolve.get_reduced_indexc                s   t  fdd|D S )Nc             3   s   | ]}|  V  qd S )N)match)r,   rn   )r7   r/   r0   r1     s    z$Resolve.match_any.<locals>.<genexpr>)rl   )rP   Zmssr7   r/   )r7   r0   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 )Nr6   r/   r9   c             3   s   | ]} j |d V  qdS )r/   N)rH   ro   )r,   rQ   )rP   r/   r0   r1   ,  s    z'Resolve.find_matches.<locals>.<genexpr>c             3   s   | ]}  |r|V  qd S )N)r   )r,   p)rf   r/   r0   r1   1  s    )rI   ro   r   rG   r   r   r<   rT   )rP   rf   r   Z	spec_nameZcandidate_precsr   r/   )rP   rf   r0   rm      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 r/   )r$   )r,   dr/   r/   r0   r8   9  s    z&Resolve.ms_depends.<locals>.<listcomp>c             s   s   | ]}t |d V  qdS ))r9   N)r$   )r,   featr/   r/   r0   r1   :  s    z%Resolve.ms_depends.<locals>.<genexpr>)rJ   ro   Zcombined_dependsr   rb   )rP   r7   r   r/   r/   r0   rp   5  s    
zResolve.ms_dependsc       
      C   s   |j }| j|jd}|tk r"dnd}t|dd}|dd}|d}| jtjkrh|| ||g}	n||| |g}	| j	r|	
| n|	|dd|f |	S )Nr
   r   r   r(   build_numberr   Z	timestamp)r   r?   ro   r6   r   r&   rA   r   ZDISABLEDrB   rF   r   )
rP   r7   Zvtyper   r@   rv   Zversion_comparatorr   Zbuild_stringZvkeyr/   r/   r0   rO   >  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ccr/   r/   r0   r1   S  s    z=Resolve._make_channel_priorities.<locals>.<genexpr>.<genexpr>N)re   r"   Z	_channels)r,   cr/   r/   r0   r1   S  s   z3Resolve._make_channel_priorities.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r!   )r,   r   r/   r/   r0   r1   T  s    r
   )r   	enumerater   r6   minr   )r=   Zpriorities_mapZpriority_counterZchnr   r/   r/   r0   r>   O  s    z Resolve._make_channel_prioritiesc             C   s4   t |}| |}|s&|s&t|fgt|| jdS )N)r:   )r$   rm   r   rN   rO   )rP   rn   Zemptyokr   r/   r/   r0   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(   )re   r%   dist_strr$   r   rk   NotImplementedError)rr   r/   r/   r0   to_sat_named  s
    

zResolve.to_sat_namec             C   s   d| |f S )Nz	@fm@%s@%sr/   )Zprec_dist_strr   r/   r/   r0   to_feature_metric_idn  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 )Nr6   c             s   s   | ]}|r|V  qd S )Nr/   )r,   Z_tfr/   r/   r0   r1   |  s    z)Resolve.push_MatchSpec.<locals>.<genexpr>c             s   s   | ]}|  V  qd S )N)strip)r,   fr/   r/   r0   r1   }  s    r9   r/   r
   Fc                s   g | ]}  |r|qS r/   )r   )r,   rj   )rf   r/   r0   r8     s    z*Resolve.push_MatchSpec.<locals>.<listcomp>T)r9   c                s   g | ]}  |qS r/   )r   )r,   r7   )rP   r/   r0   r8     s    !)r$   r   	from_name
_is_singler   rZ   rG   ro   r   AssertionErrorr   r   rH   r<   r   rk   push_MatchSpecrF   ZAnyname_var)rP   Crf   sat_namemZsimplenmZtfZtgroupZlibsrU   r   Z	sat_namesr/   )rP   rf   r0   r   r  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 r/   )r   )r,   r7   )rP   r/   r0   r8     s    z'Resolve.gen_clauses.<locals>.<listcomp>z+gen_clauses returning with clause count: %d)r   r   r   Z
sat_solverr   rG   Znew_varr   r$   ZRequireZ
ExactlyOneNotr   r<   rp   ZOrr   rD   r   r   rE   get_clause_count)	rP   r   r6   rR   r   r   r7   Znkeyrn   r/   )rP   r0   gen_clauses  s    
 
zResolve.gen_clausesc                s2    fdd|D }t tr.t d   |S )Nc                s   g | ]}  |fqS r/   )r   )r,   rn   )r   rP   r/   r0   r8     s    z5Resolve.generate_spec_constraints.<locals>.<listcomp>z9generate_spec_constraints returning with clause count: %d)rD   r   r   rE   r   )rP   r   r   ru   r/   )r   rP   r0   generate_spec_constraints  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
   )r9   )r   r$   )r,   r6   )r   rP   r/   r0   r^     s   z2Resolve.generate_feature_count.<locals>.<dictcomp>z6generate_feature_count returning with clause count: %d)r   rH   rD   r   r   rE   r   )rP   r   ru   r/   )r   rP   r0   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   )targetr   )r,   rn   )r   r/   r0   r^     s    z1Resolve.generate_update_count.<locals>.<dictcomp>r/   )rP   r   r   r/   )r   r0   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 r/   )r   rb   r   )r,   r7   )rP   r/   r0   r^     s    z3Resolve.generate_feature_metric.<locals>.<dictcomp>)r9   r
   )r   rG   r   unionr   r   rH   r   r$   rM   r   r   ZAnd)rP   r   eqr6   rR   Z
prec_featsZactive_featsr   Zclause_id_for_featureprec_sat_namerb   Zfeature_metric_idr/   )rP   r0   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   r6   )r,   rn   )r   rP   r/   r0   r^     s    z2Resolve.generate_removal_count.<locals>.<dictcomp>r/   )rP   r   r   r/   )r   rP   r0   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
   )rk   r   r6   )r,   rn   )r   rP   r/   r0   r^     s    z2Resolve.generate_install_count.<locals>.<dictcomp>r/   )rP   r   r   r/   )r   rP   r0   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   rP   r/   r0   r^     s    z2Resolve.generate_package_count.<locals>.<dictcomp>r/   )rP   r   Zmissingr/   )r   rP   r0   generate_package_count  s    zResolve.generate_package_countc                s  i }i }i }i }i }x"|D ]}	t |	}	||	jg  qW x|t|D ]n\}
}fddj|
g D }d }xB|D ]8\} |rt fdd|D rqv|d krd } } }}n|d |d ks|d |d kr|d7 }d } }}nf|d |d kr|d7 }d }}nB|d |d kr0|d7 }d}n"jsR|d	 |d	 krR|d7 } }|sh|rp|||< |s||r|||< |s|r|||< |s|r|||< |}qvW qDW ||||fS )
Nc                s   g | ]}  ||fqS r/   )rO   )r,   r   )rP   r/   r0   r8     s    z4Resolve.generate_version_metrics.<locals>.<listcomp>c             3   s   | ]} |kV  qd S )Nr/   )r,   t)r7   r/   r0   r1     s    z3Resolve.generate_version_metrics.<locals>.<genexpr>r   r
   r'         )	r$   r   r6   r   rG   ro   rl   rB   r   )rP   r   r   Zinclude0ZeqcZeqvZeqbZeqtsdictr   r6   ZtargetspkgsZpkeyrO   ZicZivZibitr   r/   )r7   rP   r0   generate_version_metrics  sL    
	 

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)r6   )r,   rn   r/   r/   r0   r1   %  s    z*Resolve.dependency_sort.<locals>.<genexpr>Zcondanoarchc                s   g | ]}| kr  |qS r/   )r   )r,   r:   )	must_haver/   r0   r8   =  s    z+Resolve.dependency_sort.<locals>.<listcomp>)re   dictr   r   r<   r   rp   r   ro   hasattrr   r#   pythonr}   r   r   r   r   )	rP   r   Zdigraphr   r7   ZdistrecordZsorted_keysru   r/   )r   r0   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 )Nr/   )r,   r7   r/   r/   r0   r1   K  s    z4Resolve.environment_is_consistent.<locals>.<genexpr>T)r=   )rD   rE   r   rF   r$   r6   r   r   r5   r   r=   r   r   satbool)	rP   	installedsat_name_mapr   r7   r2r   constraintssolutionr/   r/   r0   environment_is_consistentB  s    

"
z!Resolve.environment_is_consistentc                s   |sdS |  |}d
 fdd	}t|d| jd  ||d}|rLdS tt||d}t|t| }t }xj|r|d}|| ||hB }	  ||	d}|stt|	|d}
t	|
d	krt|
|
 |t|8 }qtW t|S d S )Nr/   Fc                s     | } ||S )N)r   r   )r   add_ifr   )r   r   r/   r0   mysatW  s    z,Resolve.get_conflicting_specs.<locals>.mysatT)r=   )r   r   r
   )F)r   r5   r=   r   rC   r   r   r   r}   r   r   rT   )rP   r   reduced_indexr   r   Zunsat_specsZsatisfiable_specsZfinal_unsat_specsZ	this_specZ
test_specsZthese_unsatr/   )r   r   r0   get_conflicting_specsQ  s0    






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 r/   r/   )r,   r7   r/   r/   r0   r^   ~  s    z)Resolve.bad_installed.<locals>.<dictcomp>c             S   s   i | ]}||j qS r/   )r6   )r,   r   r/   r/   r0   r^     s    r   pipc             S   s   g | ]}|d kr|qS )r   r/   )r,   r   r/   r/   r0   r8     s    z)Resolve.bad_installed.<locals>.<listcomp>T)r=   c                sN   | |krJ| |  x6j| g D ]$}x|D ]} |j| q2W q"W d S )N)r}   rG   ro   rp   r6   )r6   r   fnrn   )get_rP   r/   r0   r     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   @r6   Nr/   )r,   r   )r   r/   r0   r1     s   z(Resolve.bad_installed.<locals>.<genexpr>c             3   s   | ]}  |V  qd S )N)
from_index)r,   r   )r   r/   r0   r1     s    c                s    g | ]\}}|d   kr|qS )r6   r/   )r,   r   r   )r   r/   r0   r8     s    z-Limiting solver to the following packages: %sz, zPackages to be preserved: %s)rD   rE   r   rF   r$   r6   r   r   r   rs   r5   r=   r   r   r   r   r   minimizera   r   r   r2   )rP   r   r   r   r7   	new_indexZname_mapZpython_precZnew_depsr   r   r   limitZxtraeq_optional_cr   rf   r/   )r   r   r   rP   r   r0   bad_installedu  sH    

"


	
zResolve.bad_installedc                s.   |r*dd |D  |  fdd|D  d S )Nc             S   s   i | ]}||j qS r/   )r6   )r,   r7   r/   r/   r0   r^     s    z'Resolve.restore_bad.<locals>.<dictcomp>c             3   s   | ]}|j  kr|V  qd S )N)r6   )r,   r   )r   r/   r0   r1     s    z&Resolve.restore_bad.<locals>.<genexpr>)r   )rP   r   preserver/   )r   r0   restore_bad  s    zResolve.restore_badc             C   s   t tt|}dd |D }td | ||\}}x|D ]x}|| jkrLq<|j|j|j	  }}	}
|j
j}||ks<|d k	r||krq<|rt|| d}nt||	|
|d}|| q<W t||fS )Nc             S   s   h | ]
}|j qS r/   )r6   )r,   r   r/   r/   r0   	<setcomp>  s    z(Resolve.install_specs.<locals>.<setcomp>z*Checking satisfiability of current install)r6   r   )r6   r   r   r   )r   mapr$   rD   rE   r  r<   r6   r   r   r   Zcanonical_namer   r}   rZ   )rP   r   r   update_depsr   r  r  r7   r6   r   r   Zschannelrf   r/   r/   r0   install_specs  s"    



zResolve.install_specsc             C   s6   |  ||pg |\}}| j||dd}| || |S )NF)	returnall_remove)r  solver  )rP   r   r   r
  r  r  r   r/   r/   r0   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 )	Nr   T)r   rk   )rk   c             s   s   | ]}|j r|j V  qd S )N)r6   )r,   r   r/   r/   r0   r1     s    z'Resolve.remove_specs.<locals>.<genexpr>z>=)r6   r   rk   r   )	r	  r$   r   rF   r   r  r6   r   r   )rP   r   r   Znspecsr   r   r  r   r  r7   r   Zverr/   r/   r0   remove_specs  s&    
zResolve.remove_specsc             C   s.   |  ||\}}| j|dd}| || |S )NT)r  )r  r  r  )rP   r   r   r  r   r/   r/   r0   remove  s    zResolve.removec       /         s&  t tr(t dttdd |D  t d t|}ttt	|}
|}|sp|d krbdS |rlg gS g S t d d8 fdd	} fd	d
 fdd}t|djd  ||d}|st||d}| g }	g }
g }tj}xt|D ]\}}|j|kr ||j |jsJ|js:||kr>|n|
| n6t|r t	|jd|jd}|	| || q W |dd |D  t d |r҈ |	} ||\}}t d| t d  |
\}}}} ||\}} ||\}}t d|| t d  } ||\}}t d|  } ||\}}t d| t d  ||\}}t d| |st d   |	} ||\}}t d| t d ! |} ||\}}t d| t d  |\} }!}"}# | |\}}$ |!|\}}% |"|\}}&t d |$|%|& t d! " |}  j| |dd"\}}t d#| ||}'|'s|##|  |#|\}}(t d$|( t d% d&})g }*|}+|*|+ xft$ fd'd|+D }, %|,fd}|d kr"P |)d&7 })|)d(kr@t d) P |}+|*|+ qW |)d&krt&tt|*}-tj'|- fd*d+|-D }.t(j)st*+d,|)d(krd-n|)td.d |.D |)d(krd/nd0f  fd1d2t,j-D |rt|*d&krt. tfd3d|*d4 D d5d6 d7S )9NzSolving for: %sc             s   s   | ]}t |V  qd S )N)r   )r,   r   r/   r/   r0   r1     s    z Resolve.solve.<locals>.<genexpr>z2Solve: Getting reduced index of compliant packagesFz!Solve: determining satisfiabilityc                s     | } ||S )N)r   r   )r   r   r   )r   r   r/   r0   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   r   r/   )r,   qr/   r/   r0   r8     s    z0Resolve.solve.<locals>.clean.<locals>.<listcomp>c             3   s   | ]}  |V  qd S )N)r   )r,   r   )r   r/   r0   r1     s    z/Resolve.solve.<locals>.clean.<locals>.<genexpr>r/   )sol)r   r/   r0   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,   r  )r   r/   r0   r1     s    z6Resolve.solve.<locals>.is_converged.<locals>.<genexpr>F)Z	includeIfNT)rT   r   )r   	psolutionnclause)r   r  r/   r0   is_converged  s
    z#Resolve.solve.<locals>.is_convergedT)r=   )r   )rk   r   c             s   s   | ]}t |V  qd S )N)r$   )r,   r   r/   r/   r0   r1   -  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: %dz0Solve: minimize number of optional installationsz#Optional package install metric: %dz,Solve: minimize number of necessary upgradeszDependency update count: %dz<Solve: maximize versions and builds of indirect dependenciesz:Additional package channel/version/build metrics: %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,   r  )r   r/   r0   r1   |  s    
   zToo many solutions; terminatingc                s   g | ]}t t|  qS r/   )rN   r   )r,   r  )commonr/   r0   r8     s    z!Resolve.solve.<locals>.<listcomp>zP
Warning: %s possible package resolutions (only showing differing packages):%s%sz>10c             s   s   | ]}d  |V  qdS )z, N)r2   )r,   Zdiffr/   r/   r0   r1     s    z
  ... and othersr(   c                s   i | ]}|  |qS r/   )r   )r,   r7   )rP   r/   r0   r^     s    z!Resolve.solve.<locals>.<dictcomp>c             3   s   | ]} | V  qd S )Nr/   )r,   r   )r  r/   r0   r1     s    r   c             S   s   | j S )N)r6   )r-   r/   r/   r0   r     r   zResolve.solve.<locals>.<lambda>)r:   )F)/rD   r   r   rE   r4   rN   r   rZ   r	  r$   r   r5   r=   r   r   r   r   rG   r   r6   r  rk   r   rF   rl   rm   r   r   r  r   r   r   r   r   r   ra   rT   r   rC   r   r   Zjson	stdoutloginfor   r<   RuntimeError)/rP   r   r  r  Zlen0r   r   r  r   ZspecoZspecrZspecaZspecmrU   r   r  Zobj7Zeq_req_cZeq_req_vZeq_req_bZeq_req_tZobj3aZobj3Zeq_feature_countZobj1Zeq_feature_metricZobj2Zobj4Zeq_optional_installZobj49Zeq_uZobj50Zeq_cZeq_vZeq_bZeq_tZobj5aZobj5Zobj6Z	convergedZobj6tZnsolZ
psolutionsr  r  Zpsols2Zdiffsr/   )r   r  r  r  r   rP   r0   r    s    






"




	














zResolve.solve)Fr/   )NN)T)T)T)T)N)F)F)T)NTF)FF)/__name__
__module____qualname__rS   rX   rd   rv   r|   r   r   r   r   r   r   r   r   r   r   rm   rp   rO   staticmethodr>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  __classcell__r/   r/   )r[   r0   r5   '   sT   
$

&

$
G
 H	


(
<$$2

 r5   N)r'   )=Z
__future__r   r   r   r   collectionsr   r   Zloggingr   r	   Z_vendor.auxlib.collectionr   Z_vendor.auxlib.decoratorsr   r   Z_vendor.toolzr   r   Zbase.constantsr   r   Zbase.contextr   Zcommon.compatr   r   r   r   r   r   Z	common.ior   Zcommon.logicr   r   r   Zcommon.toposortr   
exceptionsr   r   r    Zmodels.channelr!   r"   Zmodels.enumsr#   Zmodels.match_specr$   Zmodels.recordsr%   Zmodels.versionr&   r  rD   r  ZUnsatisfiabler4   objectr5   r/   r/   r/   r0   <module>   s0    
