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
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