1from . import BooleSet, interpolate_smallest_lex 2 3 4class PartialFunction(object): 5 """docstring for PartialFunction""" 6 7 def __init__(self, zeros, ones): 8 super(PartialFunction, self).__init__() 9 self.zeros = zeros.set() 10 self.ones = ones.set() 11 12 def interpolate_smallest_lex(self): 13 return interpolate_smallest_lex(self.zeros, self.ones) 14 15 def __str__(self): 16 return "PartialFunction(zeros=" + str(self.zeros) + ", ones=" + str( 17 self.ones) + ")" 18 19 def definedOn(self): 20 return self.zeros.union(self.ones) 21 22 def __add__(self, other): 23 domain = self.definedOn().intersect(other.definedOn()) 24 zeros = self.zeros.intersect(other.zeros).union(self.ones.intersect( 25 other.ones)) 26 ones = self.zeros.intersect(other.ones).union(self.ones.intersect( 27 other.zeros)) 28 assert zeros.diff(domain).empty() 29 assert ones.diff(domain).empty() 30 return PartialFunction(zeros, ones) 31 32 def __repr__(self): 33 return str(self) 34 35 def __mul__(self, other): 36 zeros = self.zeros.union(other.zeros) 37 ones = self.ones.intersect(other.ones) 38 return PartialFunction(zeros, ones) 39 40 def __or__(self, other): 41 zeros = self.zeros.intersect(other.zeros) 42 ones = self.ones.union(other.ones) 43 return PartialFunction(zeros, ones) 44 45 def __xor__(self, other): 46 return self + other 47 48 def __and__(self, other): 49 return self * other 50