
    wBfj                     `   d dl Z d dlmZ d dlmZ d dlmZmZ ddlmZ  ee	      Z
e j                  Ze Z G d d      Z G d	 d
      Z G d d      Z G d de      Z G d de      Z G d de      ZeeedZej+                         D  ci c]  \  } }|| 
 c}} Z G d d      Zyc c}} w )    N)array)combinations)DEBUG	getLogger   )TRACEc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	_ClauseListzEStorage for the CNF clauses, represented as a list of tuples of ints.c                 ~    g | _         | j                   j                  | _        | j                   j                  | _        y N)_clause_listappendextendselfs    3lib/python3.12/site-packages/conda/common/_logic.py__init__z_ClauseList.__init__   s2     ''..''..    c                 ,    t        | j                        S )z Return number of stored clauses.lenr   r   s    r   get_clause_countz_ClauseList.get_clause_count   s    4$$%%r   c                 ,    t        | j                        S )z
        Get state information to be able to revert temporary additions of
        supplementary clauses.  _ClauseList: state is simply the number of clauses.
        r   r   s    r   
save_statez_ClauseList.save_state   s    
 4$$%%r   c                 &    |}g | j                   |d y)
        Restore state saved via `save_state`.
        Removes clauses that were added after the state has been saved.
        Nr   )r   saved_statelen_clausess      r   restore_statez_ClauseList.restore_state&   s    
 "*,+,'r   c                     | j                   S )+Return clauses as a list of tuples of ints.r   r   s    r   as_listz_ClauseList.as_list.   s       r   c                     t        d      }| j                  D ]$  }|j                  |       |j                  d       & |S )FReturn clauses as a flat int array, each clause being terminated by 0.ir   )r   r   r   r   )r   clause_arraycs      r   as_arrayz_ClauseList.as_array2   sD    Sz"" 	#A""	# r   N)
__name__
__module____qualname____doc__r   r   r   r    r#   r)    r   r   r
   r
      s#    O/&&-!r   r
   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)_ClauseArrayzp
    Storage for the CNF clauses, represented as a flat int array.
    Each clause is terminated by int(0).
    c                     t        d      | _        | j                  j                  | _        | j                  j                  | _        y )Nr&   )r   _clause_arrayr   _array_appendr   _array_extendr   s    r   r   z_ClauseArray.__init__A   s8    "3Z "//66!//66r   c                 4    |D ]  }| j                  |        y r   )r   )r   clausesclauses      r   r   z_ClauseArray.extendH   s     	 FKK	 r   c                 H    | j                  |       | j                  d       y )Nr   )r4   r3   )r   r7   s     r   r   z_ClauseArray.appendL   s    6"1r   c                 8    | j                   j                  d      S )z
        Return number of stored clauses.
        This is an O(n) operation since we don't store the number of clauses
        explicitly due to performance reasons (Python interpreter overhead in
        self.append).
        r   )r2   countr   s    r   r   z_ClauseArray.get_clause_countP   s     !!''**r   c                 ,    t        | j                        S )z
        Get state information to be able to revert temporary additions of
        supplementary clauses. _ClauseArray: state is the length of the int
        array, NOT number of clauses.
        )r   r2   r   s    r   r   z_ClauseArray.save_stateY   s     4%%&&r   c                 8    |}t        d      | j                  |d y)r   r&   N)r   r2   )r   r   len_clause_arrays      r   r    z_ClauseArray.restore_statea   s"    
 '05c
+,-r   c              #      K   g }| j                   D ]6  }|dk(  rt        |       |j                          &|j                  |       8 yw)r"   r   N)r2   tupleclearr   )r   r7   vs      r   r#   z_ClauseArray.as_listi   sF     ## 	!AAvFm#a 	!s   A	Ac                     | j                   S )r%   )r2   r   s    r   r)   z_ClauseArray.as_arrays   s    !!!r   N)r*   r+   r,   r-   r   r   r   r   r   r    r#   r)   r.   r   r   r0   r0   ;   s/    
7 +';!"r   r0   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)
_SatSolverzNSimple wrapper to call a SAT solver given a _ClauseList/_ClauseArray instance.c                     |xs i | _         t               | _        | j                  j                  | _        | j                  j
                  | _        y r   )_run_kwargsr
   _clausesr   
add_clauser   add_clauses)r   
run_kwargss     r   r   z_SatSolver.__init__{   s;    %+#--..==//r   c                 6    | j                   j                         S r   )rG   r   r   s    r   r   z_SatSolver.get_clause_count   s    }}--//r   c                 6    | j                   j                         S r   )rG   r#   r   s    r   r#   z_SatSolver.as_list   s    }}$$&&r   c                 6    | j                   j                         S r   )rG   r   r   s    r   r   z_SatSolver.save_state   s    }}''))r   c                 8    | j                   j                  |      S r   )rG   r    )r   r   s     r   r    z_SatSolver.restore_state   s    }}**;77r   c                     | j                   j                         }|j                  |        | j                  |fi |}| j	                  |      }| j                  |      }|S r   )rF   copyupdatesetupinvokeprocess_solution)r   mkwargsrJ   solversat_solutionsolutions          r   runz_SatSolver.run   s\    %%**,
&!A,,{{6*((6r   c                     t               )z?Create a solver instance, add the clauses to it, and return it.NotImplementedError)r   rU   rV   s      r   rR   z_SatSolver.setup       !##r   c                     t               )z@Start the actual SAT solving and return the calculated solution.r\   )r   rW   s     r   rS   z_SatSolver.invoke   r^   r   c                     t               )z
        Process the solution returned by self.invoke.
        Returns a list of satisfied variables or None if no solution is found.
        r\   r   rX   s     r   rT   z_SatSolver.process_solution   s    
 "##r   N)r*   r+   r,   r-   r   r   r#   r   r    rZ   rR   rS   rT   r.   r   r   rD   rD   x   s2    X00'*8$$$r   rD   c                        e Zd ZddZd Zd Zy)_PycoSatSolverc                 T    ddl m}  || j                  j                         ||      S )Nr   )	itersolve)vars
prop_limit)pycosatre   rG   r#   )r   rU   limitrV   re   s        r   rR   z_PycoSatSolver.setup   s#    % ..0qUKKr   c                 F    	 t        |      }~|S # t        $ r d}Y ~|S w xY w)NUNSAT)nextStopIteration)r   iter_solrX   s      r   rS   z_PycoSatSolver.invoke   s:    	#>L   	#"L	#s      c                     |dv ry |S )N)rk   UNKNOWNr.   ra   s     r   rT   z_PycoSatSolver.process_solution   s    //r   Nr   r*   r+   r,   rR   rS   rT   r.   r   r   rc   rc      s    Lr   rc   c                        e Zd ZddZd Zd Zy)_PyCryptoSatSolverc                 v    ddl m}  ||      }|j                  | j                  j	                                |S )Nr   )Solver)threads)pycryptosatrv   rI   rG   r#   )r   rU   rw   rV   rv   rW   s         r   rR   z_PyCryptoSatSolver.setup   s/    &(4==0023r   c                 4    |j                         \  }}|sd }|S r   )solve)r   rW   satrX   s       r   rS   z_PyCryptoSatSolver.invoke   s     "LLN\Lr   c                 X    |sy t        |      D cg c]
  \  }}|s	| }}}|S c c}}w r   )	enumerate)r   rY   r&   bs       r   rT   z#_PyCryptoSatSolver.process_solution   s0    "+H"5;$!QA;; <s   
&&N)r   rr   r.   r   r   rt   rt      s    r   rt   c                       e Zd Zd Zd Zd Zy)_PySatSolverc                 r    ddl m}  |       }|j                  | j                  j	                                |S )Nr   )Glucose4)pysat.solversr   append_formularG   r#   )r   rU   rV   r   rW   s        r   rR   z_PySatSolver.setup   s,    *dmm3356r   c                 l    |j                         sd }n|j                         }|j                          |S r   )rz   	get_modeldelete)r   rW   rX   s      r   rS   z_PySatSolver.invoke   s-    ||~L!++-Lr   c                     |d }|S |}|S r   r.   )r   rX   rY   s      r   rT   z_PySatSolver.process_solution   s     H  $Hr   Nrr   r.   r   r   r   r      s    r   r   )rh   rx   pysatc                       e Zd Zdee   fdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 ZddZddZddZddZddZddZd Zd ZddZd Zd Zd Zd Zd Zd dZd!dZddZy)"Clausesr   c                     d| _         || _        	 t        |   } |       | _        | j
                  j                  | _        | j
                  j                  | _        y # t        $ r t	        d|       w xY w)NFzUnknown SAT solver: )unsatrU   _sat_solver_str_to_clsKeyErrorr]   _sat_solverrH   rI   )r   rU   sat_solver_strsat_solver_clss       r   r   zClauses.__init__   s}    
	O3NCN *+ **55++77  	O%(<^<L&MNN	Os   	A A4c                 6    | j                   j                         S r   )r   r   r   s    r   r   zClauses.get_clause_count	  s    0022r   c                 6    | j                   j                         S r   )r   r#   r   s    r   r#   zClauses.as_list  s    ''))r   c                 2    | j                   dz   }|| _         |S )Nr   )rU   )r   rU   s     r   new_varzClauses.new_var  s    FFQJr   c                     t        |t              rL| j                         | j                  fd|d   D               | j                  fd|d   D               S |S )Nc              3   ,   K   | ]  } f|z     y wr   r.   .0yxs     r   	<genexpr>z!Clauses.assign.<locals>.<genexpr>  s     81qbUQY8s   r   c              3   *   K   | ]
  }f|z     y wr   r.   r   s     r   r   z!Clauses.assign.<locals>.<genexpr>  s     7!aTAX7s   r   )
isinstancer?   r   rI   )r   valsr   s     @r   assignzClauses.assign  sR    dE"A8Q887tAw77Hr   c                 j   t        d |D              rt        S |D cg c]  }|t        k7  s| }}t        |      }|dk(  rt        S |dk(  r|d   S t	        d |D              r&t        d |D        g       t        d |D        g       fS | j                  t        | j                  |      |      S c c}w )Nc              3   .   K   | ]  }|t         k(    y wr   )FALSEr   rA   s     r   r   z"Clauses.Combine.<locals>.<genexpr>  s     (aqEz(s   r   r   c              3   <   K   | ]  }t        |t                y wr   )r   r?   r   s     r   r   z"Clauses.Combine.<locals>.<genexpr>%  s     2z!U#2s   c              3   &   K   | ]	  }|d      ywr   Nr.   r   s     r   r   z"Clauses.Combine.<locals>.<genexpr>&  s     ,!1,   c              3   &   K   | ]	  }|d      yw)r   Nr.   r   s     r   r   z"Clauses.Combine.<locals>.<genexpr>&  s     7K!7Kr   )	anyr   TRUEr   allsumAllmapr   )r   argspolarityrA   nvs        r   CombinezClauses.Combine  s    (4((L-a19--Y7K77N2T22,t,b137Kd7KR3PQQ88CT2H== .s
   B0B0c                    | j                   j                         } ||d|i}t        |t              r)| j	                  |d          | j	                  |d          y |t
        t        hvr| j                  |r|f       y | f       y | j                   j                  |       | j                  xs |t
        k(  |k7  | _	        y )Nr   r   r   )
r   r   r   r?   rI   r   r   rH   r    r   )r   funcr   r   r   r   s         r   EvalzClauses.Eval*  s    &&113T-H-dE"T!W%T!W%$&OOXT:;D5:;**;7A'ADJr   c                 ,    | j                  ||d       y )NFr   r   r   r   r   s      r   PreventzClauses.Prevent7  s    		$u	-r   c                 ,    | j                  ||d       y )NTr   r   r   s      r   RequirezClauses.Require:  s    		$t	,r   Nc                     | S r   r.   )r   r   r   add_new_clausess       r   NotzClauses.Not=  s	    r	r   c                 h   |t         k(  s	|t         k(  rt         S |t        k(  r|S |t        k(  r|S ||k(  r|S || k(  rt         S ||k  r||}}|rJ| j                         }|dv r| j                  | |f| |fg       |dv r| j                  || | fg       |S |dv r|f|fgng }|dv r| | fgng }||fS NTNFN)r   r   r   rI   r   fgr   r   r   pvalnvals           r   AndzClauses.And@  s    :eL9H9H6H7Lq5aqA
 A<'   B
 B	 =(  1qb1"+/H'<7qd|R%6!aRzBTzr   c                 f   |t         k(  s	|t         k(  rt         S |t        k(  r|S |t        k(  r|S ||k(  r|S || k(  rt         S ||k  r||}}|rI| j                         }|dv r| j                  | ||fg       |dv r| j                  || f|| fg       |S |dv r||fgng }|dv r| f| fgng }||fS r   )r   r   r   rI   r   s           r   Orz
Clauses.Org  s    9T	K:H:H6H7Kq5aqAA<'  A2q!*.=(   B
 B	 H#|3Ax!)]!:!u~Tzr   c                    |t         k(  r|S |t        k(  r| j                  |||      S |t         k(  r|S |t        k(  r| S ||k(  rt         S || k(  rt        S ||k  r||}}|rR| j                         }|dv r| j	                  | ||f| | | fg       |dv r| j	                  || |f||| fg       |S |dv r
||f| | fgng }|dv r
| |f|| fgng }||fS Nr   r   r   )r   r   r   r   rI   r   s           r   XorzClauses.Xor  s#   :H988Ax8II:H92I6L7Kq5aqAA<'  A2q!*rA2rl!;<=(  1qb!*q!aRj!9:H%-%=A!aR!2%-%>!Q!aR!BTzr   c                 l   |t         k(  r|S |t        k(  r|S |t         k(  r| j                  ||||      S |t        k(  r| j                  | |||      S |t        k(  r| j                  ||||      S |t         k(  r| j                  || ||      S ||k(  r| j                  ||||      S || k(  r| j                  | |||      S ||k(  r| j                  ||||      S || k(  r| j                  || ||      S ||k(  r|S || k(  r| j	                  ||||      S ||k  r||| }}}|r]| j                         }|dv r!| j                  | | |f| ||f| ||fg       |dv r"| j                  || | f||| f|| | fg       |S |dv r| |f||f||fgng }|dv r| | f|| f| | fgng }||fS r   )r   r   r   r   r   r   rI   )	r   r(   tr   r   r   r   r   r   s	            r   ITEzClauses.ITE  s5   9H:H9771a?7KK:88QB8_8MM:88Aq(O8LL9771qb(O7LL6771a?7KK788QB8_8MM688Aq(O8LL7771qb(O7LL6H788Aq(O8LLq5QB!qA A<'  A2r1+AqzQB1:!FG=(  1qb1"+1qbzArA2;!GHH,4,D!Q!Q!Q("08M0I!aR1qb'QB8,rTzr   c                 R   t               }|D ]3  }|t        k(  r|t        k(  s| |v rt        c S |j                  |       5 t	        |      }|dk(  rt        S |dk(  rt        d |D              S |dv r|D cg c]  }|f c}ng }|dv rt        d |D              gng }||fS c c}w )Nr   r   c              3       K   | ]  }|  y wr   r.   r   s     r   r   zClauses.All.<locals>.<genexpr>       (a(   r   r   c              3   "   K   | ]  }|  	 y wr   r.   r   s     r   r   zClauses.All.<locals>.<genexpr>  s     'Qqb's   )setr   r   addr   rl   r?   r   iterr   r   rA   r   r   r   s           r   r   zClauses.All  s    u 	ADyEzaR4ZHHQK	 Y7K1W(4((('/<'?d##R,4,E'$''(2Tz $s   8
B$c                 F   t               }|D ]3  }|t        k(  r|t        k(  s| |v rt        c S |j                  |       5 t	        |      }|dk(  rt        S |dk(  rt        d |D              S |dv rt        |      gng }|dv r|D cg c]  }| f c}ng }||fS c c}w )Nr   r   c              3       K   | ]  }|  y wr   r.   r   s     r   r   zClauses.Any.<locals>.<genexpr>  r   r   r   r   )r   r   r   r   r   rl   r?   r   s           r   AnyzClauses.Any  s    u 	AEzdqbDjHHQK	 Y7L1W(4((( (L 8d}b(0M(At$!!$rTz %s   
Bc                     g }t        t        | j                  |      d      D ]'  \  }}|j                  | j	                  |||             ) | j                  ||      S )N   )r   r   r   r   r   r   )r   r   r   combosv1v2s         r   AtMostOne_NSQzClauses.AtMostOne_NSQ  sV    "3txx#6: 	5FBMM$''"b(34	5||FH--r   c                 b    t        |      }dgt        |      z  }| j                  ||ddd|      S )Nr   r   Tlistr   LinearBoundr   r   r   litscoeffss        r   AtMostOne_BDDzClauses.AtMostOne_BDD  5    Dzs4yfaD(CCr   c                     t        |      }| j                  ||      }| j                  ||      }| j                  ||f|      S r   )r   r   r   r   )r   r   r   r   r   s        r   ExactlyOne_NSQzClauses.ExactlyOne_NSQ  sB    Dzh/XXdH%||RHh//r   c                 b    t        |      }dgt        |      z  }| j                  ||ddd|      S )Nr   Tr   r   s        r   ExactlyOne_BDDzClauses.ExactlyOne_BDD   r   r   c                     g }d}t        ||      D ]F  \  }}|t        k(  r||z  }|t        k(  s|dk(  r$|dk  r||z  }| | }}|j                  ||f       H t	        t        t        |             xs d\  }}|||fS )Nr   )r.   r.   )zipr   r   r   r?   sorted)r   r   r   equationoffsetcoefflits          r   LB_PreprocesszClauses.LB_Preprocess  s    fd+ 		*JE3d{%e|uzqy%#VcTsOOUCL)		* S&"234@VV##r   c                 4   t        d |d | D              }|dz
  d|f}|g}	i }
|	j                  }|	j                  }|
j                  }| j                  }d}|	r|	d   \  }}}||z
  }||z
  }|dk  r||k\  rt
        |
 |       <   .||kD  s|dk  rt        |
 |       <   G||   }||   }|dz  }||z  }||dk  r|n||z   |f} ||      }|	 ||       }||dk  r||z   n||f} ||      }|	 ||        |t        |      |||d      |
 |       <   |	r|
|   S )Nc              3       K   | ]  }|  y wr   r.   r   r(   s     r   r   zClauses.BDD.<locals>.<genexpr>       /!A/r   r   r   Tr   )r   r   popgetr   r   r   abs)r   r   r   ntermslohir   totaltarget
call_stackretcall_stack_appendcall_stack_popret_getr   csumndxlower_limitupper_limitLALChi_keythilo_keytlos                            r   BDDzClauses.BDD  s    /vgv//1*a'X
&--#''hh)"~Cut)Kt)KaK5$8(,N$%U"kAo(-N$%cBB1HCRKE264tby%@F&/C{!&)Q4"9D%@F&/C{!&) %(Bc8T%C !; @ 6{r   c                 6   |r | j                  ||      \  }}}||z  }|z  t        |      }|r>|d   kD  r6t        fd|D              }	t        j                  t        d|	|       ||	z  }nd}	t        d |d | D              }
|rt        |dg      }t        |
g      |kD  rt        S |dk(  r|dk(  rt        nt        }n| j                  |||||      }|	r8| j                  ||d  D cg c]  }|  c}|      }| j                  ||f|      }|S c c}w )Nr   c              3   (   K   | ]	  }|kD    y wr   r.   )r   r(   r  s     r   r   z&Clauses.LinearBound.<locals>.<genexpr>P  s     0AR0s   z+Eliminating %d/%d terms for bound violationr   c              3       K   | ]  }|  y wr   r.   r   s     r   r   z&Clauses.LinearBound.<locals>.<genexpr>X  r   r   )r   r   r   logr   maxminr   r   r  r   r   )r   r   r   r  r  
preprocessr   r   r  npruner  resaprunes       `         r   r   zClauses.LinearBoundI  s.   #'#5#5dF#C D&&&LB&LBVfRj2o000FGGDff fFF/vgv//b!WBb%[!B7LQ;'$uC((4RBCHH$vw-8Qqb8(CE,,U|X6C
 9s   .
