def addNode(self, node):
     from builtins import builtinp
     if node not in self.nodes:
         self.nodes.append(node)
         # Only index the non-builtins for sorting (since we want to make sure
         # builtins appear at the end
         if not builtinp(node) and not isListVarNode(node):
             for v in node.vars:
                 if v not in self.sharedIndex:
                     self.sharedIndex[v] = [node]
                 else:
                     self.sharedIndex[v].append(node)
Ejemplo n.º 2
0
 def addNode(self, node):
     from builtins import builtinp
     if node not in self.nodes:
         self.nodes.append(node)
         # Only index the non-builtins for sorting (since we want to make sure
         # builtins appear at the end
         if not builtinp(node) and not isListVarNode(node):                
             for v in node.vars:
                 if v not in self.sharedIndex:
                     self.sharedIndex[v] = [node]
                 else:
                     self.sharedIndex[v].append(node)
    def join(self, useBindings=False):
        """
        print "\n\n"
        print "self key:", self.getkey()
        print "join left:", self.lnode.pattern
        #for row in keysToList(self.lnode.ind):
        #    print "left row",row[0]        
            
        print "memory size of left node:", len(keysToList(self.lnode.ind))
        print "left key:", self.lnode.getkey()

        
        print ""
        print "join right:", self.rnode.pattern
       # for row in keysToList(self.rnode.ind):
        #    print "right row",row[0]
        print "memory size of right node:", len(keysToList(self.rnode.ind))
        print "right key:", self.rnode.getkey()
        
        
        switched = False
        t = time.time()        
        if len(keysToList(self.rnode.ind)) < len(keysToList(self.lnode.ind)):
            print "switched"
            switched = True

        print "keysToList time:", time.time() - t        """

        from builtins import builtinp
        if self.lnode == self.rnode:
            from builtins import builtinp, funcBuiltinp
            if builtinp(self.lnode):
                self.builtinInput = self.lnode.getInputNode()
                #problem is, here builtin input is empty
                return self.evalBuiltins(returnBindings=useBindings)
            else:
                self.pattern = self.lnode.vars
                if self.lnode.ind:
                    return keysToList(self.lnode.ind)
                else:
                    return []
        elif self.hasBuiltins():
            return self.evalBuiltins(returnBindings=useBindings)
        else:
            #right node is always an alpha node,
            #left one is an alphanode in the first join, beta node aftewards

            #compare the memory of both nodes, we want the smaller one to the left
            #

            if isListVarNode(self.rnode):

                rows = keysToList(self.lnode.ind)

                for row in rows:
                    row = row[0]
                    #print "rows:", row
                    #print "left node key:", self.lnode.getkey()
                    #left node key does not correspond to the bindings

                    #bindings =  self.lnode.getbindings(row)
                    #get the bindings according to its own key, above line didnt work
                    bindings = dict()
                    key = self.getkey()
                    try:
                        for i, v in enumerate(key):
                            bindings[v] = row[i]
                    except:
                        print "bindings=%s" % bindings
                        print "row=%s" % row
                        print "v=%s" % v
                        print "i=%s" % i
                        raise

                    #copy the values for the variable in pattern.o
                    if self.rnode.pattern.o in bindings:
                        #copy it back to the original node - easiest way is to add it as a fact
                        #also add bindings for the bnodes in subj
                        for var in self.rnode.vars:
                            if isinstance(var, Exivar):
                                self.rnode.add(
                                    Fact(convertBNodeToFact(var),
                                         self.rnode.pattern.p,
                                         bindings[self.rnode.pattern.o]))
                                #print "fact added:",convertBNodeToFact(var), self.rnode.pattern.p, bindings[self.rnode.pattern.o]

                    elif isinstance(self.rnode.pattern.s, Exivar):
                        print "something wrong happened - %s was supposed to be bound", self.rnode.pattern.s

            if isinstance(self.lnode, AlphaNode):
                key = self.lnode.svars
            elif isinstance(self.lnode, BetaNode):

                if not Set(self.lnode.vars).intersection(Set(self.rnode.vars)):
                    key = list()
                else:
                    #regenerate key here? was using self.svars before but was buggy
                    key = self.getSharedVars(self.lnode, self.rnode)

            joinResults = list()
            if not key:
                #no shared variables and no matched values, so store and return the union
                #of the two memories
                """if switched:
                    leftMemory = keysToList(self.rnode.ind)
                    rightMemory = keysToList(self.lnode.ind)
                else:"""
                leftMemory = keysToList(self.lnode.ind)
                rightMemory = keysToList(self.rnode.ind)

                for lm, ljust in leftMemory:
                    for rm, rjust in rightMemory:
                        """if switched:
                            row =  rm + lm
                        else:"""
                        row = lm + rm
                        joinResults.append([row, []])
                        ####NOTE -- Need to add justification (proof tracing) for this case
                        self.add(row, [])
            else:
                t = time.time()
                """if switched:
                    joinResults = self.joinhelper(self.rnode.ind, self.lnode.ind, key, [], [], switched)
                else:"""
                joinResults = self.joinhelper(self.lnode.ind, self.rnode.ind,
                                              key, [], [])
                print "joinhelper time:", time.time() - t

            return joinResults
