
    e!he                         d Z ddlZddlmZ  G d dej                        Z G d de      Z G d	 d
e      Z G d dej                        Zy)z2Abstract base classes for the RETE implementation.    N)watchersc                   j    e Zd ZdZd Zej                  d        Zd Zej                  d        Z	d Z
y)NodezNode interface.c                 B    t               | _        | j                          y)z9Initialize `self.children` and reset the node own memory.N)listchildren_resetselfs    f/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/experta/matchers/rete/abstract.py__init__zNode.__init__
   s        c                      y)z,Add a child to `self.children` if necessary.N )r   childcallbacks      r   	add_childzNode.add_child        	r   c                     t         j                  j                  d|        | j                          | j                  D ]  }|j
                  j                           y)z.Reset itself and recursively all its children.zNode <%s> resetN)r   MATCHERdebugr	   r   nodereset)r   r   s     r   r   z
Node.reset   sE    0$7]] 	EJJ	r   c                      y)zReset this node's memory.Nr   r
   s    r   r	   zNode._reset   r   r   c                 .    | j                   j                  S N	__class____name__r
   s    r   __str__zNode.__str__        ~~&&&r   N)r   
__module____qualname____doc__r   abcabstractmethodr   r   r	   r    r   r   r   r   r      sH    
 	  	 'r   r   )	metaclassc                   :    e Zd ZdZd Zej                  d        Zy)OneInputNodez%Nodes which only have one input port.c                     t        j                  dd      r!t         j                  j                  d| |       | j	                  |j                               S )z<Make a copy of the received token and call `self._activate`.r   DEBUGz!Node <%s> activated with token %r)r   worthr   r   	_activatecopyr   tokens     r   activatezOneInputNode.activate'   sE     >>)W-""3T5B ~~ejjl++r   c                      y)zNode activation routine.Nr   r/   s     r   r-   zOneInputNode._activate0   r   r   N)r   r"   r#   r$   r1   r%   abstractpropertyr-   r   r   r   r)   r)   $   s$    /, 	 r   r)   c                   j    e Zd ZdZd Zej                  d        Zd Zej                  d        Z	d Z
y)TwoInputNodez1Nodes which have two input ports: left and right.c                     t         j                  j                  d| |       | j                  |j	                               S )z<Make a copy of the received token and call `_activate_left`.z&Node <%s> activated left with token %r)r   r   r   _activate_leftr.   r/   s     r   activate_leftzTwoInputNode.activate_left9   s5    4dE	C""5::<00r   c                      y)zNode left activation routine.Nr   r/   s     r   r7   zTwoInputNode._activate_left?   r   r   c                     t         j                  j                  d| |       | j                  |j	                               S )z=Make a copy of the received token and call `_activate_right`.z'Node <%s> activated right with token %r)r   r   r   _activate_rightr.   r/   s     r   activate_rightzTwoInputNode.activate_rightD   s5    5tU	D##EJJL11r   c                      y)zNode right activation routine.Nr   r/   s     r   r;   zTwoInputNode._activate_rightJ   r   r   c                 .    | j                   j                  S r   r   r
   s    r   r    zTwoInputNode.__str__O   r!   r   N)r   r"   r#   r$   r8   r%   r3   r7   r<   r;   r    r   r   r   r5   r5   6   sH    ;1 	 2 	 'r   r5   c                   6    e Zd Zej                  d        Zd Zy)Checkc                      y)a  
        Given a `Fact` or a subclass of `Fact`, return:

            * `True` if the check matched.
            * `False` if the check didn't match.
            * A non empty `Mapping` meaning the check matched and yield
              some context.

        Nr   )r   facts     r   __call__zCheck.__call__T   s     	r   c                 .    | j                   j                  S r   r   r
   s    r   r    zCheck.__str__a   r!   r   N)r   r"   r#   r%   r&   rC   r    r   r   r   r@   r@   S   s    
 
'r   r@   )	r$   r%   expertar   ABCMetar   r)   r5   r@   r   r   r   <module>rG      sF    8 
 'S[[ ':4 $'4 ':'ckk 'r   