Beispiel #1
0
async def mpc_signumsum(input_bits):
    # compute sum and specify placeholder for result
    sec_sum = mpc.sum(input_bits)
    # compute maximum length of binary representation of sum (+1 as int() rounds down)
    bit_len = int(1 + math.log(len(input_bits), 2.0))
    # compute signum -- maximum length of binary representation is provided for better efficiency
    result = mpc.sgn(sec_sum, l=bit_len)
    return result
Beispiel #2
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(secfxp(7.75), senders=0))), 7.75)
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0.5))))
        self.assertEqual(c, [0.0] * 15 + [1.0] + [0.0] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 +
                         [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [0] * 16 + [1] * 15 + [0])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [0] * 16 + [1] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [0] * 31 + [1])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            c = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(c, 2)
            c = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            if f != 64:  # NB: 1 + 2**-64 == 1 in Python
                self.assertEqual(c, 1 + 2**-f)
            self.assertEqual(mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0))), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5))), 1)
            c = mpc.run(
                mpc.output(
                    secfxp(2**(f // 2 - 1) - 0.5) *
                    secfxp(-2**(f // 2) + 0.5)))
            self.assertEqual(c, -2**(f - 1) + 1.5 * 2**(f // 2 - 1) - 0.25)

            s = [10.75, -3.375, 0.125, -0.125]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            a, b, c, d = list(map(secfxp, s))
            t = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([a * a, b * b, c * c, d * d])),
                             t)
            x = [a, b, c, d]
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x[:]))), t)
            t = sum(t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x[:]))), t)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [x], True)[0])), [t])
            u = mpc.unit_vector(secfxp(3), 4)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [u], True)[0])),
                [s[3]])
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([u], [x], True)[0])),
                [s[3]])
            self.assertEqual(
                mpc.run(mpc.output(mpc.gauss([[a]], b, [a], [b])[0])), [0])
            t = [_ for a, b, c, d in [s] for _ in [a + b, a * b, a - b]]
            self.assertEqual(mpc.run(mpc.output([a + b, a * b, a - b])), t)
            t = [
                _ for a, b, c, d in [s]
                for _ in [(a + b)**2, (a + b)**2 + 3 * c]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(a + b)**2, (a + b)**2 + 3 * c])), t)
            t = [_ for a, b, c, d in [s] for _ in [a < b, b < c, c < d]]
            self.assertEqual(mpc.run(mpc.output([a < b, b < c, c < d])), t)
            t = s[0] < s[1] and s[1] < s[2]
            self.assertEqual(mpc.run(mpc.output((a < b) & (b < c))), t)
            t = s[0] < s[1] or s[1] < s[2]
            self.assertEqual(mpc.run(mpc.output((a < b) | (b < c))), t)
            t = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((a < b) ^ (b < c))), t)
            t = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(a < b) ^ b < c)), t)
            t = [s[0] > 1, 10 * s[1] < 5, 10 * s[0] == 5]
            self.assertEqual(
                mpc.run(mpc.output([a > 1, 10 * b < 5, 10 * a == 5])), t)

            s[3] = -0.120
            d = secfxp(s[3])
            t = s[3] / 0.25
            self.assertAlmostEqual(mpc.run(mpc.output(d / 0.25)),
                                   t,
                                   delta=2**(1 - f))
            t = round(s[3] / s[2] + s[0])
            self.assertEqual(round(mpc.run(mpc.output(d / c + a))), t)
            t = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(
                ((a + b)**2 + 3 * c) / c)),
                                   t,
                                   delta=2**(8 - f))
            t = 1 / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(1 / d)),
                                   t,
                                   delta=2**(6 - f))
            t = s[2] / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(c / d)),
                                   t,
                                   delta=2**(3 - f))
            t = -s[3] / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(-d / c)),
                                   t,
                                   delta=2**(3 - f))

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(+a))), s[0] > 0)
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-a))), -(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)
            self.assertEqual(mpc.run(mpc.output(abs(secfxp(-1.5)))), 1.5)

            self.assertEqual(mpc.run(mpc.output(mpc.min(a, b, c, d))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(a, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, b))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, b, c, d))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, b))), max(0, s[1]))
            self.assertEqual(
                mpc.run(mpc.output(list(mpc.min_max(a, b, c, d)))),
                [min(s), max(s)])
            self.assertEqual(mpc.run(mpc.output(mpc.argmin([a, b, c, d])[0])),
                             1)
            self.assertEqual(
                mpc.run(mpc.output(mpc.argmin([a, b], key=operator.neg)[1])),
                max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.argmax([a, b, c, d])[0])),
                             0)
            self.assertEqual(
                mpc.run(mpc.output(mpc.argmax([a, b], key=operator.neg)[1])),
                min(s))

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(2**-f) % 2**(1 - f))),
                             2**-f)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 * 2**-f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
