@Override public DRes<Vector<DRes<SReal>>> input(Vector<BigDecimal> a, int inputParty) { return builder.par(par -> { Vector<DRes<SReal>> matrix = a.stream().map(e -> par.realNumeric().input(e, inputParty)) .collect(Collectors.toCollection(Vector::new)); return () -> matrix; }); }
@Override public DRes<SReal> innerProductWithPublicPart(List<BigDecimal> a, List<DRes<SReal>> b) { return builder.par(r1 -> { if (a.size() != b.size()) { throw new IllegalArgumentException("Vectors must have same size"); } List<DRes<SReal>> products = new ArrayList<>(a.size()); for (int i = 0; i < a.size(); i++) { products.add(r1.realNumeric().mult(a.get(i), b.get(i))); } return () -> products; }).seq((seq, list) -> { return seq.realAdvanced().sum(list); }); }
@Override public DRes<SReal> innerProduct(List<DRes<SReal>> a, List<DRes<SReal>> b) { return builder.par(par -> { if (a.size() != b.size()) { throw new IllegalArgumentException("Vectors must have same size"); } List<DRes<SReal>> products = new ArrayList<>(a.size()); for (int i = 0; i < a.size(); i++) { products.add(par.realNumeric().mult(a.get(i), b.get(i))); } return () -> products; }).seq((seq, list) -> { return seq.realAdvanced().sum(list); }); }
@Override public DRes<Vector<DRes<BigDecimal>>> openVector(DRes<Vector<DRes<SReal>>> a) { return builder.par(par -> { Vector<DRes<BigDecimal>> vector = a.out().stream().map(e -> par.realNumeric().open(e)) .collect(Collectors.toCollection(Vector::new)); return () -> vector; }); }
@Override public DRes<Matrix<DRes<SReal>>> input(Matrix<BigDecimal> a, int inputParty) { return builder.par(par -> { Matrix<DRes<SReal>> matrix = new Matrix<>(a.getHeight(), a.getWidth(), i -> new ArrayList<>(a.getRow(i).stream() .map(e -> par.realNumeric().input(e, inputParty)).collect(Collectors.toList()))); return () -> matrix; }); }
@Override public void test() throws Exception { Application<BigDecimal, ProtocolBuilderNumeric> app = producer -> { List<DRes<SReal>> closed = openInputs.stream().map(producer.realNumeric()::known).collect(Collectors.toList()); return producer.realNumeric().open(producer.realAdvanced().sum(closed)); }; BigDecimal output = runApplication(app); RealTestUtils .assertEqual(expectedOutput, output, DEFAULT_PRECISION); } };
@Override public DRes<Matrix<DRes<BigDecimal>>> openMatrix(DRes<Matrix<DRes<SReal>>> a) { return builder.par(par -> { Matrix<DRes<BigDecimal>> matrix = new Matrix<>(a.out().getHeight(), a.out().getWidth(), i -> new ArrayList<>(a.out().getRow(i).stream().map(e -> par.realNumeric().open(e)) .collect(Collectors.toList()))); return () -> matrix; }); }
@Override public void test() { Application<List<BigDecimal>, ProtocolBuilderNumeric> app = producer -> { List<DRes<SReal>> inputs = value.stream().map(producer.realNumeric()::known).collect(Collectors.toList()); List<DRes<BigDecimal>> opened = inputs.stream().map(producer.realNumeric()::open).collect(Collectors.toList()); return () -> opened.stream().map(DRes::out).collect(Collectors.toList()); }; List<BigDecimal> output = runApplication(app); RealTestUtils.assertEqual(value, output, DEFAULT_PRECISION + 1); } };
@Override public void test() { Application<List<BigDecimal>, ProtocolBuilderNumeric> app = producer -> { List<DRes<SReal>> inputs = value.stream().map(x -> producer.realNumeric().input(x, 1)) .collect(Collectors.toList()); List<DRes<BigDecimal>> opened = inputs.stream().map(producer.realNumeric()::open).collect(Collectors.toList()); return () -> opened.stream().map(DRes::out).collect(Collectors.toList()); }; List<BigDecimal> output = runApplication(app); RealTestUtils.assertEqual(value, output, DEFAULT_PRECISION + 1); } };
@Override public DRes<Matrix<DRes<SReal>>> scale(DRes<SReal> s, Matrix<BigDecimal> a) { return builder.par(par -> { return scale(par, s, a, (builder, x) -> builder.realNumeric().mult(x.getSecond(), x.getFirst())); }); }
@Override public void test() { Application<BigDecimal, ProtocolBuilderNumeric> app = producer -> { DRes<SReal> input = producer.realNumeric().input(value, 1); DRes<SReal> product = producer.realNumeric().div(input, value2); return producer.realNumeric().open(product); }; BigDecimal output = runApplication(app); int precision = DEFAULT_PRECISION - 2 - Math.max(0, RealTestUtils.floorLog2(value) - RealTestUtils.floorLog2(value2)); RealTestUtils.assertEqual(value.divide(value2), output, precision); } };
@Override public void test() { Application<BigDecimal, ProtocolBuilderNumeric> app = producer -> { DRes<SReal> input = producer.realNumeric().input(value, 1); DRes<SReal> product = producer.realNumeric().div(input, value2); return producer.realNumeric().open(product); }; BigDecimal output = runApplication(app); int precision = DEFAULT_PRECISION - 2 - Math.max(0, RealTestUtils.floorLog2(value) - RealTestUtils.floorLog2(value2)); RealTestUtils.assertEqual(value.divide(value2), output, precision); } };
@Override public DRes<Matrix<DRes<SReal>>> scale(BigDecimal s, DRes<Matrix<DRes<SReal>>> a) { return builder.par(par -> { return scale(par, s, a.out(), (builder, x) -> builder.realNumeric().mult(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> add(Matrix<BigDecimal> a, DRes<Matrix<DRes<SReal>>> b) { return builder.par(par -> { return entrywiseBinaryOperator(par, a, b.out(), (builder, x) -> builder.realNumeric().add(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> sub(Matrix<BigDecimal> a, DRes<Matrix<DRes<SReal>>> b) { return builder.par(par -> { return entrywiseBinaryOperator(par, a, b.out(), (builder, x) -> builder.realNumeric().sub(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> sub(DRes<Matrix<DRes<SReal>>> a, Matrix<BigDecimal> b) { return builder.par(par -> { return entrywiseBinaryOperator(par, a.out(), b, (builder, x) -> builder.realNumeric().sub(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> scale(DRes<SReal> s, DRes<Matrix<DRes<SReal>>> a) { return builder.par(par -> { return scale(par, s, a.out(), (builder, x) -> builder.realNumeric().mult(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> sub(DRes<Matrix<DRes<SReal>>> a, DRes<Matrix<DRes<SReal>>> b) { return builder.par(par -> { return entrywiseBinaryOperator(par, a.out(), b.out(), (builder, x) -> builder.realNumeric().sub(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Matrix<DRes<SReal>>> add(DRes<Matrix<DRes<SReal>>> a, DRes<Matrix<DRes<SReal>>> b) { return builder.par(par -> { return entrywiseBinaryOperator(par, a.out(), b.out(), (builder, x) -> builder.realNumeric().add(x.getFirst(), x.getSecond())); }); }
@Override public void test() { Application<BigDecimal, ProtocolBuilderNumeric> app = producer -> { DRes<SReal> input = producer.realNumeric().input(value, 1); return producer.realNumeric().open(input, 1); }; BigDecimal output = runApplication(app); if (conf.getMyId() == 1) { RealTestUtils.assertEqual(value, output, DEFAULT_PRECISION + 1); } else { Assert.assertNull(output); } } };