³ò
ºQ“Ic           @   sÙ   d  d k  l Z l Z l Z l Z l Z l Z l Z l Z l	 Z	 l
 Z
 l Z d  d k l Z l Z d  d k l Z d  d k Z d d d „  ƒ  YZ e o d „  Z n d „  Z e	 d	 „ Z d
 „  Z d „  Z d „  Z d S(   iÿÿÿÿ(   t   GVt   Conflictt   sgnt   adjust_activityt   UNDEFt   TRUEt   FALSEt   PyTruet   PyFalset   Unsatisfablet   Clause(   t   DEBUGt   DEBUG_FORCED(   t   uniqueNt   Gc           B   s   e  Z d  Z g  g Z d  Z RS(   i    (   t   __name__t
   __module__t
   set_vars_Nt   decision_stackt   decision_level(    (    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyR      s   	c          C   sB   t  g  }  t i i ƒ  D]! } | i t j o |  d q q ~  ƒ S(   sI   Funzione di DEBUG: conta brutalmente il numero di variabili non assegnatei   (   t   sumR    t   varst
   itervaluest   valueR   (   t   _[1]t   v(    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyt   count_set_vars_N   s    c          C   sË   t  oS xC t t i i ƒ  ƒ D], }  t i |  i t j o t i |  Sq q Wt d ‚ n d } d } x^ t i i	 ƒ  D]M } | i t j o qv n | d j p | i
 | j o | } | i
 } qv qv W| S(   s.   Ritorna la variabile non assegnata piu' attivas$   Errore, non ho ci sono piu variabilii    N(   R   t   sortedR    R   t   iterkeysR   R   t	   Exceptiont   NoneR   t   activity(   t   vnamet   mavt   mav_activityR   (    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyt   most_active_var   s        c   	   
   C   sŒ  | o
 d } n, t  i d 7_ t  i i |  g ƒ t  i } |  i d | d | ƒ } t o d G| G|  GHn t  i d 7_ x
| g  j oü | i d ƒ \ } } } | i o q~ n t o) d t	 | i
 ƒ G| i | Gd G| GHn yr | i d | i | d | d | ƒ } | o | | 7} n | d j o t  i | i | ƒ n t  i d 7_ Wq~ t j
 o t d | d | ƒ d	 Sq~ Xq~ Wd	 S(
   s=  Assegna il valore `value' alla variabile `var' e ricerca clausole
           unitarie. Ricursivamente assegna ogni implicazione derivata da
           clausole unitarie. Il decision_stack viene aggiornato solo nel caso
           in cui zero_level=PyFalse.
           Nota: assumiamo che `var' sia una variabile UNDEFi    i   t   valt   levelt	   new_levels   v:t	   impliedbyt   varN(   R   R   R   t   appendt	   set_valueR   R   t   popt   onest   strt   namet   clause_listR   t   resolve_conflict(	   R(   R   t
   zero_levelR%   t   impliedt   Ct   lR   t   im(    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyR&   '   s4    
	  
 )%c         C   s[  t  o  d G|  Gd G|  i Gd G| GHn t | i ƒ d j o t  o	 d GHn t ‚ n t  o |  i d j p t ‚ n g  } |  i i | i D] } | t i t	 | ƒ q‘ ~ } t  o |  | j p t ‚ n g  } x$ | D] } | | i
 d g  ƒ 7} qà Wg  } | D]! } | i d j o | | qq~ } t  oY d Gg  } | D] } | t | ƒ qK~ Gt g  }	 | D] } |	 t | ƒ qs~	 ƒ GHn t t g  }
 | D]$ } | i d j o |
 | i q¦q¦~
 ƒ ƒ } | g  j o t  o	 d	 GHn t ‚ n t g  } | D] } | | i | i q~ ƒ } t  o d
 G| GHn t | i ƒ d j o d g } n xº t | ƒ D]¬ } x– t t | t i d ƒ ƒ D]x } t  o" d G| Gt t i | d ƒ GHn t i i ƒ  } x7 | g  j o) t i d 8_ | i ƒ  } | i ƒ  qÚWq™W| d t _ qvW| i ƒ  t | i ƒ d j o t | g ƒ n d S(   s¼  `var' e' la variabile che e' entrata in conflitto a causa della
            clausola `impliedby'. Le due clausole che concorrono al conflitto
            sono `var.impliedby' e `impliedby'.
            resolve_conflict() fa il raise di Unsatisfable se il problema non e'
            soddisfacibile, altrimenti aggiusta il decision_level e il
            decision_stack e aggiunge la nuova clausola di learning nel
            database.
        s   conflict! var:s   impliedby1:s   impliedby2:i   s/   UNSAT: decisione preliminare, clausola unitariat   alreadyseeni    t   Vimps   UNSAT: nulla da poter decideret   learned_clauses   resetting levelN(   R   R'   t   lent   litR	   R   t   AssertionErrorR    R   t   abst   get_root_implicationsR%   R-   R   R   R
   R.   R   t   reversedt   xrangeR   R   R   R+   R   t   resett   adjust_undefst   init_zero_level(   R(   R'   R   R4   t   VR7   R   t   _[2]t   _[3]t   _[4]t   _[5]t   Lt   _[6]R8   t   it   ds(    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyR0   O   sX    
   	
 ;  5 YD 	
2    " 
c         C   sw   xp |  D]h } t  o! t | i ƒ d j p t ‚ n t i t | i d ƒ } t | t | i d ƒ d t	 ƒq Wd S(   sN   `zero_level_clauses' e' una lista di clausole con un solo
           elemento.i   i    R1   N(
   R   R9   R:   R;   R    R   R<   R&   R   R   (   t   zero_level_clausesR3   R   (    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyRB   š   s      !c          C   sv   xo t  i t i j o[ t o t ƒ  t  i j p t ‚ n t ƒ  }  t i	 t
 t g ƒ } t |  | ƒ t ƒ  q Wd S(   s-   Il loop principale della procedura di ricercaN(   R   R   R    t   vars_NR   R   R;   R#   t   randomt   choiceR   R   R&   R   (   R(   R$   (    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pyt   solve£   s      	
(    (   t   dataR    R   R   R   R   R   R   R   R   R	   R
   t   debugR   R   t   miscR   RN   R   R   R#   R&   R0   RB   RP   (    (    (    sF   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/solver.pys   <module>   s   L
	(	K		