Beispiel #1
0
    def factory(parent, conds, earlier_conds, builtins, alpha_root):
        
        #assert isinstance(parent, ReteNode), \
        #    "parent non e' un ReteNode"
            
        assert isinstance(earlier_conds, list), \
            "earlier_conds non e' una list"
            
        # costruisce le sotto condizioni della NccCondition
        # come se fossero normali condizioni (e non interne ad una NCC)
        # in modo da poterle condividerle con altre condizioni positive
        # se presenti (o aggiunte in futuro)
        from icse import rete
        last_node = rete.network_factory(alpha_root, parent, conds, earlier_conds, builtins )
        
        assert isinstance(last_node, ReteNode)
                
        # controllo che non sia il primo beta-node
        if parent != None:
            for child in parent.get_children():
                # c'e' gia un figlio che e' un NCC
                # e il cui partner mangia dalla stessa sottorete
                # che rappresenta le condizioni di questa NCC
                if isinstance(child, NccNode) \
                        and child.get_partner().get_parent() == last_node:
                    # la condivido!
                    return child

        # nada, niente da condividere (almeno a livello di NCC)
        
        ncc = NccNode(parent, last_node, len(conds))

        # inserisco i vari riferimenti dei figli nei padri
        parent.append_child(ncc)
        last_node.add_child(ncc.get_partner())

                      
        # completare l'aggiornamento
        # prima devo aggiornare l'NccNode e dopo il partner
        # per evitare che si crei confusione nel buffer nel partner
        
        parent.update(ncc)
        last_node.update(ncc.get_partner())
        
        EventManager.trigger(EventManager.E_NODE_ADDED, ncc)
        EventManager.trigger(EventManager.E_NODE_ADDED, ncc.get_partner())
        EventManager.trigger(EventManager.E_NODE_LINKED, ncc, parent, -1)
        EventManager.trigger(EventManager.E_NODE_LINKED, ncc.get_partner(), ncc)
        EventManager.trigger(EventManager.E_NODE_LINKED, ncc.get_partner(), last_node, -1)        

        #NetworkXGraphWrapper.i().add_node(ncc, parent, -1)
        #NetworkXGraphWrapper.i().add_node(ncc.get_partner(), last_node, -1)
        #NetworkXGraphWrapper.i().add_edge(ncc.get_partner(), ncc)
        
        
        
        return ncc
Beispiel #2
0
    def add_production(self, production):
        '''
        Aggiunge una nuova produzione al network
        (solo se un'altra con lo stesso nome non sia gia
        stata definita, nel qual caso viene restituito
        un riferimento al vecchio PNode)
        @param production: Production
        '''
        
        if self.__rules_map.has_key(production.get_name()):
            import sys
            print >> sys.stderr, "Redefinizione di una regola gia definita: ", production.get_name()
            return self.__rules_map[production.get_name()]
        
        symbols = {}
        last_node = rete.network_factory(self.__alpha_root, None, production.get_lhs(), builtins=symbols)
        
        #from pprint import pprint
        #pprint(symbols, indent=4)
        
        pnode = PNode(last_node,
                      production.get_name(),
                      production.get_rhs(),
                      production.get_properties(),
                      symbols,
                      self,
                      onActive=self.__agenda.insert,
                      onDeactive=self.__agenda.remove,
                      assertFunc=self.assert_fact,
                      retractFunc=self.retract_fact,
                      addProduction=self.add_production,
                      removeProduction=self.remove_production
                )
        assert isinstance(last_node, ReteNode), \
            "last_node non e' un ReteNode"
            
        last_node.add_child(pnode)
        
        last_node.update(pnode)
        
        #NetworkXGraphWrapper.i().add_node(pnode, last_node, -1)
        
        self.__rules_map[production.get_name()] = pnode

        EventManager.trigger( EventManager.E_NODE_ADDED, pnode)
        
        EventManager.trigger( EventManager.E_NODE_LINKED, pnode, last_node, -1)
        
        EventManager.trigger( EventManager.E_RULE_ADDED, production, pnode)
        
        return pnode