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