Ejemplo n.º 4
0
    def join(self, useBindings=False):

        """
        print "\n\n"
        print "self key:", self.getkey()
        print "join left:", self.lnode.pattern
        #for row in keysToList(self.lnode.ind):
        #    print "left row",row[0]        
            
        print "memory size of left node:", len(keysToList(self.lnode.ind))
        print "left key:", self.lnode.getkey()

        
        print ""
        print "join right:", self.rnode.pattern
       # for row in keysToList(self.rnode.ind):
        #    print "right row",row[0]
        print "memory size of right node:", len(keysToList(self.rnode.ind))
        print "right key:", self.rnode.getkey()
        
        
        switched = False
        t = time.time()        
        if len(keysToList(self.rnode.ind)) < len(keysToList(self.lnode.ind)):
            print "switched"
            switched = True

        print "keysToList time:", time.time() - t        """
                
        
        from builtins import builtinp                    
        if self.lnode == self.rnode:        
            from builtins import builtinp, funcBuiltinp        
            if builtinp(self.lnode):            
                self.builtinInput = self.lnode.getInputNode()
                #problem is, here builtin input is empty
                return self.evalBuiltins(returnBindings=useBindings)                  
            else:
                self.pattern = self.lnode.vars
                if self.lnode.ind:
                    return keysToList(self.lnode.ind)
                else:
                    return []        
        elif self.hasBuiltins():            
            return self.evalBuiltins(returnBindings=useBindings)
        else:
            #right node is always an alpha node,
            #left one is an alphanode in the first join, beta node aftewards

            #compare the memory of both nodes, we want the smaller one to the left
            #
            
            if isListVarNode(self.rnode):                
                
                rows = keysToList(self.lnode.ind)
                
                for row in rows:
                    row = row[0]
                    #print "rows:", row
                    #print "left node key:", self.lnode.getkey()
                    #left node key does not correspond to the bindings
                    
                    #bindings =  self.lnode.getbindings(row)
                    #get the bindings according to its own key, above line didnt work
                    bindings = dict()
                    key = self.getkey()
                    try:
                        for i, v in enumerate(key):
                            bindings[v] = row[i]
                    except:
                        print "bindings=%s" % bindings
                        print "row=%s" % row
                        print "v=%s" % v
                        print "i=%s" % i
                        raise

                    #copy the values for the variable in pattern.o
                    if self.rnode.pattern.o in bindings:                    
                        #copy it back to the original node - easiest way is to add it as a fact
                        #also add bindings for the bnodes in subj
                        for var in self.rnode.vars:
                            if isinstance(var, Exivar):                                
                                self.rnode.add(Fact(convertBNodeToFact(var), self.rnode.pattern.p, bindings[self.rnode.pattern.o]))
                                #print "fact added:",convertBNodeToFact(var), self.rnode.pattern.p, bindings[self.rnode.pattern.o]
                    
                    elif isinstance(self.rnode.pattern.s, Exivar):
                        print "something wrong happened - %s was supposed to be bound", self.rnode.pattern.s
                        
                               
            if isinstance(self.lnode, AlphaNode):
                key = self.lnode.svars                                
            elif isinstance(self.lnode, BetaNode):
                
                if not Set(self.lnode.vars).intersection(Set(self.rnode.vars)):
                    key = list()
                else:
                    #regenerate key here? was using self.svars before but was buggy
                    key = self.getSharedVars(self.lnode, self.rnode)
                    
                    
            joinResults = list()
            if not key:
                #no shared variables and no matched values, so store and return the union
                #of the two memories
                """if switched:
                    leftMemory = keysToList(self.rnode.ind)
                    rightMemory = keysToList(self.lnode.ind)
                else:"""
                leftMemory = keysToList(self.lnode.ind)
                rightMemory = keysToList(self.rnode.ind)
                    
                for lm, ljust in leftMemory:
                    for rm, rjust in rightMemory:                        
                        """if switched:
                            row =  rm + lm
                        else:"""
                        row = lm + rm
                        joinResults.append([row, []])
                        ####NOTE -- Need to add justification (proof tracing) for this case
                        self.add(row, [])
            else:
                t = time.time()
                """if switched:
                    joinResults = self.joinhelper(self.rnode.ind, self.lnode.ind, key, [], [], switched)
                else:"""
                joinResults = self.joinhelper(self.lnode.ind, self.rnode.ind, key, [], [])
                print "joinhelper time:", time.time() - t        
            
            return joinResults