mplang-nightly 0.1.dev253__tar.gz → 0.1.dev255__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.dev253 → mplang_nightly-0.1.dev255}/PKG-INFO +1 -1
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/mem.py +4 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/spu_impl.py +10 -79
- mplang_nightly-0.1.dev255/mplang/v2/backends/spu_state.py +124 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/cli.py +1 -1
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/context.py +4 -4
- mplang_nightly-0.1.dev255/mplang/v2/libs/ml/__init__.py +23 -0
- {mplang_nightly-0.1.dev253/examples/v2 → mplang_nightly-0.1.dev255/mplang/v2/libs/ml}/sgb.py +16 -283
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/ldpc.py +3 -2
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/interpreter.py +26 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/pyproject.toml +9 -5
- mplang_nightly-0.1.dev255/tests/v2/conftest.py +54 -0
- mplang_nightly-0.1.dev255/tests/v2/libs/ml/__init__.py +15 -0
- mplang_nightly-0.1.dev255/tests/v2/libs/ml/test_sgb.py +164 -0
- mplang_nightly-0.1.dev253/examples/v2/sgb_bench.py → mplang_nightly-0.1.dev255/tests/v2/libs/ml/test_sgb_bench.py +1 -2
- mplang_nightly-0.1.dev255/tutorials/v2/02_simulation_and_driver.py +124 -0
- mplang_nightly-0.1.dev253/examples/v2/bfv_sort_agg.py +0 -213
- mplang_nightly-0.1.dev253/examples/v2/pcall_jax.py +0 -89
- mplang_nightly-0.1.dev253/examples/v2/phe_sort_agg.py +0 -190
- mplang_nightly-0.1.dev253/examples/v2/secure_shuffle_agg.py +0 -131
- mplang_nightly-0.1.dev253/tests/v2/conftest.py +0 -46
- mplang_nightly-0.1.dev253/tutorials/v2/02_simulation_and_driver.py +0 -181
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/.gitignore +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/LICENSE +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/conf/3pc.yaml +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/models.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/stax_nn.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/hist_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/hist_jax_test.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/naive_np.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/readme.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/sgb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/sgb_test.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/_device.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/analysis/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/analysis/diagram.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/context_mgr.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/ast.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/evaluator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/transformer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/visitor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/walk.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/interp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mask.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mpir.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mpobject.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mptype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/pfunc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/host.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/context.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/mock_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/stablehlo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/jax_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/sql_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/cli.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/client.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/communicator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/data_providers.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/exceptions.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/http_api.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/link_comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/server.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/session.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/simulation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/api.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/mpi.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/party.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/random.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/smpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/spu_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/table_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/mem.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/typing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/okvs_opt.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/api.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/analysis/test_diagram.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_ast.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_walk.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_dtype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mask.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mpir.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mptype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/device/test_device_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_http_e2e.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_tee_workflow.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_tutorials.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_unused_param_integration.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_debug_print.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_kernel_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_stablehlo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_value_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/dummy.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_basic_pack.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_feop_base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_jax_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_spu_defensive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_sql_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_cli.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_communicator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_server.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_simulation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_mpi.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_random.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_smpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_sugar.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/server_fixtures.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_spu_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_table_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_driver/test_http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_spu_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_okvs.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/okvs_microbench.py → /mplang_nightly-0.1.dev255/tests/v2/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/psi_bench.py → /mplang_nightly-0.1.dev255/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/vole_bench.py → /mplang_nightly-0.1.dev255/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/run.sh +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/04_run_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/05_pipeline.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/07_run_nnx.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/pitfalls/late_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/pitfalls/rand.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/00_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/01_condition.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/02_whileloop.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/03_stdio.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/04_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/05_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/06_fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/07_advanced.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/06_pipeline.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/stax_nn.py → /mplang_nightly-0.1.dev255/tutorials/v2/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/__init__.py +0 -0
{mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/mem.py
RENAMED
|
@@ -154,6 +154,10 @@ class SimpMemDriver(SimpDriver):
|
|
|
154
154
|
self._workers = workers
|
|
155
155
|
self._mesh = mesh
|
|
156
156
|
|
|
157
|
+
def shutdown(self) -> None:
|
|
158
|
+
"""Shutdown the local memory driver and its mesh."""
|
|
159
|
+
self._mesh.shutdown()
|
|
160
|
+
|
|
157
161
|
@property
|
|
158
162
|
def world_size(self) -> int:
|
|
159
163
|
return self._world_size
|
|
@@ -27,6 +27,7 @@ import spu.api as spu_api
|
|
|
27
27
|
import spu.libspu as libspu
|
|
28
28
|
|
|
29
29
|
from mplang.v2.backends.simp_worker import SimpWorker
|
|
30
|
+
from mplang.v2.backends.spu_state import SPUState
|
|
30
31
|
from mplang.v2.backends.tensor_impl import TensorValue
|
|
31
32
|
from mplang.v2.dialects import spu
|
|
32
33
|
from mplang.v2.edsl import serde
|
|
@@ -107,84 +108,6 @@ def to_runtime_config(config: spu.SPUConfig) -> libspu.RuntimeConfig:
|
|
|
107
108
|
return runtime_config
|
|
108
109
|
|
|
109
110
|
|
|
110
|
-
# Global cache for SPU runtimes per (local_rank, world_size) pair
|
|
111
|
-
# Key: (local_rank, spu_world_size, protocol, field, link_mode), Value: (Runtime, Io)
|
|
112
|
-
_SPU_RUNTIMES: dict[
|
|
113
|
-
tuple[int, int, str, str, str], tuple[spu_api.Runtime, spu_api.Io]
|
|
114
|
-
] = {}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def _create_mem_link(local_rank: int, spu_world_size: int) -> libspu.link.Context:
|
|
118
|
-
"""Create in-memory link for simulation."""
|
|
119
|
-
desc = libspu.link.Desc() # type: ignore
|
|
120
|
-
desc.recv_timeout_ms = 30 * 1000
|
|
121
|
-
for i in range(spu_world_size):
|
|
122
|
-
desc.add_party(f"P{i}", f"mem:{i}")
|
|
123
|
-
return libspu.link.create_mem(desc, local_rank)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def _create_brpc_link(local_rank: int, spu_endpoints: list[str]) -> libspu.link.Context:
|
|
127
|
-
"""Create BRPC link for distributed execution.
|
|
128
|
-
|
|
129
|
-
Args:
|
|
130
|
-
local_rank: The local rank within the SPU device (0-indexed).
|
|
131
|
-
spu_endpoints: List of BRPC endpoints for all SPU parties.
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
A libspu.link.Context for BRPC communication.
|
|
135
|
-
"""
|
|
136
|
-
desc = libspu.link.Desc() # type: ignore
|
|
137
|
-
desc.recv_timeout_ms = 100 * 1000 # 100 seconds
|
|
138
|
-
desc.http_max_payload_size = 32 * 1024 * 1024 # 32MB
|
|
139
|
-
|
|
140
|
-
for i, endpoint in enumerate(spu_endpoints):
|
|
141
|
-
desc.add_party(f"P{i}", endpoint)
|
|
142
|
-
|
|
143
|
-
return libspu.link.create_brpc(desc, local_rank)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def _get_spu_ctx(
|
|
147
|
-
local_rank: int,
|
|
148
|
-
spu_world_size: int,
|
|
149
|
-
config: spu.SPUConfig,
|
|
150
|
-
spu_endpoints: list[str] | None = None,
|
|
151
|
-
) -> tuple[spu_api.Runtime, spu_api.Io]:
|
|
152
|
-
"""Get or create SPU runtime and IO for the given local rank within SPU.
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
local_rank: The local rank within the SPU device (0-indexed).
|
|
156
|
-
spu_world_size: The number of parties in the SPU device.
|
|
157
|
-
config: SPU configuration including protocol settings.
|
|
158
|
-
spu_endpoints: Optional list of BRPC endpoints. If None, use mem link.
|
|
159
|
-
|
|
160
|
-
Returns:
|
|
161
|
-
A tuple of (Runtime, Io) for this party.
|
|
162
|
-
"""
|
|
163
|
-
# Determine link mode
|
|
164
|
-
link_mode = "brpc" if spu_endpoints else "mem"
|
|
165
|
-
|
|
166
|
-
# Include protocol, field, and link_mode in cache key
|
|
167
|
-
cache_key = (local_rank, spu_world_size, config.protocol, config.field, link_mode)
|
|
168
|
-
if cache_key in _SPU_RUNTIMES:
|
|
169
|
-
return _SPU_RUNTIMES[cache_key]
|
|
170
|
-
|
|
171
|
-
# Create Link
|
|
172
|
-
if spu_endpoints:
|
|
173
|
-
link = _create_brpc_link(local_rank, spu_endpoints)
|
|
174
|
-
else:
|
|
175
|
-
link = _create_mem_link(local_rank, spu_world_size)
|
|
176
|
-
|
|
177
|
-
# Use config from SPUConfig
|
|
178
|
-
runtime_config = to_runtime_config(config)
|
|
179
|
-
|
|
180
|
-
# Create Runtime and Io
|
|
181
|
-
runtime = spu_api.Runtime(link, runtime_config)
|
|
182
|
-
io = spu_api.Io(spu_world_size, runtime_config)
|
|
183
|
-
|
|
184
|
-
_SPU_RUNTIMES[cache_key] = (runtime, io)
|
|
185
|
-
return runtime, io
|
|
186
|
-
|
|
187
|
-
|
|
188
111
|
@spu.makeshares_p.def_impl
|
|
189
112
|
def makeshares_impl(
|
|
190
113
|
interpreter: Interpreter, op: Operation, data: TensorValue
|
|
@@ -293,7 +216,15 @@ def exec_impl(interpreter: Interpreter, op: Operation, *args: Any) -> Any:
|
|
|
293
216
|
)
|
|
294
217
|
spu_endpoints.append(spu_endpoints_map[party_rank])
|
|
295
218
|
|
|
296
|
-
|
|
219
|
+
# Get or create SPUState for caching Runtime/Io
|
|
220
|
+
spu_state = interpreter.get_dialect_state(SPUState.dialect_name)
|
|
221
|
+
if not isinstance(spu_state, SPUState):
|
|
222
|
+
spu_state = SPUState()
|
|
223
|
+
interpreter.set_dialect_state(SPUState.dialect_name, spu_state)
|
|
224
|
+
|
|
225
|
+
runtime, io = spu_state.get_or_create(
|
|
226
|
+
local_rank, spu_world_size, config, spu_endpoints
|
|
227
|
+
)
|
|
297
228
|
|
|
298
229
|
executable_code = op.attrs["executable"]
|
|
299
230
|
input_names = op.attrs["input_names"]
|
|
@@ -0,0 +1,124 @@
|
|
|
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
|
+
"""SPU Dialect State.
|
|
16
|
+
|
|
17
|
+
Manages SPU Runtime lifecycle as a dialect state, enabling reuse across
|
|
18
|
+
multiple executions while binding to the Interpreter's lifecycle.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import TYPE_CHECKING
|
|
24
|
+
|
|
25
|
+
import spu.api as spu_api
|
|
26
|
+
import spu.libspu as libspu
|
|
27
|
+
|
|
28
|
+
from mplang.v2.runtime.dialect_state import DialectState
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from mplang.v2.dialects import spu
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class SPUState(DialectState):
|
|
35
|
+
"""SPU Runtime cache as dialect state.
|
|
36
|
+
|
|
37
|
+
Caches SPU Runtime and Io objects per (local_rank, world_size, config, link_mode)
|
|
38
|
+
to enable reuse across multiple SPU kernel executions.
|
|
39
|
+
|
|
40
|
+
This replaces the previous global `_SPU_RUNTIMES` cache with a properly
|
|
41
|
+
lifecycle-managed dialect state.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
dialect_name: str = "spu"
|
|
45
|
+
|
|
46
|
+
def __init__(self) -> None:
|
|
47
|
+
# Key: (local_rank, world_size, protocol, field, link_mode)
|
|
48
|
+
# Value: (Runtime, Io)
|
|
49
|
+
self._runtimes: dict[
|
|
50
|
+
tuple[int, int, str, str, str], tuple[spu_api.Runtime, spu_api.Io]
|
|
51
|
+
] = {}
|
|
52
|
+
|
|
53
|
+
def get_or_create(
|
|
54
|
+
self,
|
|
55
|
+
local_rank: int,
|
|
56
|
+
spu_world_size: int,
|
|
57
|
+
config: spu.SPUConfig,
|
|
58
|
+
spu_endpoints: list[str] | None = None,
|
|
59
|
+
) -> tuple[spu_api.Runtime, spu_api.Io]:
|
|
60
|
+
"""Get or create SPU Runtime and Io for the given configuration.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
local_rank: The local rank within the SPU device (0-indexed).
|
|
64
|
+
spu_world_size: The number of parties in the SPU device.
|
|
65
|
+
config: SPU configuration including protocol settings.
|
|
66
|
+
spu_endpoints: Optional list of BRPC endpoints. If None, use mem link.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
A tuple of (Runtime, Io) for this party.
|
|
70
|
+
"""
|
|
71
|
+
from mplang.v2.backends.spu_impl import to_runtime_config
|
|
72
|
+
|
|
73
|
+
link_mode = "brpc" if spu_endpoints else "mem"
|
|
74
|
+
cache_key = (
|
|
75
|
+
local_rank,
|
|
76
|
+
spu_world_size,
|
|
77
|
+
config.protocol,
|
|
78
|
+
config.field,
|
|
79
|
+
link_mode,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if cache_key in self._runtimes:
|
|
83
|
+
return self._runtimes[cache_key]
|
|
84
|
+
|
|
85
|
+
# Create Link
|
|
86
|
+
if spu_endpoints:
|
|
87
|
+
link = self._create_brpc_link(local_rank, spu_endpoints)
|
|
88
|
+
else:
|
|
89
|
+
link = self._create_mem_link(local_rank, spu_world_size)
|
|
90
|
+
|
|
91
|
+
# Create Runtime and Io
|
|
92
|
+
runtime_config = to_runtime_config(config)
|
|
93
|
+
runtime = spu_api.Runtime(link, runtime_config)
|
|
94
|
+
io = spu_api.Io(spu_world_size, runtime_config)
|
|
95
|
+
|
|
96
|
+
self._runtimes[cache_key] = (runtime, io)
|
|
97
|
+
return runtime, io
|
|
98
|
+
|
|
99
|
+
def _create_mem_link(
|
|
100
|
+
self, local_rank: int, spu_world_size: int
|
|
101
|
+
) -> libspu.link.Context:
|
|
102
|
+
"""Create in-memory link for simulation."""
|
|
103
|
+
desc = libspu.link.Desc() # type: ignore
|
|
104
|
+
desc.recv_timeout_ms = 30 * 1000
|
|
105
|
+
for i in range(spu_world_size):
|
|
106
|
+
desc.add_party(f"P{i}", f"mem:{i}")
|
|
107
|
+
return libspu.link.create_mem(desc, local_rank)
|
|
108
|
+
|
|
109
|
+
def _create_brpc_link(
|
|
110
|
+
self, local_rank: int, spu_endpoints: list[str]
|
|
111
|
+
) -> libspu.link.Context:
|
|
112
|
+
"""Create BRPC link for distributed execution."""
|
|
113
|
+
desc = libspu.link.Desc() # type: ignore
|
|
114
|
+
desc.recv_timeout_ms = 100 * 1000 # 100 seconds
|
|
115
|
+
desc.http_max_payload_size = 32 * 1024 * 1024 # 32MB
|
|
116
|
+
|
|
117
|
+
for i, endpoint in enumerate(spu_endpoints):
|
|
118
|
+
desc.add_party(f"P{i}", endpoint)
|
|
119
|
+
|
|
120
|
+
return libspu.link.create_brpc(desc, local_rank)
|
|
121
|
+
|
|
122
|
+
def shutdown(self) -> None:
|
|
123
|
+
"""Clear all cached runtimes."""
|
|
124
|
+
self._runtimes.clear()
|
|
@@ -62,7 +62,7 @@ def run_worker(
|
|
|
62
62
|
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
|
63
63
|
signal.signal(signal.SIGTERM, signal.SIG_DFL)
|
|
64
64
|
|
|
65
|
-
from mplang.v2.backends.
|
|
65
|
+
from mplang.v2.backends.simp_worker.http import create_worker_app
|
|
66
66
|
|
|
67
67
|
app = create_worker_app(rank, world_size, endpoints, spu_endpoints)
|
|
68
68
|
|
|
@@ -69,7 +69,7 @@ class Context(ABC):
|
|
|
69
69
|
"""
|
|
70
70
|
|
|
71
71
|
def __init__(self) -> None:
|
|
72
|
-
self.
|
|
72
|
+
self._states: dict[str, Any] = {}
|
|
73
73
|
|
|
74
74
|
# =========================================================================
|
|
75
75
|
# State Management
|
|
@@ -82,7 +82,7 @@ class Context(ABC):
|
|
|
82
82
|
key: State key (e.g., "dialect.simp", "device.cluster")
|
|
83
83
|
value: State value
|
|
84
84
|
"""
|
|
85
|
-
self.
|
|
85
|
+
self._states[key] = value
|
|
86
86
|
|
|
87
87
|
def get_state(self, key: str, default: Any = None) -> Any:
|
|
88
88
|
"""Get attached state by key.
|
|
@@ -94,7 +94,7 @@ class Context(ABC):
|
|
|
94
94
|
Returns:
|
|
95
95
|
State value or default
|
|
96
96
|
"""
|
|
97
|
-
return self.
|
|
97
|
+
return self._states.get(key, default)
|
|
98
98
|
|
|
99
99
|
def has_state(self, key: str) -> bool:
|
|
100
100
|
"""Check if state exists.
|
|
@@ -105,7 +105,7 @@ class Context(ABC):
|
|
|
105
105
|
Returns:
|
|
106
106
|
True if state exists
|
|
107
107
|
"""
|
|
108
|
-
return key in self.
|
|
108
|
+
return key in self._states
|
|
109
109
|
|
|
110
110
|
# =========================================================================
|
|
111
111
|
# Abstract Methods
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
"""Machine Learning algorithms for secure multi-party computation."""
|
|
16
|
+
|
|
17
|
+
from mplang.v2.libs.ml.sgb import SecureBoost, Tree, TreeEnsemble
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"SecureBoost",
|
|
21
|
+
"Tree",
|
|
22
|
+
"TreeEnsemble",
|
|
23
|
+
]
|
{mplang_nightly-0.1.dev253/examples/v2 → mplang_nightly-0.1.dev255/mplang/v2/libs/ml}/sgb.py
RENAMED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
# mypy: disable-error-code="no-untyped-def,no-any-return,var-annotated"
|
|
16
|
+
|
|
15
17
|
"""SecureBoost v2: Optimized implementation using mplang.v2 low-level BFV APIs.
|
|
16
18
|
|
|
17
19
|
This implementation improves upon v1 by leveraging BFV SIMD slots and the
|
|
@@ -879,7 +881,7 @@ def _find_splits_pps(
|
|
|
879
881
|
subgroup_map_fn = make_get_subgroup_map(n_level)
|
|
880
882
|
subgroup_map = simp.pcall_static(
|
|
881
883
|
(pp_rank,),
|
|
882
|
-
lambda fn=subgroup_map_fn: tensor.run_jax(fn,
|
|
884
|
+
lambda fn=subgroup_map_fn, bt_lv=bt_level_pp: tensor.run_jax(fn, bt_lv),
|
|
883
885
|
)
|
|
884
886
|
|
|
885
887
|
n_pp_features = n_features_per_party[pp_idx + 1]
|
|
@@ -978,8 +980,8 @@ def _find_splits_pps(
|
|
|
978
980
|
|
|
979
981
|
pp_hists = simp.pcall_static(
|
|
980
982
|
(ap_rank,),
|
|
981
|
-
lambda: tensor.run_jax(
|
|
982
|
-
derive_right_and_combine,
|
|
983
|
+
lambda lh=left_hists, ph=parent_hists: tensor.run_jax(
|
|
984
|
+
derive_right_and_combine, lh, ph
|
|
983
985
|
),
|
|
984
986
|
)
|
|
985
987
|
|
|
@@ -996,7 +998,7 @@ def _find_splits_pps(
|
|
|
996
998
|
|
|
997
999
|
pp_gains, pp_feats, pp_threshs = simp.pcall_static(
|
|
998
1000
|
(ap_rank,),
|
|
999
|
-
lambda: tensor.run_jax(find_splits,
|
|
1001
|
+
lambda h=pp_hists: tensor.run_jax(find_splits, h),
|
|
1000
1002
|
)
|
|
1001
1003
|
|
|
1002
1004
|
pp_gains_list.append(pp_gains)
|
|
@@ -1292,7 +1294,7 @@ def build_tree(
|
|
|
1292
1294
|
# Local bt for this level
|
|
1293
1295
|
bt_level = simp.pcall_static(
|
|
1294
1296
|
(ap_rank,),
|
|
1295
|
-
lambda off=level_offset: tensor.run_jax(lambda
|
|
1297
|
+
lambda off=level_offset, b=bt: tensor.run_jax(lambda x: x - off, b),
|
|
1296
1298
|
)
|
|
1297
1299
|
|
|
1298
1300
|
# === AP: Local histogram computation ===
|
|
@@ -1352,7 +1354,7 @@ def build_tree(
|
|
|
1352
1354
|
|
|
1353
1355
|
best_gains, best_party = simp.pcall_static(
|
|
1354
1356
|
(ap_rank,),
|
|
1355
|
-
lambda: tensor.run_jax(find_global_best, *
|
|
1357
|
+
lambda gains=all_gains: tensor.run_jax(find_global_best, *gains),
|
|
1356
1358
|
)
|
|
1357
1359
|
|
|
1358
1360
|
# === Update Tree State ===
|
|
@@ -1498,8 +1500,9 @@ def predict_tree(
|
|
|
1498
1500
|
(rank,),
|
|
1499
1501
|
lambda d=all_datas[i],
|
|
1500
1502
|
f=tree.feature[i],
|
|
1501
|
-
t=tree.threshold[i]
|
|
1502
|
-
|
|
1503
|
+
t=tree.threshold[i],
|
|
1504
|
+
idx=i: predict_tree_single_party(
|
|
1505
|
+
d, f, t, tree.is_leaf, tree.owned_party_id, idx, n_nodes
|
|
1503
1506
|
),
|
|
1504
1507
|
)
|
|
1505
1508
|
# Transfer to AP
|
|
@@ -1564,7 +1567,7 @@ def predict_ensemble(
|
|
|
1564
1567
|
|
|
1565
1568
|
y_pred_logits = simp.pcall_static(
|
|
1566
1569
|
(ap_rank,),
|
|
1567
|
-
lambda: tensor.run_jax(update_pred,
|
|
1570
|
+
lambda yp=y_pred_logits, tp=tree_pred: tensor.run_jax(update_pred, yp, tp),
|
|
1568
1571
|
)
|
|
1569
1572
|
|
|
1570
1573
|
# Convert logits to probabilities
|
|
@@ -1634,7 +1637,9 @@ def fit_tree_ensemble(
|
|
|
1634
1637
|
|
|
1635
1638
|
gh, qg, qh = simp.pcall_static(
|
|
1636
1639
|
(ap_rank,),
|
|
1637
|
-
lambda: tensor.run_jax(
|
|
1640
|
+
lambda yp=y_pred: tensor.run_jax(
|
|
1641
|
+
compute_gh_quantized, y_data, yp, fxp_scale
|
|
1642
|
+
),
|
|
1638
1643
|
)
|
|
1639
1644
|
|
|
1640
1645
|
# FHE encrypt only if we have passive parties
|
|
@@ -1678,7 +1683,7 @@ def fit_tree_ensemble(
|
|
|
1678
1683
|
|
|
1679
1684
|
y_pred = simp.pcall_static(
|
|
1680
1685
|
(ap_rank,),
|
|
1681
|
-
lambda: tensor.run_jax(update_pred_fn,
|
|
1686
|
+
lambda yp=y_pred, tp=tree_pred: tensor.run_jax(update_pred_fn, yp, tp),
|
|
1682
1687
|
)
|
|
1683
1688
|
|
|
1684
1689
|
return TreeEnsemble(
|
|
@@ -1866,275 +1871,3 @@ class SecureBoost:
|
|
|
1866
1871
|
lambda: tensor.run_jax(compute_metrics, y_prob, y_data),
|
|
1867
1872
|
)
|
|
1868
1873
|
return accuracy
|
|
1869
|
-
|
|
1870
|
-
# ==============================================================================
|
|
1871
|
-
# Main
|
|
1872
|
-
# ==============================================================================
|
|
1873
|
-
|
|
1874
|
-
print("=" * 60)
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
def run_sgb_demo(sim):
|
|
1878
|
-
"""Test SecureBoost with 2 parties, enabling BFV FHE.
|
|
1879
|
-
|
|
1880
|
-
AP (party 0) holds labels + some features.
|
|
1881
|
-
PP (party 1) holds remaining features.
|
|
1882
|
-
|
|
1883
|
-
Flow:
|
|
1884
|
-
1. PP encrypts its histogram buckets with BFV
|
|
1885
|
-
2. AP receives encrypted histogram, multiplies with gradient mask
|
|
1886
|
-
3. PP decrypts and aggregates
|
|
1887
|
-
"""
|
|
1888
|
-
import mplang.v2 as mp
|
|
1889
|
-
|
|
1890
|
-
print("=" * 60)
|
|
1891
|
-
print("Multi-Party SecureBoost Test (with BFV FHE)")
|
|
1892
|
-
print("=" * 60)
|
|
1893
|
-
|
|
1894
|
-
# Load BFV backend (registers implementations)
|
|
1895
|
-
from mplang.v2.backends import load_backend
|
|
1896
|
-
|
|
1897
|
-
try:
|
|
1898
|
-
load_backend("mplang.v2.backends.bfv_impl")
|
|
1899
|
-
print("✓ BFV backend loaded successfully")
|
|
1900
|
-
except ImportError as e:
|
|
1901
|
-
print(f"✗ Failed to load BFV backend: {e}")
|
|
1902
|
-
print(" Make sure 'tenseal' is installed: pip install tenseal")
|
|
1903
|
-
return
|
|
1904
|
-
|
|
1905
|
-
# Generate synthetic data for 2 parties
|
|
1906
|
-
np.random.seed(42)
|
|
1907
|
-
n_samples = 100
|
|
1908
|
-
n_features_ap = 3 # AP's features
|
|
1909
|
-
n_features_pp = 2 # PP's features
|
|
1910
|
-
|
|
1911
|
-
# Generate linearly separable data
|
|
1912
|
-
X_all = np.random.randn(n_samples, n_features_ap + n_features_pp).astype(np.float32)
|
|
1913
|
-
y = (X_all[:, 0] + X_all[:, 1] + X_all[:, 3] > 0).astype(np.float32)
|
|
1914
|
-
|
|
1915
|
-
# Split features by party
|
|
1916
|
-
X_ap = X_all[:, :n_features_ap] # Party 0's features
|
|
1917
|
-
X_pp = X_all[:, n_features_ap:] # Party 1's features
|
|
1918
|
-
|
|
1919
|
-
print("\nData Distribution:")
|
|
1920
|
-
print(f" Party 0 (AP): {X_ap.shape} features + labels")
|
|
1921
|
-
print(f" Party 1 (PP): {X_pp.shape} features (encrypted)")
|
|
1922
|
-
|
|
1923
|
-
# Model parameters
|
|
1924
|
-
n_estimators = 2 # Small for test
|
|
1925
|
-
max_depth = 2
|
|
1926
|
-
|
|
1927
|
-
def job():
|
|
1928
|
-
# Put data on respective parties
|
|
1929
|
-
data_ap = mp.put("P0", X_ap)
|
|
1930
|
-
data_pp = mp.put("P1", X_pp)
|
|
1931
|
-
y_data = mp.put("P0", y)
|
|
1932
|
-
|
|
1933
|
-
# Create model with passive party
|
|
1934
|
-
model = SecureBoost(
|
|
1935
|
-
n_estimators=n_estimators,
|
|
1936
|
-
max_depth=max_depth,
|
|
1937
|
-
learning_rate=0.1,
|
|
1938
|
-
max_bin=8,
|
|
1939
|
-
ap_rank=0,
|
|
1940
|
-
pp_ranks=[1], # Party 1 is passive party (uses FHE)
|
|
1941
|
-
)
|
|
1942
|
-
|
|
1943
|
-
print("\nTraining with BFV FHE...")
|
|
1944
|
-
model.fit(
|
|
1945
|
-
[data_ap, data_pp], # Both parties' data
|
|
1946
|
-
y_data,
|
|
1947
|
-
n_samples=n_samples,
|
|
1948
|
-
n_features_per_party=[n_features_ap, n_features_pp],
|
|
1949
|
-
)
|
|
1950
|
-
print("Training complete!")
|
|
1951
|
-
|
|
1952
|
-
# Predict
|
|
1953
|
-
print("\nPredicting...")
|
|
1954
|
-
y_prob = model.predict([data_ap, data_pp], n_samples=n_samples)
|
|
1955
|
-
print(f"Predictions type: {y_prob.type}")
|
|
1956
|
-
return y_prob
|
|
1957
|
-
|
|
1958
|
-
# Execute with 2 parties
|
|
1959
|
-
print("\nExecuting graph with 2 parties...")
|
|
1960
|
-
y_prob_obj = mp.evaluate(job, context=sim)
|
|
1961
|
-
|
|
1962
|
-
# Calculate accuracy
|
|
1963
|
-
y_pred_probs = mp.fetch(y_prob_obj, context=sim)
|
|
1964
|
-
if isinstance(y_pred_probs, list):
|
|
1965
|
-
y_pred_probs = y_pred_probs[0]
|
|
1966
|
-
y_pred_class = (y_pred_probs > 0.5).astype(np.float32)
|
|
1967
|
-
accuracy = np.mean(y_pred_class == y)
|
|
1968
|
-
print(f"\nPredictions (first 10): {y_pred_probs[:10]}")
|
|
1969
|
-
print(f"True labels (first 10): {y[:10]}")
|
|
1970
|
-
print(f"Training Accuracy: {accuracy:.4f}")
|
|
1971
|
-
|
|
1972
|
-
print("\n" + "=" * 60)
|
|
1973
|
-
print("Multi-party test completed!")
|
|
1974
|
-
print("=" * 60)
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
def run_sgb_bench(sim):
|
|
1978
|
-
"""Benchmark SecureBoost with BFV FHE for performance analysis."""
|
|
1979
|
-
import time
|
|
1980
|
-
|
|
1981
|
-
print("=" * 70)
|
|
1982
|
-
print("SecureBoost v2 - Multi-Party FHE Performance Benchmark")
|
|
1983
|
-
print("=" * 70)
|
|
1984
|
-
# Benchmark configurations
|
|
1985
|
-
configs = [
|
|
1986
|
-
# Test m > 4096 case (multi-CT support)
|
|
1987
|
-
{
|
|
1988
|
-
"n_samples": 1000,
|
|
1989
|
-
"n_features_ap": 50,
|
|
1990
|
-
"n_features_pp": 50,
|
|
1991
|
-
"n_trees": 2,
|
|
1992
|
-
"max_depth": 3,
|
|
1993
|
-
},
|
|
1994
|
-
]
|
|
1995
|
-
|
|
1996
|
-
results = []
|
|
1997
|
-
|
|
1998
|
-
for cfg in configs:
|
|
1999
|
-
n_samples = cfg["n_samples"]
|
|
2000
|
-
n_features_ap = cfg["n_features_ap"]
|
|
2001
|
-
n_features_pp = cfg["n_features_pp"]
|
|
2002
|
-
n_trees = cfg["n_trees"]
|
|
2003
|
-
max_depth = cfg["max_depth"]
|
|
2004
|
-
|
|
2005
|
-
print(f"\n{'─' * 70}")
|
|
2006
|
-
print(
|
|
2007
|
-
f"Config: samples={n_samples}, features=({n_features_ap}+{n_features_pp}), "
|
|
2008
|
-
f"trees={n_trees}, depth={max_depth}"
|
|
2009
|
-
)
|
|
2010
|
-
print(f"{'─' * 70}")
|
|
2011
|
-
|
|
2012
|
-
# Generate data
|
|
2013
|
-
np.random.seed(42)
|
|
2014
|
-
X_all = np.random.randn(n_samples, n_features_ap + n_features_pp).astype(
|
|
2015
|
-
np.float32
|
|
2016
|
-
)
|
|
2017
|
-
y = (X_all[:, 0] + X_all[:, 1] > 0).astype(np.float32)
|
|
2018
|
-
X_ap = X_all[:, :n_features_ap]
|
|
2019
|
-
X_pp = X_all[:, n_features_ap:]
|
|
2020
|
-
|
|
2021
|
-
def job():
|
|
2022
|
-
data_ap = mp.put("P0", X_ap)
|
|
2023
|
-
data_pp = mp.put("P1", X_pp)
|
|
2024
|
-
y_data = mp.put("P0", y)
|
|
2025
|
-
|
|
2026
|
-
model = SecureBoost(
|
|
2027
|
-
n_estimators=n_trees,
|
|
2028
|
-
max_depth=max_depth,
|
|
2029
|
-
learning_rate=0.1,
|
|
2030
|
-
max_bin=8,
|
|
2031
|
-
ap_rank=0,
|
|
2032
|
-
pp_ranks=[1],
|
|
2033
|
-
)
|
|
2034
|
-
|
|
2035
|
-
model.fit(
|
|
2036
|
-
[data_ap, data_pp],
|
|
2037
|
-
y_data,
|
|
2038
|
-
n_samples=n_samples,
|
|
2039
|
-
n_features_per_party=[n_features_ap, n_features_pp],
|
|
2040
|
-
)
|
|
2041
|
-
|
|
2042
|
-
y_prob = model.predict([data_ap, data_pp], n_samples=n_samples)
|
|
2043
|
-
return y_prob
|
|
2044
|
-
|
|
2045
|
-
# Measure tracing time
|
|
2046
|
-
t0 = time.perf_counter()
|
|
2047
|
-
traced = mp.compile(job, context=sim)
|
|
2048
|
-
trace_time = time.perf_counter() - t0
|
|
2049
|
-
|
|
2050
|
-
graph = traced.graph
|
|
2051
|
-
n_ops = len(graph.operations)
|
|
2052
|
-
|
|
2053
|
-
print(f" Tracing: {trace_time:.3f}s ({n_ops} ops)")
|
|
2054
|
-
|
|
2055
|
-
# Measure execution time
|
|
2056
|
-
t0 = time.perf_counter()
|
|
2057
|
-
|
|
2058
|
-
y_prob_obj = mp.evaluate(traced, context=sim)
|
|
2059
|
-
exec_time = time.perf_counter() - t0
|
|
2060
|
-
|
|
2061
|
-
# Calculate accuracy
|
|
2062
|
-
y_pred_probs = mp.fetch(y_prob_obj, context=sim)
|
|
2063
|
-
if isinstance(y_pred_probs, list):
|
|
2064
|
-
y_pred_probs = y_pred_probs[0]
|
|
2065
|
-
y_pred_class = (y_pred_probs > 0.5).astype(np.float32)
|
|
2066
|
-
accuracy = np.mean(y_pred_class == y)
|
|
2067
|
-
|
|
2068
|
-
print(f" Execution: {exec_time:.3f}s")
|
|
2069
|
-
print(f" Total: {trace_time + exec_time:.3f}s")
|
|
2070
|
-
print(f" Accuracy: {accuracy:.2%}")
|
|
2071
|
-
|
|
2072
|
-
results.append({
|
|
2073
|
-
"config": cfg,
|
|
2074
|
-
"trace_time": trace_time,
|
|
2075
|
-
"exec_time": exec_time,
|
|
2076
|
-
"n_ops": n_ops,
|
|
2077
|
-
"accuracy": accuracy,
|
|
2078
|
-
})
|
|
2079
|
-
|
|
2080
|
-
# Summary
|
|
2081
|
-
print("\n" + "=" * 70)
|
|
2082
|
-
print("BENCHMARK SUMMARY")
|
|
2083
|
-
print("=" * 70)
|
|
2084
|
-
print(f"{'Config':<40} {'Trace':<10} {'Exec':<10} {'Ops':<8} {'Acc':<8}")
|
|
2085
|
-
print("-" * 70)
|
|
2086
|
-
for r in results:
|
|
2087
|
-
cfg = r["config"]
|
|
2088
|
-
cfg_str = f"n={cfg['n_samples']}, f={cfg['n_features_ap']}+{cfg['n_features_pp']}, t={cfg['n_trees']}, d={cfg['max_depth']}"
|
|
2089
|
-
print(
|
|
2090
|
-
f"{cfg_str:<40} {r['trace_time']:.3f}s {r['exec_time']:.3f}s {r['n_ops']:<8} {r['accuracy']:.2%}"
|
|
2091
|
-
)
|
|
2092
|
-
|
|
2093
|
-
# Analyze operation distribution for last config
|
|
2094
|
-
print("\n" + "=" * 70)
|
|
2095
|
-
print("OPERATION DISTRIBUTION (last config)")
|
|
2096
|
-
print("=" * 70)
|
|
2097
|
-
from collections import Counter
|
|
2098
|
-
|
|
2099
|
-
op_counts = Counter(op.opcode for op in graph.operations)
|
|
2100
|
-
for op_name, count in sorted(op_counts.items(), key=lambda x: -x[1])[:15]:
|
|
2101
|
-
pct = count / n_ops * 100
|
|
2102
|
-
bar = "█" * int(pct / 2)
|
|
2103
|
-
print(f" {op_name:<30} {count:>5} ({pct:>5.1f}%) {bar}")
|
|
2104
|
-
|
|
2105
|
-
# BFV-specific operations
|
|
2106
|
-
bfv_ops = {k: v for k, v in op_counts.items() if k.startswith("bfv.")}
|
|
2107
|
-
if bfv_ops:
|
|
2108
|
-
bfv_total = sum(bfv_ops.values())
|
|
2109
|
-
print(f"\n BFV operations total: {bfv_total} ({bfv_total / n_ops * 100:.1f}%)")
|
|
2110
|
-
for op_name, count in sorted(bfv_ops.items(), key=lambda x: -x[1]):
|
|
2111
|
-
print(f" {op_name:<28} {count:>5}")
|
|
2112
|
-
|
|
2113
|
-
# Print profiling results
|
|
2114
|
-
if hasattr(sim, "backend") and getattr(sim.backend, "profiler", None) is not None:
|
|
2115
|
-
sim.backend.profiler.stop(filename_prefix="sgb_trace")
|
|
2116
|
-
|
|
2117
|
-
profiler = mp.get_profiler()
|
|
2118
|
-
profiler.print_summary() # All ops (includes container overhead)
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
__mp_main__ = run_sgb_demo
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
if __name__ == "__main__":
|
|
2125
|
-
import argparse
|
|
2126
|
-
|
|
2127
|
-
import mplang.v2 as mp
|
|
2128
|
-
|
|
2129
|
-
parser = argparse.ArgumentParser(description="SecureBoost v2 Example")
|
|
2130
|
-
parser.add_argument("--benchmark", action="store_true", help="Run benchmark")
|
|
2131
|
-
parser.add_argument("--profile", action="store_true", help="Enable profiling")
|
|
2132
|
-
args = parser.parse_args()
|
|
2133
|
-
|
|
2134
|
-
# Use high-level Simulator API with profiling if requested
|
|
2135
|
-
sim = mp.make_simulator(2, enable_profiling=args.profile)
|
|
2136
|
-
|
|
2137
|
-
if args.benchmark:
|
|
2138
|
-
run_sgb_bench(sim)
|
|
2139
|
-
else:
|
|
2140
|
-
run_sgb_demo(sim)
|