Dc                     t         j                  t              r$t         j                  d| j	                                | j
                  j                  ||      }|S )Nz"Invoking SAT with clause count: %sri   )r  isEnabledForr   debugr   r   rZ   )r   rU   ri   rY   s       r   _run_satzClauses._run_satg  sH    E"II:D<Q<Q<ST##'''7r   c                 J   | j                   ry| j                  sg S | j                  j                         }|r-d }t	         ||            }|r|d   sy| j                  |       | j                  | j                  |      }|r||s| j                  j                  |       |S )z
        Calculate a SAT solution for the current clause set.

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

        Nc              3   t   K   d }| D ],  }t         ||            }|s|  y |d   t        k7  s)| . y w)Nc              3   L   K   | D ]  }|t         k(  r| |t        k(  s y  y wr   )r   r   )ccr(   s     r   preproc_z.Clauses.sat.<locals>.preproc.<locals>.preproc_}  s.      ":$9!"s   $$r   )r?   r   )eqsr-  r,  s      r   preproczClauses.sat.<locals>.preproc|  sE     "  !Bx|,B "v~ !s   .88r   r%  )r   rU   r   r   r   rI   r(  r    )r   
additional	includeIfri   r   r/  rY   s          r   r{   zClauses.satm  s     ::vvI&&113!" gj12J!"~  ,==u=58+9**;7r   c           
         |t        |      | j                  k  r%t        j                  d       | j	                         }|| j
                  r1t        j                  d       ||rt        d |D              dz   fS dfS |st        j                  d       |dfS | j                  ||      \  }}}t        |      }d }d	 }dd}	|dkD  rd