Beispiel #3
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for non-empty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 + [
            float(b) for b in [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 15 + [0]])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 16])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [float(b) for b in [0] * 31 + [1]])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            d = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(d.frac_length, f)
            self.assertEqual(d, 2)
            d = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            f == 64 or self.assertEqual(
                d, 1 + 2**-f)  # NB: 1 + 2**-64 == 1 in Python
            d = mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0)))
            self.assertEqual(d, 1)
            d = mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5)))
            self.assertEqual(d, 1)

            s = [10.7, -3.4, 0.1, -0.11]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            x, y, z, w = list(map(secfxp, s))
            s2 = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([x * x, y * y, z * z, w * w])),
                             s2)
            self.assertEqual(
                mpc.run(mpc.output(mpc.schur_prod([x, y, z, w],
                                                  [x, y, z, w]))), s2)
            s2 = [_ for x, y, z, w in [s] for _ in [x + y, x * y, x - y]]
            self.assertEqual(mpc.run(mpc.output([x + y, x * y, x - y])), s2)
            s2 = [
                _ for x, y, z, w in [s]
                for _ in [(x + y)**2, (x + y)**2 + 3 * z]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(x + y)**2, (x + y)**2 + 3 * z])), s2)
            s2 = [int(_) for x, y, z, w in [s] for _ in [x < y, y < z, z < w]]
            self.assertEqual(mpc.run(mpc.output([x < y, y < z, z < w])), s2)
            s2 = int(s[0] < s[1] and s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((x < y) & (y < z))), s2)
            s2 = int(s[0] < s[1] or s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((x < y) | (y < z))), s2)
            s2 = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((x < y) ^ (y < z))), s2)
            s2 = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(x < y) ^ y < z)), s2)
            s2 = [int(s[0] < 1), int(10 * s[1] < 5), int(10 * s[0] == 5)]
            self.assertEqual(
                mpc.run(mpc.output([x < 1, 10 * y < 5, 10 * x == 5])), s2)

            s[3] = -0.120
            w = secfxp(s[3])
            for _ in range(3):
                s2 = s[3] / s[2] + s[0]
                self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)).signed(),
                                       s2,
                                       delta=1)
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)),
                                       ss2,
                                       delta=1)
                s2 = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
                self.assertAlmostEqual(mpc.run(
                    mpc.output(((x + y)**2 + 3 * z) / z)).signed(),
                                       s2,
                                       delta=2)
                s2 = 1 / s[3]
                self.assertAlmostEqual((mpc.run(mpc.output(1 / w))).signed(),
                                       s2,
                                       delta=1)
                s2 = s[2] / s[3]
                self.assertAlmostEqual(mpc.run(mpc.output(z / w)).signed(),
                                       s2,
                                       delta=1)
                s2 = -s[3] / s[2]
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(-w / z)),
                                       ss2,
                                       delta=1)
                s2 = s[2] / s[3]
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(w / z)),
                                       ss2,
                                       delta=1)

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(x))), int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-x))), -int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)

            self.assertEqual(mpc.run(mpc.output(mpc.min(x, y, w, z))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(x, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, y))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(x, y, w, z))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(x, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, y))), max(0, s[1]))

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1 * (2**f))
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))),
                             0 * (2**f))
            self.assertEqual(
                mpc.run(mpc.output(secfxp(1 / 2**f) % 2**(1 - f))), 1)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 / 2**f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
