def _iter_restrict(self, zeros, ones): """Iterate through indices of all table entries that vary.""" inputs = list(self.inputs) unmapped = dict() for i, v in enumerate(self.inputs): if v.uniqid in zeros: inputs[i] = 0 elif v.uniqid in ones: inputs[i] = 1 else: unmapped[v] = i vs = sorted(unmapped.keys()) for num in range(1 << len(vs)): for v, val in boolfunc.num2point(num, vs).items(): inputs[unmapped[v]] = val yield sum((val << i) for i, val in enumerate(inputs))
def test_num2point(): assert num2point(0x0, [a, b, c, d]) == {a: 0, b: 0, c: 0, d: 0} assert num2point(0x1, [a, b, c, d]) == {a: 1, b: 0, c: 0, d: 0} assert num2point(0x2, [a, b, c, d]) == {a: 0, b: 1, c: 0, d: 0} assert num2point(0x3, [a, b, c, d]) == {a: 1, b: 1, c: 0, d: 0} assert num2point(0x4, [a, b, c, d]) == {a: 0, b: 0, c: 1, d: 0} assert num2point(0x5, [a, b, c, d]) == {a: 1, b: 0, c: 1, d: 0} assert num2point(0x6, [a, b, c, d]) == {a: 0, b: 1, c: 1, d: 0} assert num2point(0x7, [a, b, c, d]) == {a: 1, b: 1, c: 1, d: 0} assert num2point(0x8, [a, b, c, d]) == {a: 0, b: 0, c: 0, d: 1} assert num2point(0x9, [a, b, c, d]) == {a: 1, b: 0, c: 0, d: 1} assert num2point(0xA, [a, b, c, d]) == {a: 0, b: 1, c: 0, d: 1} assert num2point(0xB, [a, b, c, d]) == {a: 1, b: 1, c: 0, d: 1} assert num2point(0xC, [a, b, c, d]) == {a: 0, b: 0, c: 1, d: 1} assert num2point(0xD, [a, b, c, d]) == {a: 1, b: 0, c: 1, d: 1} assert num2point(0xE, [a, b, c, d]) == {a: 0, b: 1, c: 1, d: 1} assert num2point(0xF, [a, b, c, d]) == {a: 1, b: 1, c: 1, d: 1}
def test_num2point(): assert_raises(TypeError, num2point, 1.0, [a, b]) assert_raises(ValueError, num2point, -1, [a, b]) assert_raises(ValueError, num2point, 4, [a, b]) assert num2point(0x0, [a, b, c, d]) == {a: 0, b: 0, c: 0, d: 0} assert num2point(0x1, [a, b, c, d]) == {a: 1, b: 0, c: 0, d: 0} assert num2point(0x2, [a, b, c, d]) == {a: 0, b: 1, c: 0, d: 0} assert num2point(0x3, [a, b, c, d]) == {a: 1, b: 1, c: 0, d: 0} assert num2point(0x4, [a, b, c, d]) == {a: 0, b: 0, c: 1, d: 0} assert num2point(0x5, [a, b, c, d]) == {a: 1, b: 0, c: 1, d: 0} assert num2point(0x6, [a, b, c, d]) == {a: 0, b: 1, c: 1, d: 0} assert num2point(0x7, [a, b, c, d]) == {a: 1, b: 1, c: 1, d: 0} assert num2point(0x8, [a, b, c, d]) == {a: 0, b: 0, c: 0, d: 1} assert num2point(0x9, [a, b, c, d]) == {a: 1, b: 0, c: 0, d: 1} assert num2point(0xA, [a, b, c, d]) == {a: 0, b: 1, c: 0, d: 1} assert num2point(0xB, [a, b, c, d]) == {a: 1, b: 1, c: 0, d: 1} assert num2point(0xC, [a, b, c, d]) == {a: 0, b: 0, c: 1, d: 1} assert num2point(0xD, [a, b, c, d]) == {a: 1, b: 0, c: 1, d: 1} assert num2point(0xE, [a, b, c, d]) == {a: 0, b: 1, c: 1, d: 1} assert num2point(0xF, [a, b, c, d]) == {a: 1, b: 1, c: 1, d: 1}
def satisfy_all(self): for num in self.pcdata.iter_ones(): yield boolfunc.num2point(num, self.inputs)
def satisfy_one(self): num = self.pcdata.find_one() if num is None: return None else: return boolfunc.num2point(num, self.inputs)