
    e!h                         d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ  ej$                           G d d      Zy)z2
``experta engine`` represents ``CLIPS modules``

    )chainN)abstract)AgendaInitialFact)FactList)Rule)DefFacts)watchersc                       e Zd ZdZddlmZ ddlmZ	 d Z
ed        Zd Zd Z ed	
      d        Zd Zd Zd Zd Zd Z ed      fdZd Zd Zd Zd Zy)KnowledgeEngineag  
    This represents a clips' ``module``, wich is an ``inference engine``
    holding a set of ``rules`` (as :obj:`experta.rule.Rule` objects),
    an ``agenda`` (as :obj:`experta.agenda.Agenda` object)
    and a ``fact-list`` (as :obj:`experta.factlist.FactList` objects)

    This could be considered, when inherited from, as the
    ``knowlege-base``.
    r   )ReteMatcher)DepthStrategyc                    d| _         t               | _        t               | _        t        | j                  t              r;t        | j                  t        j                        r| j                  |       | _        nt        d      t        | j                  t              r:t        | j                  t        j                        r| j                         | _        y t        d      )NFz)__matcher__ must be a subclass of Matcherz+__strategy__ must be a subclass of Strategy)runningr   factsr   agenda
isinstance__matcher__type
issubclassr   Matchermatcher	TypeError__strategy__Strategystrategyselfs    V/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/experta/engine.py__init__zKnowledgeEngine.__init__#   s    Z
ht''.t//1A1AB++D1DLGHHt(($/t00(2C2CD --/DMIJJ    c               +      K   | j                         D ]B  \  }}|j                  d      r&|dd  j                         rt        |dd        |f =||f D y w)N_   )items
startswith	isnumericint)	modifierskvs      r    _get_real_modifiersz#KnowledgeEngine._get_real_modifiers4   sX     OO% 	DAq||C QqrU__%61QR5z1o%!f		s   AAc           	          | j                  |       |j                         }|j                  t         | j                  di |             | j                  |      S )a  

        Modifies a fact.

        Facts are inmutable in Clips, thus, as documented in clips
        reference manual, this retracts a fact and then re-declares it

        `modifiers` must be a Mapping object containing keys and values
        to be changed.

        To allow modifying positional facts, the user can pass a string
        containing the symbol "_" followed by the numeric index
        (starting with 0). Ex::

            >>> ke.modify(my_fact, _0="hello", _1="world", other_key="!")

         )retractcopyupdatedictr-   declare)r   declared_factr*   newfacts       r    modifyzKnowledgeEngine.modify<   sO    $ 	]#$$&t4D44AyABC||G$$r"   c           	          |j                         }|j                  t         | j                  di |             | j	                  |      S )z'Create a new fact from an existing one.r/   )r1   r2   r3   r-   r4   )r   template_factr*   r6   s       r    	duplicatezKnowledgeEngine.duplicateU   sC      $$&t4D44AyABC||G$$r"   orderc              #   $   K   t                y wNr   r   s    r    _declare_initial_factz%KnowledgeEngine._declare_initial_fact]   s     ms   c              #   v   K   t        j                  |       D ]  \  }}t        ||      s| |_        |  y wr?   )inspect
getmembersr   ke)r   wanted_typer$   objs       r    _get_by_typezKnowledgeEngine._get_by_typea   s:     ((. 	FAs#{+		s   (99c                 >    t        | j                  t                    S )zReturn the existing rules.)listrG   r	   r   s    r    	get_ruleszKnowledgeEngine.get_rulesg   s    D%%d+,,r"   c                 D    t        | j                  t              d       S )z9Return the existing deffacts sorted by the internal orderc                     | j                   S r?   r<   )ds    r    <lambda>z.KnowledgeEngine.get_deffacts.<locals>.<lambda>m   s
     r"   )key)sortedrG   r
   r   s    r    get_deffactszKnowledgeEngine.get_deffactsk   s    d''17HIIr"   c                 \     | j                   j                  | j                  j                   S )z$
        Return activations
        )r   changesr   r   s    r    get_activationszKnowledgeEngine.get_activationso   s%     $t||##TZZ%7%788r"   c                     | j                   j                  |       | j                  s;| j                         \  }}| j                  j                  | j                  ||       yy)zr
        Retracts a specific fact, using its index

        .. note::
            This updates the agenda
        N)r   r0   r   rT   r   update_agendar   )r   idx_or_declared_factaddedremoveds       r    r0   zKnowledgeEngine.retractu   sO     	

/0||!113NE7MM''UGD r"   infc                    d| _         d}d}|dkD  r| j                   r| j                         \  }}| j                  j                  | j                  ||       t        j                  dd      r}t        | j                  j                        D ][  \  }}t
        j                  j                  d||j                  j                  dj                  d |j                  D                     ] | j                  j                         }|		 d| _         y|d	z  }|d	z  }t
        j                   j#                  d
