@Override public <T extends DRes<SInt>> DRes<List<DRes<SInt>>> condSelect(DRes<SInt> condition, DRes<List<T>> left, DRes<List<T>> right) { return builder.par(new ConditionalSelectRow<>(condition, left, right)); }
@Override public <T extends DRes<SInt>> DRes<RowPairD<SInt, SInt>> swapIf(DRes<SInt> condition, DRes<List<T>> left, DRes<List<T>> right) { return builder.par(new SwapRowsIf<>(condition, left, right)); }
@Override public <T extends DRes<SInt>> DRes<Matrix<DRes<SInt>>> swapNeighborsIf(DRes<List<T>> conditions, DRes<Matrix<T>> rows) { return builder.par(new SwapNeighborsIf<>(conditions, rows)); }
@Override public <T extends DRes<SInt>> DRes<Matrix<DRes<BigInteger>>> openMatrix( DRes<Matrix<T>> closedMatrix) { return builder.par(new OpenMatrix<>(closedMatrix)); }
@Override public DRes<Pair<DRes<SInt>, DRes<SInt>>> swapIf(DRes<SInt> condition, DRes<SInt> left, DRes<SInt> right) { return builder.par(new SwapIf(condition, left, right)); } }
@Override public DRes<Pair<DRes<BigInteger>, DRes<BigInteger>>> openPair( DRes<Pair<DRes<SInt>, DRes<SInt>>> closedPair) { return builder.par(new OpenPair(closedPair)); }
@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<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>>> 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 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(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<Vector<DRes<SReal>>> vectorMult(Matrix<BigDecimal> a, DRes<Vector<DRes<SReal>>> v) { return builder.par(par -> { return vectorMult(par, a, v.out(), (builder, x) -> builder.realAdvanced() .innerProductWithPublicPart(x.getFirst(), x.getSecond())); }); }
@Override public DRes<Vector<DRes<SReal>>> vectorMult(DRes<Matrix<DRes<SReal>>> a, Vector<BigDecimal> v) { return builder.par(par -> { return vectorMult(par, a.out(), v, (builder, x) -> builder.realAdvanced() .innerProductWithPublicPart(x.getSecond(), x.getFirst())); }); }
@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 DRes<Vector<DRes<SReal>>> vectorMult(DRes<Matrix<DRes<SReal>>> a, DRes<Vector<DRes<SReal>>> v) { return builder.par(par -> { return vectorMult(par, a.out(), v.out(), (builder, x) -> builder.realAdvanced().innerProduct(x.getFirst(), x.getSecond())); }); }
@Override public DRes<SInt> buildComputation(ProtocolBuilderNumeric builder) { return builder.par(par -> { Numeric numeric = par.numeric(); return Pair.lazy( numeric.mult(d0, n1), numeric.mult(d1, n0) ); }).seq((seq, pair) -> seq.comparison().equals(pair.getFirst(), pair.getSecond()) ); }
void inputTableau(ProtocolBuilderNumeric builder) { builder.par(par -> { Numeric numeric = par.numeric(); secretTableau = new LPTableau( new Matrix<>(constraints.getHeight(), constraints.getWidth(), (i) -> toArrayList(numeric, constraints.getRow(i))), toArrayList(numeric, b), toArrayList(numeric, f), numeric.known(BigInteger.ZERO)); secretUpdateMatrix = new Matrix<>(updateMatrix.getHeight(), updateMatrix.getWidth(), (i) -> toArrayList(numeric, updateMatrix.getRow(i))); return null; }); }