def match(self, otherchunk, partialmatching, mismatch_penalty=1): """ Check partial match (given bound variables in boundvars). """ similarity = 0 if self == otherchunk: return similarity #below starts the check that self is proper part of otherchunk. __emptyvalue is ignored. 4 cases have to be checked separately, =x, ~=x, !1, ~!1. Also, variables and their values have to be saved in boundvars. When self is not part of otherchunk the loop adds to (dis)similarity. for x in self: try: matching_val = getattr(otherchunk.actrchunk, x[0] + "_") #get the value of attr except AttributeError: matching_val = None #if it is missing, it must be None try: if matching_val.typename == utilities.VARVAL: matching_val = matching_val.values #the value might be written using _variablesvalues chunk; in that case, get it out except AttributeError: pass varval = utilities.splitting(x[1], empty=False) #checking variables, e.g., =x if varval["variables"] != self.__emptyvalue and varval["variables"]: #if matching_val == self.__emptyvalue: # similarity -= 1 #these two lines would require that variables are matched only to existing values; uncomment if you want that for var in varval["variables"]: for each in self.boundvars.get("~=" + var, set()): if each == matching_val: if partialmatching: similarity += utilities.get_similarity( self._similarities, each, matching_val, mismatch_penalty ) #False if otherchunk's value among the values of ~=x else: return False try: if self.boundvars["=" + var] != matching_val: if partialmatching: similarity += utilities.get_similarity( self._similarities, self.boundvars["=" + var], matching_val, mismatch_penalty ) #False if =x does not match otherchunks' value else: return False except KeyError: self.boundvars.update({ "=" + var: matching_val }) #if boundvars lack =x, update and proceed #checking negvariables, e.g., ~=x if varval["negvariables"] != self.__emptyvalue and varval[ "negvariables"]: for var in varval["negvariables"]: try: if self.boundvars["=" + var] == matching_val: if partialmatching: similarity += utilities.get_similarity( self._similarities, self.boundvars["=" + var], matching_val, mismatch_penalty ) #False if =x does not match otherchunks' value else: return False except KeyError: pass self.boundvars.setdefault("~=" + var, set([])).add(matching_val) #checking values, e.g., 10 or !10 if varval["values"]: val = varval["values"].pop() if val != None and val != matching_val: #None is the misssing value of the attribute if partialmatching: similarity += utilities.get_similarity( self._similarities, val, matching_val, mismatch_penalty) else: return False #checking negvalues, e.g., ~!10 if varval["negvalues"]: for negval in varval["negvalues"]: if negval == matching_val or ( negval in {self.__emptyvalue, 'None'} and matching_val == self.__emptyvalue): if partialmatching: similarity += utilities.get_similarity( self._similarities, negval, matching_val, mismatch_penalty) else: return False if partialmatching: return similarity else: return True
def match(self, otherchunk, partialmatching, mismatch_penalty=1): """ Check partial match (given bound variables in boundvars). """ similarity = 0 if self == otherchunk: return similarity #below starts the check that self is proper part of otherchunk. __emptyvalue is ignored. 4 cases have to be checked separately, =x, ~=x, !1, ~!1. Also, variables and their values have to be saved in boundvars. When self is not part of otherchunk the loop adds to (dis)similarity. for x in self: try: matching_val = getattr(otherchunk.actrchunk, x[0] + "_") #get the value of attr except AttributeError: matching_val = None #if it is missing, it must be None if isinstance(matching_val, utilities.VarvalClass): matching_val = matching_val.values #the value might be written using _variablesvalues namedtuple; in that case, get it out varval = utilities.splitting(x[1]) #checking variables, e.g., =x if varval.variables: #if matching_val == self.__emptyvalue: # similarity -= 1 #these two lines would require that variables are matched only to existing values; uncomment if you want that var = varval.variables for each in self.boundvars.get("~=" + var, set()): if each == matching_val: if partialmatching: similarity += utilities.get_similarity(self._similarities, each, matching_val, mismatch_penalty) #False if otherchunk's value among the values of ~=x else: return False try: if self.boundvars["=" + var] != matching_val: if partialmatching: similarity += utilities.get_similarity(self._similarities, self.boundvars["=" + var], matching_val, mismatch_penalty) #False if =x does not match otherchunks' value else: return False except KeyError: self.boundvars.update({"=" + var: matching_val}) #if boundvars lack =x, update and proceed #checking negvariables, e.g., ~=x if varval.negvariables: for var in varval.negvariables: try: if self.boundvars["=" + var] == matching_val: if partialmatching: similarity += utilities.get_similarity(self._similarities, self.boundvars["=" + var], matching_val, mismatch_penalty) #False if =x does not match otherchunks' value else: return False except KeyError: pass self.boundvars.setdefault("~=" + var, set([])).add(matching_val) #checking values, e.g., 10 or !10 if varval.values: val = varval.values if val != None and val != matching_val: #None is the missing value of the attribute if partialmatching: similarity += utilities.get_similarity(self._similarities, val, matching_val, mismatch_penalty) else: return False #checking negvalues, e.g., ~!10 if varval.negvalues: for negval in varval.negvalues: if negval == matching_val or (negval in {self.__emptyvalue, 'None'} and matching_val == self.__emptyvalue): if partialmatching: similarity += utilities.get_similarity(self._similarities, negval, matching_val, mismatch_penalty) else: return False if partialmatching: return similarity else: return True