||j                  j                  dj                  d |j                  D                      |j                  | fi |j$                  j'                         D 	ci c]  \  }}	|j)                  d      s||	 c}	} |dkD  r| j                   rd| _         yc c}	}w )z,
        Execute agenda activations
        TNr   AGENDADEBUGz	%d: %r %rz, c              3   2   K   | ]  }t        |        y wr?   str.0fs     r    	<genexpr>z&KnowledgeEngine.run.<locals>.<genexpr>   s     !<Q#a&!<   r%   zFIRE %s %s: %sc              3   2   K   | ]  }t        |        y wr?   r_   ra   s     r    rd   z&KnowledgeEngine.run.<locals>.<genexpr>   s     ?c!f?re   __F)r   rT   r   rV   r   r   worth	enumerateactivationsr\   debugrule__name__joinr   get_nextRULESinfocontextr&   r'   )
r   steps
activation	executionrX   rY   idxactr+   r,   s
             r    runzKnowledgeEngine.run   s   
 
	aiDLL!113NE7MM''UGD~~h0 )$++*A*A B >HCOO))#))		!<#))!<<	>> --/J!"  
Q	##$OO,,II?j.>.>??	A  
3 $.#5#5#;#;#=21all40 !t 237 aiDLLB 	2s   Gc                     d| _         y )NF)r   r   s    r    haltzKnowledgeEngine.halt   s	    r"   c                 n   t               | _        t               | _        | j                  j                          g }| j                         D ]  }t        j                  |      }t        d |j                  j                         D              sat        |j                  j                               }|j                   |di |j                         D ci c]  \  }}||v r|| c}}       |j                   |di |         | j                   t#        j$                  |        d| _        yc c}}w )ab  
        Performs a reset as per CLIPS behaviour (resets the
        agenda and factlist and declares InitialFact())

        Any keyword argument passed to `reset` will be passed to @DefFacts
        which have those arguments on their signature.

        .. note:: If persistent facts have been added, they'll be
                  re-declared.
        c              3   j   K   | ]+  }|j                   t        j                  j                  k(   - y wr?   )kindrB   	ParameterVAR_KEYWORD)rb   ps     r    rd   z(KnowledgeEngine.reset.<locals>.<genexpr>   s-      ? vv!2!2!>!>> ?s   13FNr/   )r   r   r   r   r   resetrQ   rB   	signatureany
parametersvaluessetkeysappendr&   _KnowledgeEngine__declarer   from_iterabler   )r   kwargsdeffactsdeffactr   argsr+   r,   s           r    r   zKnowledgeEngine.reset   s    hZ
((* 	3G))'2I ? ) 4 4 ; ; =? ? 9//4467 . -1"#t)  !!t - ./  1& 12	3 	++H56-s   D1c                 N   t        d |D              rt        d      t        d |D              rt        d      d}|D ]  }| j                  j	                  |      } | j
                  s:| j                         \  }}| j                  j                  | j                  ||       |S )zT
        Internal declaration method. Used for ``declare`` and ``deffacts``
        c              3   <   K   | ]  }|j                           y wr?   )has_field_constraintsra   s     r    rd   z,KnowledgeEngine.__declare.<locals>.<genexpr>   s     8Qq&&(8   z2Declared facts cannot contain conditional elementsc              3   <   K   | ]  }|j                           y wr?   )has_nested_accessorra   s     r    rd   z,KnowledgeEngine.__declare.<locals>.<genexpr>   s     8Q&&(8r   z;Cannot declare facts containing double underscores as keys.N)
r   r   KeyErrorr   r4   r   rT   r   rV   r   )r   r   last_insertedfactrX   rY   s         r    	__declarezKnowledgeEngine.__declare   s     8%88DF F8%88MO O !M 9 $

 2 24 89 <<!%!5!5!7w++DKKH  r"   c                 v    | j                   st        j                  j                  d        | j                  | S )z
        Declare from inside a fact, equivalent to ``assert`` in clips.

        .. note::

            This updates the agenda.
        zDeclaring fact before reset())r   r   ENGINEwarningr   )r   r   s     r    r4   zKnowledgeEngine.declare   s/     zzOO##$CDt~~u%%r"   N)rm   
__module____qualname____doc__experta.matchersr   r   experta.strategiesr   r   r!   staticmethodr-   r7   r:   r
   r@   rG   rJ   rQ   rT   r0   floatrx   rz   r   r   r4   r/   r"   r    r   r      s     <@K"  %2% B -J9E e )V"H!*&r"   r   )r   	itertoolsr   rB   loggingexpertar   experta.agendar   experta.factr   experta.factlistr   experta.ruler	   experta.deffactsr
   r   basicConfigr   r/   r"   r    <module>r      sD   
     ! $ %  %     ^& ^&r"   