Beispiel #4
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0.5))))
        self.assertEqual(c, [0.0] * 15 + [1.0] + [0.0] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 + [
            float(b) for b in [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 15 + [0]])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 16])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [float(b) for b in [0] * 31 + [1]])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            c = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(c.frac_length, f)
            self.assertEqual(c, 2)
            c = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            if f != 64:  # NB: 1 + 2**-64 == 1 in Python
                self.assertEqual(c, 1 + 2**-f)
            self.assertEqual(mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0))), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5))), 1)

            s = [10.7, -3.4, 0.1, -0.11]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            a, b, c, d = list(map(secfxp, s))
            t = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([a * a, b * b, c * c, d * d])),
                             t)
            x = [a, b, c, d]
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x[:]))), t)
            t = sum(t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x[:]))), t)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [x], True)[0])), [t])
            t = [_ for a, b, c, d in [s] for _ in [a + b, a * b, a - b]]
            self.assertEqual(mpc.run(mpc.output([a + b, a * b, a - b])), t)
            t = [
                _ for a, b, c, d in [s]
                for _ in [(a + b)**2, (a + b)**2 + 3 * c]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(a + b)**2, (a + b)**2 + 3 * c])), t)
            t = [int(_) for a, b, c, d in [s] for _ in [a < b, b < c, c < d]]
            self.assertEqual(mpc.run(mpc.output([a < b, b < c, c < d])), t)
            t = int(s[0] < s[1] and s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((a < b) & (b < c))), t)
            t = int(s[0] < s[1] or s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((a < b) | (b < c))), t)
            t = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((a < b) ^ (b < c))), t)
            t = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(a < b) ^ b < c)), t)
            t = [int(s[0] > 1), int(10 * s[1] < 5), int(10 * s[0] == 5)]
            self.assertEqual(
                mpc.run(mpc.output([a > 1, 10 * b < 5, 10 * a == 5])), t)

            s[3] = -0.120
            d = secfxp(s[3])
            t = s[3] / 0.25
            self.assertAlmostEqual(mpc.run(mpc.output(d / 0.25)).signed(),
                                   t,
                                   delta=1)
            t = s[3] / s[2] + s[0]
            self.assertAlmostEqual(mpc.run(mpc.output(d / c + a)).signed(),
                                   t,
                                   delta=1)
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(d / c + a)), t, delta=1)
            t = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(
                ((a + b)**2 + 3 * c) / c)).signed(),
                                   t,
                                   delta=2)
            t = 1 / s[3]
            self.assertAlmostEqual((mpc.run(mpc.output(1 / d))).signed(),
                                   t,
                                   delta=1)
            t = s[2] / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(c / d)).signed(),
                                   t,
                                   delta=1)
            t = -s[3] / s[2]
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(-d / c)), t, delta=1)
            t = s[2] / s[3]
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(d / c)), t, delta=1)

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(+a))), int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-a))), -int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)
            self.assertEqual(mpc.run(mpc.output(abs(secfxp(-1.5)))), 1.5)

            self.assertEqual(mpc.run(mpc.output(mpc.min(a, b, c, d))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(a, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, b))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, b, c, d))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, b))), max(0, s[1]))
            self.assertEqual(
                mpc.run(mpc.output(list(mpc.min_max(a, b, c, d)))),
                [min(s), max(s)])

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(2**-f) % 2**(1 - f))),
                             2**-f)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 * 2**-f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
