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.
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/PKG-INFO +1 -1
- mplang_nightly-0.1.dev269/mplang/py.typed +13 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/http.py +1 -1
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/mem.py +1 -1
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/okvs_opt.cpp +16 -1
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/okvs_gct.py +16 -10
- mplang_nightly-0.1.dev269/mplang/v2/libs/mpc/psi/rr22.py +303 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_rr22.py +6 -5
- mplang_nightly-0.1.dev267/mplang/v2/libs/mpc/psi/rr22.py +0 -344
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/.gitignore +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/LICENSE +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/README.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/conf/3pc.yaml +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/README.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/models.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/stax_nn/stax_nn.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/hist_jax.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/hist_jax_test.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/naive_np.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/readme.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/sgb.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/examples/v1/xgboost/sgb_test.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/_device.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/analysis/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/analysis/diagram.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/cluster.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/comm.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/context_mgr.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/dtypes.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/ast.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/evaluator.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/printer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/transformer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/visitor.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/expr/walk.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/interp.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mask.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mpir.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mpobject.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/mptype.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/pfunc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/primitive.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/table.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/tensor.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/core/tracer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/host.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/base.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/basic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/context.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/fhe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/mock_tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/stablehlo.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/kernels/value.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/base.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/basic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/fhe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/jax_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/sql_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/ops/tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/channel.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/cli.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/client.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/communicator.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/data_providers.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/driver.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/exceptions.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/http_api.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/link_comm.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/server.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/session.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/runtime/simulation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/api.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/mpi.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/party.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/random.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/simp/smpc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/spu_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v1/utils/table_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/channel.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/http.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/mem.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/spu_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/spu_state.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/cli.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/README.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/context.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/edsl/typing.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/api.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/ml/sgb.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/ldpc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/interpreter.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/mplang/v2/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/pyproject.toml +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/analysis/test_diagram.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/conftest.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/conftest.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_ast.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_printer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/expr/test_walk.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_cluster.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_dtype.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mask.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mpir.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_mptype.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_table.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/core/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/device/test_device_basic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/README.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_http_e2e.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_tee_workflow.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_tutorials.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/integration/test_unused_param_integration.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_basic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_debug_print.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_fhe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_kernel_binding.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_stablehlo.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_value.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/kernels/test_value_serde.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/dummy.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_basic_pack.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_feop_base.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_jax_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_spu_defensive.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_sql.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_sql_cc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_channel.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_cli.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_communicator.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_driver.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_server.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/runtime/test_simulation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_mpi.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_random.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_smpc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/simp/test_sugar.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/server_fixtures.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_spu_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v1/utils/test_table_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_driver/test_http.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_channel.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_spu_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/conftest.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_okvs.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/test_sgb.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/ml/test_sgb_bench.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/test_store.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tests/v2/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/run.sh +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/04_run_sql.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/05_pipeline.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/device/07_run_nnx.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/pitfalls/late_binding.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/pitfalls/rand.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/00_basic.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/01_condition.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/02_whileloop.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/03_stdio.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/04_phe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/05_tee.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/06_fhe.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/07_advanced.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/06_pipeline.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev267 → mplang_nightly-0.1.dev269}/tutorials/v2/__init__.py +0 -0
|
@@ -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.
|
|
@@ -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, "[
|
|
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.
|
|
44
|
-
- N
|
|
45
|
-
|
|
46
|
-
- N < 10,000: ε = 0.
|
|
47
|
-
- N < 100,000: ε = 0.
|
|
48
|
-
- N ≥ 100,000: ε = 0.35 (M = 1.35N)
|
|
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
|
|
57
|
-
return
|
|
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.
|
|
65
|
+
return 1.6 # Medium scale
|
|
60
66
|
elif n <= 100000:
|
|
61
|
-
return 1.
|
|
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)[
|
|
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
|
|
229
|
-
|
|
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 = (
|
|
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,
|