ndD ]  }
|
rt        j                  t        d       |}nt        j                  t        d       |}t        ||      D ci c]  \  }}||
 }}} |||      }|}| j                  }t        j                  t              r| j                         }| j                  j                         }|r|
s|dz
  }	t        j                  t        d|       	 |		|z   dz  n|	|
rxt!        fdt        ||      D              }t!        fdt        ||      D              }| j#                  | j$                  |       |r=| j'                  | j$                  |       n | j'                  | j(                  ||d       t        j                  t              r/t        j                  t        d| j                         |z
         | j	                         }|'dz   t        j                  t        d|       |kD  r2n{k(  }|} |||      }|}t        j                  t        d|       |rnJ|| _        | j                  j                         |k7  r| j                  j+                  |       d| _        d}	t        j                  d|
rdnd|fz         |dk(  r ||fS |
rFt        ||      D cg c]  \  }}||k  s| }}}|D cg c]
  }||k  s	| }} |||      }	|t        j                  d |||      z          |fS c c}}w c c}}w c c}w )z
        Minimize the objective function given by (coeff, integer) pairs in
        zip(coeffs, lits).
        The actual minimization is multiobjective: first, we minimize the
        largest active coefficient value, then we minimize the sum.
        Nz#Clauses added, recomputing solutionzConstraints are unsatisfiablec              3   2   K   | ]  }t        |        y wr   )r  r   s     r   r   z#Clauses.minimize.<locals>.<genexpr>  s     71A7s   r   z!Empty objective, trivial solutionr   c                 ,    t        fd| D              S )Nc              3   B   K   | ]  }j                  |d         ywr   r  r   sobjective_dicts     r   r   z5Clauses.minimize.<locals>.peak_val.<locals>.<genexpr>       =A~))!Q/=   )r  solr9  s    `r   peak_valz"Clauses.minimize.<locals>.peak_val      ====r   c                 ,    t        fd| D              S )Nc              3   B   K   | ]  }j                  |d         ywr   r6  r7  s     r   r   z4Clauses.minimize.<locals>.sum_val.<locals>.<genexpr>  r:  r;  )r   r<  s    `r   sum_valz!Clauses.minimize.<locals>.sum_val  r?  r   )TFFzBeginning peak minimizationzBeginning sum minimizationzInitial range (%d,%d)r   c              3   4   K   | ]  \  }}|kD  s|  y wr   r.   )r   r(   r"  mids      r   r   z#Clauses.minimize.<locals>.<genexpr>  s     #O$!Qq3wA#Os   c              3   F   K   | ]  \  }}|cxk  rk  sn n|  y wr   r.   )r   r(   r"  r  rE  s      r   r   z#Clauses.minimize.<locals>.<genexpr>  s      #V$!QrQ~RU~A#Vs   !