Beispiel #5
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        f = 16
        d = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
        self.assertEqual(d.frac_length, f)
        self.assertEqual(d, 2 * 2**f)
        d = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
        self.assertEqual(d, 1 + 2**f)

        s = [10.7, -3.4, 0.1, -0.11]
        ss = [round(v * (1 << f)) for v in s]
        self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), ss)

        s = [10.5, -3.25, 0.125, -0.125]
        x, y, z, w = list(map(secfxp, s))
        s2 = [v * v for v in s]
        ss2 = [round(v * (1 << f)) for v in s2]
        self.assertEqual(mpc.run(mpc.output([x * x, y * y, z * z, w * w])),
                         ss2)
        s2 = [s[0] + s[1], s[0] * s[1], s[0] - s[1]]
        ss2 = [round(v * (1 << f)) for v in s2]
        self.assertEqual(mpc.run(mpc.output([x + y, x * y, x - y])), ss2)
        s2 = [(s[0] + s[1])**2, (s[0] + s[1])**2 + 3 * s[2]]
        ss2 = [round(v * (1 << f)) for v in s2]
        self.assertEqual(mpc.run(mpc.output([(x + y)**2, (x + y)**2 + 3 * z])),
                         ss2)

        ss2 = [int(s[i] < s[i + 1]) * (1 << f) for i in range(len(s) - 1)]
        self.assertEqual(mpc.run(mpc.output([x < y, y < z, z < w])), ss2)
        ss2 = int(s[0] < s[1] and s[1] < s[2]) * (1 << f)
        self.assertEqual(mpc.run(mpc.output((x < y) & (y < z))), ss2)
        ss2 = int(s[0] < s[1] or s[1] < s[2]) * (1 << f)
        self.assertEqual(mpc.run(mpc.output((x < y) | (y < z))), ss2)
        ss2 = (int(s[0] < s[1]) ^ int(s[1] < s[2])) * (1 << f)
        self.assertEqual(mpc.run(mpc.output((x < y) ^ (y < z))), ss2)
        ss2 = (int(not s[0] < s[1]) ^ int(s[1] < s[2])) * (1 << f)
        self.assertEqual(mpc.run(mpc.output(~(x < y) ^ y < z)), ss2)
        s2 = [s[0] < 1, 10 * s[1] < 5, 10 * s[0] == 5]
        ss2 = [round(v * (1 << f)) for v in s2]
        self.assertEqual(mpc.run(mpc.output([x < 1, 10 * y < 5, 10 * x == 5])),
                         ss2)

        s[3] = -0.120
        w = secfxp(s[3])
        for _ in range(3):
            s2 = s[3] / s[2] + s[0]
            self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)).signed(),
                                   s2,
                                   delta=1)
            ss2 = round(s2 * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)),
                                   ss2,
                                   delta=1)
            s2 = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(
                ((x + y)**2 + 3 * z) / z)).signed(),
                                   s2,
                                   delta=2)
            s2 = 1 / s[3]
            self.assertAlmostEqual((mpc.run(mpc.output(1 / w))).signed(),
                                   s2,
                                   delta=1)
            s2 = s[2] / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(z / w)).signed(),
                                   s2,
                                   delta=1)
            s2 = -s[3] / s[2]
            ss2 = round(s2 * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(-w / z)), ss2, delta=1)
            s2 = s[2] / s[3]
            ss2 = round(s2 * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(w / z)), ss2, delta=1)

        a = mpc._norm(w)

        self.assertEqual(mpc.run(mpc.output(mpc.sgn(x))),
                         int(s[0] > 0) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.sgn(-x))),
                         -int(s[0] > 0) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)

        ss2 = round(min(s) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.min(x, y, w, z))), ss2)
        ss2 = round(min(s[0], 0) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.min(x, 0))), ss2)
        ss2 = round(min(0, s[1]) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.min(0, y))), ss2)
        ss2 = round(max(s) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.max(x, y, w, z))), ss2)
        ss2 = round(max(s[0], 0) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.max(x, 0))), ss2)
        ss2 = round(max(0, s[1]) * (1 << f))
        self.assertEqual(mpc.run(mpc.output(mpc.max(0, y))), ss2)

        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secfxp(1)))), 0 * (2**f))
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secfxp(1 / 2**f)))),
                         1 * (2**f))
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secfxp(2 / 2**f)))),
                         0 * (2**f))
Beispiel #6
0
async def signumsum(input_bits):
    # compute sum and specify placeholder for result
    sec_sum = mpc.sum(input_bits)

    result = mpc.sgn(sec_sum)
    return result