mplang-nightly 0.1.dev267__tar.gz → 0.1.dev269__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/PKG-INFO +1 -1
  2. mplang_nightly-0.1.dev269/mplang/py.typed +13 -0
  3. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/http.py +1 -1
  4. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/mem.py +1 -1
  5. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/okvs_opt.cpp +16 -1
  6. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/okvs_gct.py +16 -10
  7. mplang_nightly-0.1.dev269/mplang/v2/libs/mpc/psi/rr22.py +303 -0
  8. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_rr22.py +6 -5
  9. mplang_nightly-0.1.dev267/mplang/v2/libs/mpc/psi/rr22.py +0 -344
  10. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/.gitignore +0 -0
  11. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/LICENSE +0 -0
  12. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/README.md +0 -0
  13. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/conf/3pc.yaml +0 -0
  14. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/README.md +0 -0
  15. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/models.py +0 -0
  16. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/stax_nn.py +0 -0
  17. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
  18. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/hist_jax.py +0 -0
  19. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/hist_jax_test.py +0 -0
  20. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/naive_np.py +0 -0
  21. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/readme.md +0 -0
  22. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/sgb.py +0 -0
  23. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/sgb_test.py +0 -0
  24. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/hatch_build.py +0 -0
  25. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/__init__.py +0 -0
  26. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/__init__.py +0 -0
  27. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/_device.py +0 -0
  28. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/analysis/__init__.py +0 -0
  29. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/analysis/diagram.py +0 -0
  30. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/__init__.py +0 -0
  31. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/cluster.py +0 -0
  32. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/comm.py +0 -0
  33. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/context_mgr.py +0 -0
  34. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/dtypes.py +0 -0
  35. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/__init__.py +0 -0
  36. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/ast.py +0 -0
  37. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/evaluator.py +0 -0
  38. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/printer.py +0 -0
  39. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/transformer.py +0 -0
  40. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/utils.py +0 -0
  41. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/visitor.py +0 -0
  42. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/walk.py +0 -0
  43. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/interp.py +0 -0
  44. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mask.py +0 -0
  45. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mpir.py +0 -0
  46. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mpobject.py +0 -0
  47. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mptype.py +0 -0
  48. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/pfunc.py +0 -0
  49. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/primitive.py +0 -0
  50. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/table.py +0 -0
  51. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/tensor.py +0 -0
  52. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/tracer.py +0 -0
  53. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/host.py +0 -0
  54. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/__init__.py +0 -0
  55. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/base.py +0 -0
  56. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/basic.py +0 -0
  57. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/context.py +0 -0
  58. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/crypto.py +0 -0
  59. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/fhe.py +0 -0
  60. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/mock_tee.py +0 -0
  61. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/phe.py +0 -0
  62. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/spu.py +0 -0
  63. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/sql_duckdb.py +0 -0
  64. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/stablehlo.py +0 -0
  65. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/value.py +0 -0
  66. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/__init__.py +0 -0
  67. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/base.py +0 -0
  68. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/basic.py +0 -0
  69. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/crypto.py +0 -0
  70. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/fhe.py +0 -0
  71. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/jax_cc.py +0 -0
  72. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/nnx_cc.py +0 -0
  73. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/phe.py +0 -0
  74. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/spu.py +0 -0
  75. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/sql_cc.py +0 -0
  76. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/tee.py +0 -0
  77. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
  78. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
  79. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
  80. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
  81. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/__init__.py +0 -0
  82. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/channel.py +0 -0
  83. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/cli.py +0 -0
  84. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/client.py +0 -0
  85. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/communicator.py +0 -0
  86. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/data_providers.py +0 -0
  87. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/driver.py +0 -0
  88. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/exceptions.py +0 -0
  89. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/http_api.md +0 -0
  90. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/link_comm.py +0 -0
  91. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/server.py +0 -0
  92. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/session.py +0 -0
  93. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/simulation.py +0 -0
  94. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/api.py +0 -0
  96. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/mpi.py +0 -0
  97. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/party.py +0 -0
  98. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/random.py +0 -0
  99. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/smpc.py +0 -0
  100. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/__init__.py +0 -0
  101. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/crypto.py +0 -0
  102. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/func_utils.py +0 -0
  103. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/spu_utils.py +0 -0
  104. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/table_utils.py +0 -0
  105. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/__init__.py +0 -0
  106. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/__init__.py +0 -0
  107. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/bfv_impl.py +0 -0
  108. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/channel.py +0 -0
  109. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/crypto_impl.py +0 -0
  110. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/field_impl.py +0 -0
  111. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/func_impl.py +0 -0
  112. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/phe_impl.py +0 -0
  113. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_design.md +0 -0
  114. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/__init__.py +0 -0
  115. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/ops.py +0 -0
  116. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/state.py +0 -0
  117. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/values.py +0 -0
  118. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/__init__.py +0 -0
  119. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/http.py +0 -0
  120. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/mem.py +0 -0
  121. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/ops.py +0 -0
  122. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/state.py +0 -0
  123. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/spu_impl.py +0 -0
  124. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/spu_state.py +0 -0
  125. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/store_impl.py +0 -0
  126. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/table_impl.py +0 -0
  127. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/tee_impl.py +0 -0
  128. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/tensor_impl.py +0 -0
  129. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/cli.py +0 -0
  130. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/cli_guide.md +0 -0
  131. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/__init__.py +0 -0
  132. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/bfv.py +0 -0
  133. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/crypto.py +0 -0
  134. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/dtypes.py +0 -0
  135. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/field.py +0 -0
  136. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/func.py +0 -0
  137. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/phe.py +0 -0
  138. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/simp.py +0 -0
  139. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/spu.py +0 -0
  140. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/store.py +0 -0
  141. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/table.py +0 -0
  142. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/tee.py +0 -0
  143. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/tensor.py +0 -0
  144. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/README.md +0 -0
  145. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/__init__.py +0 -0
  146. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/context.py +0 -0
  147. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/graph.py +0 -0
  148. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/jit.py +0 -0
  149. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/object.py +0 -0
  150. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/primitive.py +0 -0
  151. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/printer.py +0 -0
  152. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/registry.py +0 -0
  153. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/serde.py +0 -0
  154. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/tracer.py +0 -0
  155. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/typing.py +0 -0
  156. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/Makefile +0 -0
  157. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/__init__.py +0 -0
  158. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/gf128.cpp +0 -0
  159. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/ldpc.cpp +0 -0
  160. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/okvs.cpp +0 -0
  161. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/py_kernels.py +0 -0
  162. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/collective.py +0 -0
  163. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/__init__.py +0 -0
  164. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/api.py +0 -0
  165. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/cluster.py +0 -0
  166. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/ml/__init__.py +0 -0
  167. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/ml/sgb.py +0 -0
  168. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/__init__.py +0 -0
  169. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/_utils.py +0 -0
  170. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
  171. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
  172. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
  173. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
  174. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
  175. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/common/constants.py +0 -0
  176. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
  177. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/base.py +0 -0
  178. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/extension.py +0 -0
  179. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/silent.py +0 -0
  180. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
  181. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
  182. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
  183. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
  184. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
  185. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
  186. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
  187. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/ldpc.py +0 -0
  188. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/silver.py +0 -0
  189. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/__init__.py +0 -0
  190. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/dialect_state.py +0 -0
  191. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/interpreter.py +0 -0
  192. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/object_store.py +0 -0
  193. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/value.py +0 -0
  194. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/pyproject.toml +0 -0
  195. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/__init__.py +0 -0
  196. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/conftest.py +0 -0
  197. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/__init__.py +0 -0
  198. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/analysis/test_diagram.py +0 -0
  199. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/conftest.py +0 -0
  200. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/__init__.py +0 -0
  201. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/__init__.py +0 -0
  202. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/conftest.py +0 -0
  203. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_ast.py +0 -0
  204. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_printer.py +0 -0
  205. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_utils.py +0 -0
  206. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_walk.py +0 -0
  207. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_cluster.py +0 -0
  208. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_dtype.py +0 -0
  209. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mask.py +0 -0
  210. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mpir.py +0 -0
  211. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mptype.py +0 -0
  212. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_primitive.py +0 -0
  213. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_table.py +0 -0
  214. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_tensor.py +0 -0
  215. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_tracer.py +0 -0
  216. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/device/__init__.py +0 -0
  217. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/device/test_device_basic.py +0 -0
  218. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/README.md +0 -0
  219. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
  220. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_http_e2e.py +0 -0
  221. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
  222. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_tee_workflow.py +0 -0
  223. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_tutorials.py +0 -0
  224. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_unused_param_integration.py +0 -0
  225. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/__init__.py +0 -0
  226. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_basic.py +0 -0
  227. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_debug_print.py +0 -0
  228. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_fhe.py +0 -0
  229. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_kernel_binding.py +0 -0
  230. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_phe.py +0 -0
  231. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_spu.py +0 -0
  232. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_sql_duckdb.py +0 -0
  233. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_stablehlo.py +0 -0
  234. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_value.py +0 -0
  235. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_value_serde.py +0 -0
  236. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/__init__.py +0 -0
  237. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/dummy.py +0 -0
  238. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_basic_pack.py +0 -0
  239. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_crypto.py +0 -0
  240. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_feop_base.py +0 -0
  241. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_jax_cc.py +0 -0
  242. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_nnx_cc.py +0 -0
  243. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_phe.py +0 -0
  244. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_spu.py +0 -0
  245. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_spu_defensive.py +0 -0
  246. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_sql.py +0 -0
  247. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_sql_cc.py +0 -0
  248. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
  249. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/__init__.py +0 -0
  250. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_channel.py +0 -0
  251. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_cli.py +0 -0
  252. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_communicator.py +0 -0
  253. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_driver.py +0 -0
  254. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_server.py +0 -0
  255. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_simulation.py +0 -0
  256. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_mpi.py +0 -0
  257. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_random.py +0 -0
  258. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_smpc.py +0 -0
  259. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_sugar.py +0 -0
  260. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/__init__.py +0 -0
  261. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/server_fixtures.py +0 -0
  262. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_func_utils.py +0 -0
  263. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_spu_utils.py +0 -0
  264. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_table_utils.py +0 -0
  265. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/__init__.py +0 -0
  266. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/__init__.py +0 -0
  267. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_driver/__init__.py +0 -0
  268. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_driver/test_http.py +0 -0
  269. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/__init__.py +0 -0
  270. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/test_http.py +0 -0
  271. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/test_mem.py +0 -0
  272. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_bfv_impl.py +0 -0
  273. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_channel.py +0 -0
  274. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_crypto_impl.py +0 -0
  275. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_okvs_binding.py +0 -0
  276. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_simp_integration.py +0 -0
  277. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_simp_object_store.py +0 -0
  278. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_spu_impl.py +0 -0
  279. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_table_impl.py +0 -0
  280. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_tee_impl.py +0 -0
  281. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_tensor_impl.py +0 -0
  282. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_verify_clean.py +0 -0
  283. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/conftest.py +0 -0
  284. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/__init__.py +0 -0
  285. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_bfv.py +0 -0
  286. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_crypto.py +0 -0
  287. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_dtypes.py +0 -0
  288. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_field.py +0 -0
  289. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_func.py +0 -0
  290. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_okvs.py +0 -0
  291. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_okvs_bench.py +0 -0
  292. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_phe.py +0 -0
  293. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_simp.py +0 -0
  294. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_simp_comm.py +0 -0
  295. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_spu.py +0 -0
  296. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_table.py +0 -0
  297. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_tee.py +0 -0
  298. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_tensor.py +0 -0
  299. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/__init__.py +0 -0
  300. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_context.py +0 -0
  301. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_graph.py +0 -0
  302. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_primitive.py +0 -0
  303. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
  304. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_printer.py +0 -0
  305. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_serde.py +0 -0
  306. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_tracer.py +0 -0
  307. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_typing.py +0 -0
  308. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
  309. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/__init__.py +0 -0
  310. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/conftest.py +0 -0
  311. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_api_errors.py +0 -0
  312. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_dialects.py +0 -0
  313. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_layouts.py +0 -0
  314. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_tee.py +0 -0
  315. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/__init__.py +0 -0
  316. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/test_sgb.py +0 -0
  317. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/test_sgb_bench.py +0 -0
  318. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/__init__.py +0 -0
  319. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
  320. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
  321. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
  322. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
  323. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/__init__.py +0 -0
  324. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
  325. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
  326. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
  327. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/__init__.py +0 -0
  328. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
  329. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
  330. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
  331. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
  332. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  333. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
  334. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/test_utils.py +0 -0
  335. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/__init__.py +0 -0
  336. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
  337. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
  338. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
  339. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
  340. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
  341. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
  342. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/test_collective.py +0 -0
  343. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/test_simple_guide.py +0 -0
  344. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_interpreter_async.py +0 -0
  345. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_object_store.py +0 -0
  346. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_object_store_fs.py +0 -0
  347. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_fetch_semantics.py +0 -0
  348. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_pytree_io.py +0 -0
  349. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_store.py +0 -0
  350. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/utils/__init__.py +0 -0
  351. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/utils/tensor_patch.py +0 -0
  352. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/MIGRATION.md +0 -0
  353. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/README.md +0 -0
  354. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/__init__.py +0 -0
  355. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/alice.csv +0 -0
  356. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/bob.csv +0 -0
  357. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/prepare_vertical_iris.py +0 -0
  358. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/run.sh +0 -0
  359. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/00_device_basics.py +0 -0
  360. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/01_function_decorator.py +0 -0
  361. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
  362. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/03_run_jax.py +0 -0
  363. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/04_run_sql.py +0 -0
  364. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/05_pipeline.py +0 -0
  365. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
  366. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/07_run_nnx.py +0 -0
  367. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/pitfalls/late_binding.py +0 -0
  368. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/pitfalls/rand.py +0 -0
  369. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/00_basic.py +0 -0
  370. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/01_condition.py +0 -0
  371. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/02_whileloop.py +0 -0
  372. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/03_stdio.py +0 -0
  373. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/04_phe.py +0 -0
  374. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/05_tee.py +0 -0
  375. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/06_fhe.py +0 -0
  376. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/07_advanced.py +0 -0
  377. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
  378. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/00_device_basics.py +0 -0
  379. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/01_function_decorator.py +0 -0
  380. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/02_simulation_and_driver.py +0 -0
  381. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/03_run_jax.py +0 -0
  382. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
  383. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/05_run_sql.py +0 -0
  384. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/06_pipeline.py +0 -0
  385. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/07_stax_nn.py +0 -0
  386. {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev267
3
+ Version: 0.1.dev269
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -0,0 +1,13 @@
1
+ # Copyright 2026 Ant Group Co., Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
@@ -32,7 +32,7 @@ if TYPE_CHECKING:
32
32
  from concurrent.futures import Future
33
33
 
34
34
  from mplang.v2.edsl.graph import Graph
35
- from mplang.v2.edsl.spec import ClusterSpec
35
+ from mplang.v2.libs.device import ClusterSpec
36
36
 
37
37
 
38
38
  class SimpHttpDriver(SimpDriver):
@@ -32,7 +32,7 @@ if TYPE_CHECKING:
32
32
  from concurrent.futures import Future
33
33
 
34
34
  from mplang.v2.edsl.graph import Graph
35
- from mplang.v2.edsl.spec import ClusterSpec
35
+ from mplang.v2.libs.device import ClusterSpec
36
36
 
37
37
 
38
38
  class MemCluster:
@@ -36,6 +36,10 @@ extern "C" {
36
36
  uint64_t h1, h2, h3;
37
37
  };
38
38
 
39
+ // Declaration of the safe (robust) solver implemented in okvs.cpp
40
+ // Signature: solve_okvs(keys, values, output, n, m, seed_ptr)
41
+ void solve_okvs(uint64_t* keys, uint64_t* values, uint64_t* output, uint64_t n, uint64_t m, uint64_t* seed_ptr);
42
+
39
43
  // Stateless Bin Selection
40
44
  // Maps a key to a deterministic bin index [0, NUM_BINS).
41
45
  inline uint64_t get_bin_index(uint64_t key, __m128i seed) {
@@ -245,10 +249,21 @@ extern "C" {
245
249
  uint64_t valid_m = m_per_bin[b];
246
250
 
247
251
  if(!solve_bin(bin_keys[b], bin_vals[b], &P_vec[offset], valid_m, seed)) {
252
+ // On failure, log and fall back to the robust solver for this bin.
253
+ // The fallback is executed inside a critical section to avoid nested OpenMP
254
+ // regions and to serialize rare fallbacks.
248
255
  #pragma omp critical
249
256
  {
250
- fprintf(stderr, "[ERROR] Bin %lu failed OKVS peeling. Items: %lu / M: %lu (Ratio: %.2f). Try increasing expansion factor.\n",
257
+ fprintf(stderr, "[WARN] Bin %lu failed optimized peeling; falling back to safe solver. Items: %lu / M: %lu (Ratio: %.2f)\n",
251
258
  b, bin_keys[b].size(), valid_m, (double)valid_m / bin_keys[b].size());
259
+
260
+ // Prepare pointers for the safe solver
261
+ uint64_t* keys_ptr = &bin_keys[b][0];
262
+ uint64_t* vals_ptr = &bin_vals[b][0];
263
+ uint64_t* out_ptr = output + (offset * 2ULL); // each 128-bit slot == 2 uint64_t
264
+
265
+ // Call the safe solver implemented in okvs.cpp
266
+ solve_okvs(keys_ptr, vals_ptr, out_ptr, bin_keys[b].size(), valid_m, seed_ptr);
252
267
  }
253
268
  }
254
269
  }
@@ -40,12 +40,16 @@ def get_okvs_expansion(n: int) -> float:
40
40
  - For N → ∞: Theoretical minimum is ε ≈ 0.23 (M = 1.23N)
41
41
  - For finite N: Larger ε needed due to variance in random hash collisions
42
42
 
43
- Empirical safe thresholds (failure probability < 0.01%):
44
- - N < 1,000: ε = 4.5 (M = 5.5N) - very small sets need extra wide margin
45
- to handle worst-case hash collisions
46
- - N < 10,000: ε = 0.4 (M = 1.4N)
47
- - N < 100,000: ε = 0.3 (M = 1.3N)
48
- - N ≥ 100,000: ε = 0.35 (M = 1.35N) - large sets converge near theory
43
+ Empirical safe thresholds (failure probability < 0.001%):
44
+ - N 200: ε = 24.0 (M = 25.0N) - extremely small sets need very wide margin
45
+ - N < 1,000: ε = 11.0 (M = 12.0N) - small sets need extra wide safety margin
46
+ - N < 10,000: ε = 0.6 (M = 1.6N)
47
+ - N < 100,000: ε = 0.4 (M = 1.4N)
48
+ - N ≥ 100,000: ε = 0.35 (M = 1.35N) - large sets converge near theory
49
+
50
+ Note: These expansion factors account for the 128-byte alignment requirement
51
+ in the OKVS implementation. The factors are intentionally conservative to
52
+ ensure high success rates (>99.9%) for the probabilistic peeling algorithm.
49
53
 
50
54
  Args:
51
55
  n: Number of key-value pairs to encode
@@ -53,12 +57,14 @@ def get_okvs_expansion(n: int) -> float:
53
57
  Returns:
54
58
  Expansion factor ε such that M = (1+ε)*N is safe for peeling
55
59
  """
56
- if n < 1000:
57
- return 5.5 # Small scale: need very wide safety margin for stability
60
+ if n <= 200:
61
+ return 25.0 # Extremely small scale: need very wide margin for stability
62
+ elif n < 1000:
63
+ return 12.0 # Small scale: need wide safety margin for stability
58
64
  elif n <= 10000:
59
- return 1.4 # Medium scale
65
+ return 1.6 # Medium scale
60
66
  elif n <= 100000:
61
- return 1.3 # Large scale
67
+ return 1.4 # Large scale
62
68
  else:
63
69
  # Mega-Binning requires ~1.35 for stability with 1024 bins
64
70
  return 1.35
@@ -0,0 +1,303 @@
1
+ # Copyright 2025 Ant Group Co., Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Private Set Intersection using VOLE and OKVS (RR22-Style).
16
+
17
+ This module implements a high-performance PSI protocol based on the "Blazing Fast PSI"
18
+ (RR22) paper. The protocol relies on Vector Oblivious Linear Evaluation (VOLE) and
19
+ Oblivious Key-Value Stores (OKVS) to achieve efficient set intersection with linear
20
+ communication O(N) and computation complexity.
21
+
22
+ Protocol Overview:
23
+ The core idea is to mask a "Polynomial" (encoded via OKVS) with VOLE-correlated randomness,
24
+ such that the mask can only be removed (and the polynomial verified) if the parties share
25
+ the same element.
26
+
27
+ Phases:
28
+ 1. **Correlated Randomness (VOLE)**:
29
+ Sender and Receiver establish a shared correlation:
30
+ W = V + U * Delta
31
+ - PSI Receiver holds `U` and `V` (these are generated by the OT "sender"
32
+ role in `silent_vole_random_u`).
33
+ - PSI Sender holds `W` and `Delta` (these are generated by the OT "receiver"
34
+ role).
35
+ - `U` is random; `Delta` is a fixed secret scalar held by the Sender.
36
+
37
+ 2. **Encoding (OKVS)**:
38
+ The Receiver encodes its input set Y into an OKVS storage `P` such that
39
+ Decode(P, y) = H(y) for all y in Y. The function `H(y)` is implemented via
40
+ AES/Davies–Meyer expansion acting as a random oracle.
41
+
42
+ 3. **Masking & Exchange**:
43
+ The Receiver masks the OKVS storage `P` with its VOLE share `U`:
44
+ Q = P + U
45
+ The masked storage `Q` is sent to the Sender (so Sender sees a masked OKVS).
46
+
47
+ 4. **Decoding & Tag Generation (Sender)**:
48
+ The Sender holds `W` and `Delta` and computes the linear combination:
49
+ K = Q * Delta + W
50
+ Using W = V + U * Delta and Q = P + U, this simplifies to
51
+ K = P * Delta + V.
52
+ The Sender decodes `K` for each of its items x to obtain P(x)*Delta + V(x),
53
+ then subtracts H(x)*Delta (computed locally) to recover `V(x)`. The value
54
+ `Tag = V(x)` serves as the sender-side tag for item x.
55
+
56
+ 5. **Verification (Receiver)**:
57
+ The Sender hashes and truncates tags and sends the truncated hashes to the
58
+ Receiver. The Receiver locally decodes `V(y)` from its OKVS, hashes it with
59
+ the same domain separation and truncation, and compares to the received
60
+ truncated hashes to determine membership in the intersection.
61
+ """
62
+
63
+ from typing import Any, cast
64
+
65
+ import jax.numpy as jnp
66
+
67
+ import mplang.v2.edsl as el
68
+ import mplang.v2.libs.mpc.ot.silent as silent_ot
69
+ from mplang.v2.dialects import field, simp, tensor
70
+
71
+
72
+ def psi_intersect(
73
+ sender: int,
74
+ receiver: int,
75
+ n: int,
76
+ sender_items: el.Object,
77
+ receiver_items: el.Object,
78
+ ) -> el.Object:
79
+ """Execute OKVS-based PSI Protocol (Original RR22 Logic).
80
+
81
+ This implementation follows the RR22 paper's role assignment where:
82
+ - PSI Sender holds Delta (and W).
83
+ - PSI Receiver holds U and V.
84
+
85
+ This enables the "One Decode" optimization on the Sender side and prevents
86
+ offline brute-force attacks by the Receiver (though Sender could brute-force).
87
+
88
+ Args:
89
+ sender: Rank of Sender.
90
+ receiver: Rank of Receiver.
91
+ n: Number of items.
92
+ sender_items: Object located at Sender.
93
+ receiver_items: Object located at Receiver.
94
+
95
+ Returns:
96
+ Intersection mask (0/1) located at Receiver.
97
+ """
98
+
99
+ # Validation
100
+ if sender == receiver:
101
+ raise ValueError(
102
+ f"Sender ({sender}) and Receiver ({receiver}) must be different."
103
+ )
104
+ if n <= 0:
105
+ raise ValueError(f"Input size n must be positive, got {n}.")
106
+
107
+ # =========================================================================
108
+ # Phase 1. Parameter Setup
109
+ # =========================================================================
110
+ import mplang.v2.libs.mpc.psi.okvs_gct as okvs_gct
111
+
112
+ expansion = okvs_gct.get_okvs_expansion(n)
113
+ M = int(n * expansion)
114
+ if M % 128 != 0:
115
+ M = ((M // 128) + 1) * 128
116
+
117
+ # =========================================================================
118
+ # Phase 2. Correlated Randomness (VOLE)
119
+ # =========================================================================
120
+ # In the original paper logic (Fig 4), the PSI Sender holds Delta.
121
+ # Therefore, we swap the roles in the OT call.
122
+ #
123
+ # silent_vole_random_u(A, B) gives:
124
+ # A (OT Sender): U, V
125
+ # B (OT Receiver): W, Delta
126
+ #
127
+ # We want PSI Sender to be OT Receiver.
128
+ res_tuple = silent_ot.silent_vole_random_u(receiver, sender, M, base_k=1024)
129
+
130
+ # PSI Receiver gets U, V
131
+ v_recv, w_sender, u_recv, delta_sender = res_tuple[:4]
132
+
133
+ # =========================================================================
134
+ # Phase 3. Receiver Encoding & Masking
135
+ # =========================================================================
136
+ # Receiver computes P such that P(y) = H(y).
137
+ # Receiver masks P with U (Paper's A vector).
138
+ # Q = P ^ U
139
+
140
+ from mplang.v2.dialects import crypto
141
+ from mplang.v2.edsl import typing as elt
142
+
143
+ def _gen_seed() -> Any:
144
+ return crypto.random_tensor((2,), elt.u64)
145
+
146
+ okvs_seed = simp.pcall_static((receiver,), _gen_seed)
147
+ okvs_seed_sender = simp.shuffle_static(okvs_seed, {sender: receiver})
148
+
149
+ okvs = okvs_gct.SparseOKVS(M)
150
+
151
+ def _recv_ops(y: Any, u: Any, seed: Any) -> Any:
152
+ # 3.1 Compute H(y)
153
+ def _reshape_seeds(items: Any) -> Any:
154
+ lo = items
155
+ hi = jnp.zeros_like(items)
156
+ return jnp.stack([lo, hi], axis=1) # (N, 2)
157
+
158
+ seeds = tensor.run_jax(_reshape_seeds, y)
159
+ res_exp = field.aes_expand(seeds, 1) # (N, 1, 2)
160
+
161
+ def _davies_meyer(enc: Any, s: Any) -> Any:
162
+ enc_flat = enc.reshape(enc.shape[0], 2)
163
+ return jnp.bitwise_xor(enc_flat, s)
164
+
165
+ h_y = tensor.run_jax(_davies_meyer, res_exp, seeds)
166
+
167
+ # 3.2 Encode P
168
+ p_storage = okvs.encode(y, h_y, seed)
169
+
170
+ # 3. Mask with U (instead of W)
171
+ # Q = P ^ U
172
+ q_storage = field.add(p_storage, u)
173
+
174
+ return q_storage
175
+
176
+ # Receiver uses U to mask
177
+ q_shared = simp.pcall_static(
178
+ (receiver,), _recv_ops, receiver_items, u_recv, okvs_seed
179
+ )
180
+
181
+ q_sender_view = simp.shuffle_static(q_shared, {sender: receiver})
182
+
183
+ # =========================================================================
184
+ # Phase 4. Sender "One Decode" & Tag Generation
185
+ # =========================================================================
186
+ # Sender holds W, Delta. Receives Q.
187
+ # W = V + U * Delta
188
+ #
189
+ # Derivation:
190
+ # K = Q * Delta + W
191
+ # = (P + U) * Delta + (V + U * Delta)
192
+ # = P * Delta + U * Delta + V + U * Delta
193
+ # = P * Delta + V
194
+ #
195
+ # Sender computes Tag = Decode(K, x) - H(x) * Delta
196
+ # If x in Intersection: P(x) = H(x)
197
+ # Tag = (P(x) * Delta + V(x)) - P(x) * Delta
198
+ # Tag = V(x)
199
+
200
+ def _sender_ops(x: Any, q: Any, w: Any, delta: Any, seed: Any) -> Any:
201
+ # q, w: (M, 2)
202
+ # delta: (2,)
203
+
204
+ # Safe tiling assuming M is aligned
205
+ def _tile_m_simple(d: Any) -> Any:
206
+ return jnp.tile(d, (M, 1))
207
+
208
+ delta_expanded_m = tensor.run_jax(_tile_m_simple, delta)
209
+
210
+ # 4.2. Compute Global K = Q * Delta + W
211
+ # This is the O(M) multiplication mentioned in the paper
212
+ q_times_delta = field.mul(q, delta_expanded_m)
213
+ k_storage = field.add(q_times_delta, w)
214
+
215
+ # 4.3 One Decode
216
+ # decoded_val = P(x)*Delta + V(x)
217
+ decoded_k = okvs.decode(x, k_storage, seed)
218
+
219
+ # 4.4 Remove H(x)*Delta
220
+ def _reshape_seeds(items: Any) -> Any:
221
+ lo = items
222
+ hi = jnp.zeros_like(items)
223
+ return jnp.stack([lo, hi], axis=1)
224
+
225
+ seeds_x = tensor.run_jax(_reshape_seeds, x)
226
+ res_exp_x = field.aes_expand(seeds_x, 1)
227
+
228
+ def _davies_meyer(enc: Any, s: Any) -> Any:
229
+ enc_flat = enc.reshape(enc.shape[0], 2)
230
+ return jnp.bitwise_xor(enc_flat, s)
231
+
232
+ h_x = tensor.run_jax(_davies_meyer, res_exp_x, seeds_x)
233
+
234
+ # Expand delta for batch N
235
+ def _tile_n(d: Any) -> Any:
236
+ return jnp.tile(d, (n, 1))
237
+
238
+ delta_expanded_n = tensor.run_jax(_tile_n, delta)
239
+
240
+ h_x_times_delta = field.mul(h_x, delta_expanded_n)
241
+
242
+ # Final Tag = (P*Delta + V) + H*Delta = V(x)
243
+ tag = field.add(decoded_k, h_x_times_delta)
244
+
245
+ return tag
246
+
247
+ # Execute on Sender
248
+ sender_tags = simp.pcall_static(
249
+ (sender,),
250
+ _sender_ops,
251
+ sender_items,
252
+ q_sender_view,
253
+ w_sender,
254
+ delta_sender,
255
+ okvs_seed_sender,
256
+ )
257
+ # =========================================================================
258
+ # Phase 5. Verification (Receiver Side)
259
+ # =========================================================================
260
+ # Sender sends Tags (which should be V(x)) to Receiver. To reduce
261
+ # communication we hash and truncate on the sender side and only send
262
+ # the truncated hash (first 16 bytes).
263
+
264
+ # 5.1 Compute hashed & truncated tags on Sender
265
+ from mplang.v2.libs.mpc.ot import extension as ot_extension
266
+
267
+ def _hash_and_trunc(tags: Any) -> Any:
268
+ # Compute batched hash on sender and truncate to 16 bytes
269
+ full_h = ot_extension.vec_hash(tags, domain_sep=0x1111, num_rows=n)
270
+ # Use tensor.slice_tensor to slice TraceObjects (start=(0,0), end=(n,16))
271
+ return tensor.slice_tensor(full_h, (0, 0), (n, 16))
272
+
273
+ h_sender_trunc = simp.pcall_static((sender,), _hash_and_trunc, sender_tags)
274
+
275
+ # 5.2 Send truncated hashes to Receiver (much smaller payload)
276
+ tags_at_recv = simp.shuffle_static(h_sender_trunc, {receiver: sender})
277
+
278
+ # 5.3 Receiver computes local V(y) and compares
279
+ def _recv_verify(y: Any, v: Any, seed: Any, remote_tags: Any) -> Any:
280
+ # 1. Decode V locally: target = V(y)
281
+ local_v_y = okvs.decode(y, v, seed)
282
+
283
+ # 2. Hash local V(y) and compare with received truncated sender hashes
284
+ # Note: `remote_tags` here is already the truncated hash (16 bytes)
285
+ # sent from the Sender.
286
+ h_local = ot_extension.vec_hash(local_v_y, domain_sep=0x1111, num_rows=n)
287
+
288
+ def _core(h_r16: Any, h_l_full: Any) -> Any:
289
+ # h_r16: (n, 16) truncated bytes from sender
290
+ # h_l_full: (n, k) full hash bytes; truncate to 16
291
+ h_l16 = h_l_full[:, :16]
292
+
293
+ eq_matrix = jnp.all(h_r16[:, None, :] == h_l16[None, :, :], axis=2)
294
+ membership = jnp.any(eq_matrix, axis=0)
295
+ return membership.astype(jnp.uint8)
296
+
297
+ return tensor.run_jax(_core, remote_tags, h_local)
298
+
299
+ intersection_mask = simp.pcall_static(
300
+ (receiver,), _recv_verify, receiver_items, v_recv, okvs_seed, tags_at_recv
301
+ )
302
+
303
+ return cast(el.Object, intersection_mask)
@@ -201,7 +201,7 @@ def _run_psi_simulation(
201
201
 
202
202
  traced = mp.compile(job)
203
203
  mask_obj = mp.evaluate(traced)
204
- mask_val = mp.fetch(mask_obj)[SENDER]
204
+ mask_val = mp.fetch(mask_obj)[RECEIVER]
205
205
  return mask_val
206
206
 
207
207
 
@@ -225,8 +225,9 @@ def test_rr22_partial_intersection() -> None:
225
225
 
226
226
  mask_val = _run_psi_simulation(sender_items, receiver_items)
227
227
 
228
- # Compute expected mask: 1 if sender_item is in common_items, else 0
229
- expected_mask = np.isin(sender_items, common_items).astype(np.uint8)
228
+ # Compute expected mask: 1 if receiver_item is in common_items, else 0
229
+ # (PSI returns mask located at Receiver)
230
+ expected_mask = np.isin(receiver_items, common_items).astype(np.uint8)
230
231
 
231
232
  np.testing.assert_array_equal(
232
233
  mask_val,
@@ -275,8 +276,8 @@ def test_rr22_single_element_intersection() -> None:
275
276
 
276
277
  mask_val = _run_psi_simulation(sender_items, receiver_items)
277
278
 
278
- # Exactly one element should match
279
- expected_mask = (sender_items == common_item).astype(np.uint8)
279
+ # Exactly one element should match (mask is for receiver's items)
280
+ expected_mask = (receiver_items == common_item).astype(np.uint8)
280
281
 
281
282
  np.testing.assert_array_equal(
282
283
  mask_val,