private void compareAndSwapAtIndices(int i, int j, ProtocolBuilderBinary builder) { builder.seq(seq -> { return seq.advancedBinary().keyedCompareAndSwap(numbers.get(i), numbers.get(j)); }).seq((seq, res) -> { numbers.set(i, res.get(0)); numbers.set(j, res.get(1)); return null; }); }
@Override public DRes<List<DRes<SBool>>> buildComputation(ProtocolBuilderBinary builder) { List<DRes<SBool>> result = new ArrayList<DRes<SBool>>(); return builder.seq(seq -> { int idx = this.lefts.size() - 1; IterationState is = new IterationState(idx, seq.advancedBinary().oneBitFullAdder(lefts.get(idx), rights.get(idx), inCarry)); return is; }).whileLoop( (state) -> state.round >= 1, (seq, state) -> { int idx = state.round - 1; result.add(0, state.value.out().getFirst()); IterationState is = new IterationState(idx, seq.advancedBinary() .oneBitFullAdder(lefts.get(idx), rights.get(idx), state.value.out().getSecond())); return is; } ).seq((seq, state) -> { result.add(0, state.value.out().getFirst()); result.add(0, state.value.out().getSecond()); return () -> result; } ); }
@Override public DRes<List<DRes<SBool>>> buildComputation(ProtocolBuilderBinary builder) { List<DRes<SBool>> result = new ArrayList<DRes<SBool>>(); return builder.seq(seq -> { int idx = base.size() - 1; IterationState is = new IterationState(idx, seq.advancedBinary().oneBitHalfAdder(base.get(idx), increment)); return is; }).whileLoop((state) -> state.round >= 1, (seq, state) -> { int idx = state.round - 1; result.add(0, state.value.out().getFirst()); IterationState is = new IterationState(idx, seq.advancedBinary().oneBitHalfAdder(base.get(idx), state.value.out().getSecond())); return is; }).seq((seq, state) -> { result.add(0, state.value.out().getFirst()); result.add(0, state.value.out().getSecond()); return () -> result; }); }
ors.add(number.get(0)); for (int i = 1; i < number.size(); i++) { ors.add(seq.advancedBinary().or(number.get(i), ors.get(i - 1)));
List<DRes<SBool>> xnors = new ArrayList<>(); for (int i = 0; i < length; i++) { xnors.add(bb.xnor(inLeft.get(i), inRight.get(i)));
seq.advancedBinary().fullAdder(state.value.out(), res, seq.binary().known(false))); return is;
@Override public DRes<List<List<DRes<SBool>>>> buildComputation(ProtocolBuilderBinary builder) { return builder.seq(seq -> { return seq.comparison().greaterThan(right, left); }).par((par, data) -> { List<DRes<SBool>> first = left.stream() .map(e -> {return par.advancedBinary().condSelect(data, e, right.get(left.indexOf(e)));}) .collect(Collectors.toList()); List<DRes<SBool>> second = right.stream() .map(e -> {return par.advancedBinary().condSelect(data, e, left.get(right.indexOf(e)));}) .collect(Collectors.toList()); List<List<DRes<SBool>>> result = new ArrayList<List<DRes<SBool>>>(); result.add(first); result.add(second); return () -> result; }); } }
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(seq -> { AdvancedBinary prov = seq.advancedBinary(); DRes<SBool> increment = seq.binary().known(true); List<DRes<SBool>> large = rawLarge.stream().map(seq.binary()::known).collect(Collectors.toList()); DRes<List<DRes<SBool>>> adder = prov.bitIncrement(large, increment); return adder; }).seq((seq, dat) -> { List<DRes<Boolean>> out = new ArrayList<>(); for (DRes<SBool> o : dat) { out.add(seq.binary().open(o)); } return () -> out.stream().map(DRes::out).collect(Collectors.toList()); }); List<Boolean> outputs = runApplication(app); Assert.assertThat(ByteAndBitConverter.toHex(outputs), Is.is(expected)); Assert.assertThat(outputs.size(), Is.is(rawLarge.size() + 1)); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> { ProtocolBuilderBinary builder = (ProtocolBuilderBinary) producer; return builder.seq(seq -> { AdvancedBinary prov = seq.advancedBinary(); List<DRes<SBool>> first = rawFirst.stream().map(seq.binary()::known).collect(Collectors.toList()); List<DRes<SBool>> second = rawSecond.stream().map(seq.binary()::known).collect(Collectors.toList()); DRes<List<DRes<SBool>>> multiplication = prov.binaryMult(first, second); return () -> multiplication.out(); }).seq((seq, dat) -> { List<DRes<Boolean>> out = new ArrayList<DRes<Boolean>>(); for (DRes<SBool> o : dat) { out.add(seq.binary().open(o)); } return () -> out.stream().map(DRes::out).collect(Collectors.toList()); }); }; List<Boolean> outputs = runApplication(app); Assert.assertThat(ByteAndBitConverter.toHex(outputs), Is.is(expected)); Assert.assertThat(outputs.size(), Is.is(rawFirst.size() + rawSecond.size())); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(builder -> { AdvancedBinary prov = builder.advancedBinary(); List<DRes<Boolean>> results = new ArrayList<>(); DRes<SBool> inp100 = builder.binary().known(false); results.add(builder.binary().open(prov.and(inp100, false))); DRes<SBool> inp110 = builder.binary().known(true); results.add(builder.binary().open(prov.and(inp110, false))); DRes<SBool> inp101 = builder.binary().known(false); results.add(builder.binary().open(prov.and(inp101, true))); DRes<SBool> inp111 = builder.binary().known(true); results.add(builder.binary().open(prov.and(inp111, true))); return () -> results; }).seq( (seq, results) -> () -> results.stream().map(DRes::out) .collect(Collectors.toList())); List<Boolean> res = runApplication(app); Assert.assertEquals(false, res.get(0)); Assert.assertEquals(false, res.get(1)); Assert.assertEquals(false, res.get(2)); Assert.assertEquals(true, res.get(3)); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(builder -> { AdvancedBinary prov = builder.advancedBinary(); List<DRes<Boolean>> results = new ArrayList<>(); DRes<SBool> inp100 = builder.binary().known(false); results.add(builder.binary().open(prov.or(inp100, false))); DRes<SBool> inp110 = builder.binary().known(true); results.add(builder.binary().open(prov.or(inp110, false))); DRes<SBool> inp101 = builder.binary().known(false); results.add(builder.binary().open(prov.or(inp101, true))); DRes<SBool> inp111 = builder.binary().known(true); results.add(builder.binary().open(prov.or(inp111, true))); return () -> results; }).seq( (seq, results) -> () -> results.stream().map(DRes::out) .collect(Collectors.toList())); List<Boolean> res = runApplication(app); Assert.assertEquals(false, res.get(0)); Assert.assertEquals(true, res.get(1)); Assert.assertEquals(true, res.get(2)); Assert.assertEquals(true, res.get(3)); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(builder -> { AdvancedBinary prov = builder.advancedBinary(); List<DRes<Boolean>> results = new ArrayList<>(); DRes<SBool> inp100 = builder.binary().known(false); results.add(builder.binary().open(prov.xnor(inp100, false))); DRes<SBool> inp110 = builder.binary().known(true); results.add(builder.binary().open(prov.xnor(inp110, false))); DRes<SBool> inp101 = builder.binary().known(false); results.add(builder.binary().open(prov.xnor(inp101, true))); DRes<SBool> inp111 = builder.binary().known(true); results.add(builder.binary().open(prov.xnor(inp111, true))); return () -> results; }).seq( (seq, results) -> () -> results.stream().map(DRes::out) .collect(Collectors.toList())); List<Boolean> res = runApplication(app); Assert.assertEquals(true, res.get(0)); Assert.assertEquals(false, res.get(1)); Assert.assertEquals(false, res.get(2)); Assert.assertEquals(true, res.get(3)); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(seq -> { AdvancedBinary prov = seq.advancedBinary(); DRes<SBool> carry = seq.binary().known(true); List<DRes<SBool>> first = rawFirst.stream().map(seq.binary()::known).collect(Collectors.toList()); List<DRes<SBool>> second = rawSecond.stream().map(seq.binary()::known).collect(Collectors.toList()); DRes<List<DRes<SBool>>> adder = prov.fullAdder(first, second, carry); return adder; }).seq((seq, dat) -> { List<DRes<Boolean>> out = new ArrayList<>(); for (DRes<SBool> o : dat) { out.add(seq.binary().open(o)); } return () -> out.stream().map(DRes::out).collect(Collectors.toList()); }); List<Boolean> outputs = runApplication(app); if (doAsserts) { Assert.assertThat(ByteAndBitConverter.toHex(outputs), Is.is(expected)); Assert.assertThat(outputs.size(), Is.is(rawFirst.size() + 1)); } } };
.map(e -> par.advancedBinary().condSelect(data, e, rightValue.get(leftValue.indexOf(e)))) .collect(Collectors.toList()); .map(e -> par.advancedBinary().condSelect(data, e, rightKey.get(leftKey.indexOf(e)))) .collect(Collectors.toList());
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(builder -> { AdvancedBinary prov = builder.advancedBinary(); List<DRes<Boolean>> results = new ArrayList<>(); DRes<SBool> inp100 = builder.binary().known(false); DRes<SBool> inp200 = builder.binary().known(false); results.add(builder.binary().open(prov.or(inp100, inp200))); DRes<SBool> inp110 = builder.binary().known(true); DRes<SBool> inp210 = builder.binary().known(false); results.add(builder.binary().open(prov.or(inp110, inp210))); DRes<SBool> inp101 = builder.binary().known(false); DRes<SBool> inp201 = builder.binary().known(true); results.add(builder.binary().open(prov.or(inp101, inp201))); DRes<SBool> inp111 = builder.binary().known(true); DRes<SBool> inp211 = builder.binary().known(true); results.add(builder.binary().open(prov.or(inp111, inp211))); return () -> results; }).seq( (seq, results) -> () -> results.stream().map(DRes::out) .collect(Collectors.toList())); List<Boolean> res = runApplication(app); Assert.assertEquals(false, res.get(0)); Assert.assertEquals(true, res.get(1)); Assert.assertEquals(true, res.get(2)); Assert.assertEquals(true, res.get(3)); } };
@Override public void test() throws Exception { Application<List<Boolean>, ProtocolBuilderBinary> app = producer -> producer.seq(builder -> { AdvancedBinary prov = builder.advancedBinary(); List<DRes<Boolean>> results = new ArrayList<>(); DRes<SBool> inp100 = builder.binary().known(false); DRes<SBool> inp200 = builder.binary().known(false); results.add(builder.binary().open(prov.xnor(inp100, inp200))); DRes<SBool> inp110 = builder.binary().known(true); DRes<SBool> inp210 = builder.binary().known(false); results.add(builder.binary().open(prov.xnor(inp110, inp210))); DRes<SBool> inp101 = builder.binary().known(false); DRes<SBool> inp201 = builder.binary().known(true); results.add(builder.binary().open(prov.xnor(inp101, inp201))); DRes<SBool> inp111 = builder.binary().known(true); DRes<SBool> inp211 = builder.binary().known(true); results.add(builder.binary().open(prov.xnor(inp111, inp211))); return () -> results; }).seq( (seq, results) -> () -> results.stream().map(DRes::out) .collect(Collectors.toList())); List<Boolean> res = runApplication(app); Assert.assertEquals(true, res.get(0)); Assert.assertEquals(false, res.get(1)); Assert.assertEquals(false, res.get(2)); Assert.assertEquals(true, res.get(3)); } };
rawRightValue.stream().map(builder.binary()::known).collect(Collectors.toList()); return seq.advancedBinary().keyedCompareAndSwap(new Pair<>(leftKey, leftValue), new Pair<>(rightKey, rightValue)); }).seq((seq, data) -> {
DRes<SBool> inp0 = seq.binary().known(false); DRes<SBool> inp1 = seq.binary().known(true); data.add(prov.oneBitHalfAdder(inp0, inp0)); data.add(prov.oneBitHalfAdder(inp0, inp1)); data.add(prov.oneBitHalfAdder(inp1, inp0)); data.add(prov.oneBitHalfAdder(inp1, inp1)); return () -> data; }).seq((seq, dat) -> {
DRes<SBool> inp0 = seq.binary().known(false); DRes<SBool> inp1 = seq.binary().known(true); data.add(prov.oneBitFullAdder(inp0, inp0, inp0)); data.add(prov.oneBitFullAdder(inp0, inp0, inp1)); data.add(prov.oneBitFullAdder(inp0, inp1, inp0)); data.add(prov.oneBitFullAdder(inp0, inp1, inp1)); data.add(prov.oneBitFullAdder(inp1, inp0, inp0)); data.add(prov.oneBitFullAdder(inp1, inp0, inp1)); data.add(prov.oneBitFullAdder(inp1, inp1, inp0)); data.add(prov.oneBitFullAdder(inp1, inp1, inp1)); return () -> data; }).seq((seq, dat) -> {