FixedPointLib.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package com.oblivm.backend.circuits.arithmetic;
  2. import java.util.Arrays;
  3. import com.oblivm.backend.flexsc.CompEnv;
  4. import com.oblivm.backend.util.Utils;
  5. //http://x86asm.net/articles/fixed-point-arithmetic-and-tricks/
  6. public class FixedPointLib<T> implements ArithmeticLib<T> {
  7. CompEnv<T> env;
  8. IntegerLib<T> lib;
  9. int offset;
  10. int width;
  11. public FixedPointLib(CompEnv<T> e, int width, int offset) {
  12. assert (offset % 2 == 0);
  13. this.env = e;
  14. lib = new IntegerLib<>(e);
  15. this.offset = offset;
  16. this.width = width;
  17. }
  18. public T[] inputOfAlice(double d) {
  19. return env.inputOfAlice(Utils.fromFixPoint(d, width, offset));
  20. }
  21. public T[] inputOfBob(double d) {
  22. return env.inputOfBob(Utils.fromFixPoint(d, width, offset));
  23. }
  24. public T[] add(T[] x, T[] y) {
  25. return lib.add(x, y);
  26. }
  27. public T[] sub(T[] x, T[] y) {
  28. return lib.sub(x, y);
  29. }
  30. // http://dsp.stackexchange.com/questions/7906/fixed-point-multiplication-with-negative-numbers
  31. public T[] multiply(T[] x, T[] y) {
  32. T[] res = lib.karatsubaMultiply(lib.absolute(x), lib.absolute(y));
  33. res = Arrays.copyOfRange(res, offset, offset + width);
  34. return lib.addSign(res, lib.xor(x[x.length - 1], y[y.length - 1]));
  35. }
  36. public T[] div(T[] x, T[] y) {
  37. T[] padX = lib.padSignedSignal(x, x.length + offset);
  38. return Arrays.copyOf(lib.div(lib.leftPublicShift(padX, offset), y), width);
  39. }
  40. public T[] publicValue(double d) {
  41. boolean[] a = Utils.fromFixPoint(d, width, offset);
  42. T[] res = env.newTArray(width);
  43. for (int i = 0; i < width; ++i)
  44. res[i] = a[i] ? lib.SIGNAL_ONE : lib.SIGNAL_ZERO;
  45. return res;
  46. }
  47. @Override
  48. public T leq(T[] a, T[] b) {
  49. return lib.leq(a, b);
  50. }
  51. @Override
  52. public T eq(T[] a, T[] b) {
  53. return lib.eq(a, b);
  54. }
  55. @Override
  56. public T[] sqrt(T[] a) {
  57. T[] res = lib.sqrt(a);
  58. return lib.leftPublicShift(res, offset / 2);
  59. }
  60. @Override
  61. public CompEnv<T> getEnv() {
  62. return env;
  63. }
  64. @Override
  65. public T[] toSecureInt(T[] a, IntegerLib<T> lib) {
  66. T[] res = lib.env.newTArray(lib.width);
  67. T[] intPart = Arrays.copyOfRange(a, offset, a.length);
  68. if (res.length >= intPart.length)
  69. System.arraycopy(intPart, 0, res, 0, intPart.length);
  70. else
  71. res = Arrays.copyOf(intPart, res.length);
  72. return res;
  73. }
  74. @Override
  75. public T[] toSecureFloat(T[] a, FloatLib<T> lib) {
  76. return null;
  77. }
  78. @Override
  79. public T[] toSecureFixPoint(T[] a, FixedPointLib<T> lib) {
  80. // later may support case between different libs;
  81. return a;
  82. }
  83. @Override
  84. public double outputToAlice(T[] a) {
  85. return Utils.toFixPoint(env.outputToAlice(a), offset);
  86. }
  87. @Override
  88. public int numBits() {
  89. return width;
  90. }
  91. }