!Fz+Bisection attempt: (%d,%d), (%d+%d) clausesz$Bisection failure, new range=(%d,%d)z$Bisection success, new range=(%d,%d)zFinal %s objective: %dpeakr   zNew peak objective: %d)r   rU   r  r'  r{   r   r   r   r  r   r   r&  r   r   r   r   r?   r   r   r   r   r    )r   r   r   bestsoltrymaxr   maxvalr>  rB  try0rG  objvalr(   r"  r9  bestvalr  m_orignzr   preventrequirenewsoldoner  rE  s                           @@r   minimizezClauses.minimize  s    ?c'lTVV3II;<hhjG?djjII56vC777!;LL1LLII9:A:#11$?ffV	>	> %+aZMX V	XD<=!;< /264/@Atq!adANAWn5G BVVF&**,**557KdAvGGE2B;<7q.CC##O#fd2C#OOG##V#fd2C#VVGLL73TXXw7LL!1!14S%P##E*GGE--/"4 >qBGGE#I2rRBw 
 9D$G$V^<G BGGE#I2rR ##..0K?$$22;?"
a d II.D&eW1UUV!|  
 '*&$&7Hda1<HH%+<qG|!<<w7		2Xg~5VVWmV	Xp a BR I<s   O'
O-O-#
O3.O3)NFrC  r   rq   )NFr   )r*   r+   r,   _sat_solver_cls_to_strrc   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r(  r{   rT  r.   r   r   r   r      s    +A.+Q 83*
>B.-%N!F4'R"".D
0D
$ 2h<(Tt r   r   )sysr   	itertoolsr   loggingr   r   	constantsr   r*   r  maxsizer   r   r
   r0   rD   rc   rt   r   r   itemsrU  r   )stringclss   00r   <module>r^     s      " $  {{	' 'T:" :"z+$ +$\Z 2 ,: 2 %  :P9U9U9WX+&##v+X Q  Q  Ys   B*