def __init__(self, lnode, rnode): from builtins import builtinp self.lnode = lnode self.rnode = rnode #####Make this opaque if isinstance(lnode, BetaNode): self.lvars = lnode.pattern elif isinstance(lnode, AlphaNode): self.lvars = lnode.vars self.rvars = rnode.vars # Detect builtins if isinstance(rnode, AlphaNode): if builtinp(self.rnode): self.svars = lnode.svars else: # store svars in lexical order self.svars = [v for v in self.lvars if v in self.rvars] else: self.svars = [v for v in self.lvars if v in self.rvars] sortVars(self.svars) #destructively sort vars self.parents = list() self.children = list() self.pattern = removedups(self.svars + self.lvars + self.rvars) # Redundant var, will be refactored out self.vars = self.pattern self.builtinInput = None self.ind = Memory() self.inferredFacts = Set() # a pointer to the rule node (which contains the rhs) self.rule = None
def makeBetaNetwork(self, rule, betaNode, alphaNodeList): """I have more than 2 alpha nodes and so I make a network""" length = len(alphaNodeList) if length == 0: betaNode.rule = self.makeRuleNode(rule) betaNode.rule.betaNode = betaNode else: alpha = alphaNodeList[0] betaChild = self.makeBetaNode(betaNode, alpha) # connect our newly created BetaNode to its parent BetaNode, # and connect the parent to its child betaChild.parents = [betaNode] betaNode.children = [betaChild] sharedJoinVars = self.getSharedVars(betaNode, alpha) sortVars(sharedJoinVars) if not builtinp(alpha): # adjust our beta node shared variables betaNode.svars = sharedJoinVars # Our betanode has children, and so set up our # pattern in an order that is conducive to the children JOINs betaNode.pattern = removedups(sharedJoinVars + betaNode.pattern) # connect our AlphaNode to its relevant BetaNode alpha.betaNodes = [betaChild] self.rete.betaNodeStore.addNode(betaNode) self.rete.betaNodeStore.addNode(betaChild) alphaNodeList = alphaNodeList[1:] return self.makeBetaNetwork(rule, betaChild, alphaNodeList)
def __init__(self, pattern): self.pattern = pattern #print "pattern", pattern self.ind = Memory() ###ind=memory, or ind=index self.betaNodes = list() self.vars = [v for v in pattern if isinstance(v, Variable)] sortVars(self.vars) self.svars = list() self.dependents = list() self.dependsOn = list()
def makeBetaNode(self, node1, node2, futureJoins=True): sharedVars = self.getSharedVars(node1, node2) # if our left input is an alpha node, then it has the same shared # variables as our right input if isinstance(node1, AlphaNode): node1.svars = sharedVars sortVars(node1.svars) node2.svars = sharedVars sortVars(node2.svars) # make new BetaNode b = BetaNode(node1, node2) # store the shared variables in our new BetaNode # the shared vars here will be reset if the beta node has beta children b.svars = sharedVars # just add the beta node to the index (which is a flat list), no indexing for now return b