def compositionOfBinaryRelations(r1: FS.FuzzySet, r2: FS.FuzzySet): domain1, domain2 = r1.getDomain(), r2.getDomain() """:type: Domain.Domain""" assert domain1.getNumberOfComponents() == 2 and domain2.getNumberOfComponents() == 2 domains1, domains2 = domain1.getDomains(), domain2.getDomains() for i,j in zip(domains1[1], domains2[0]): assert(i == j) X = domains1[0] Y = domains2[1] composition = FS.MutableFuzzySet(DM.CompositeDomain.combine(DM.SimpleDomain([x for x in X]), DM.SimpleDomain([y for y in Y]))) for x in domains1[0]: for z in domains2[1]: mins = [] for y in domains1[1]: mins.append( min(r1.getValueAt((x,y)), r2.getValueAt((y,z))) ) composition.set((x,z), max(mins)) return composition
def isUTimesURelation(set: FS.FuzzySet): domain = set.getDomain() """:type: Domain.Domain""" if domain.getNumberOfComponents() != 2: return False domains = domain.getDomains() for a, b in zip(domains[0], domains[1]): if a != b: return False return True
def isReflexive(set: FS.FuzzySet): if not Relations.isUTimesURelation(set): return False domain = set.getDomain() """:type: Domain.Domain""" domains = domain.getDomains() for i in domains[0]: if set.getValueAt((i, i)) != 1.0: return False return True
def isSymmetric(set: FS.FuzzySet): if not Relations.isUTimesURelation(set): return False domain = set.getDomain() """:type: Domain.Domain""" domains = domain.getDomains() for i in domains[0]: for j in domains[0]: if set.getValueAt((i,j)) != set.getValueAt((j,i)): return False return True
def isMinMaxTransitive(set: FS.FuzzySet): if not Relations.isUTimesURelation(set): return False domain = set.getDomain() """:type: Domain.Domain""" domains = domain.getDomains() for u in domains[0]: for v in domains[0]: tmp = [] for w in domains[0]: tmp.append(min(set.getValueAt((u, w)), set.getValueAt((w, v)))) if set.getValueAt((u, v)) < max(tmp): return False return True