mplang-nightly 0.1.dev253__tar.gz → 0.1.dev254__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.dev254}/PKG-INFO +1 -1
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/mem.py +4 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/cli.py +1 -1
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/context.py +4 -4
- mplang_nightly-0.1.dev254/mplang/v2/libs/ml/__init__.py +23 -0
- {mplang_nightly-0.1.dev253/examples/v2 → mplang_nightly-0.1.dev254/mplang/v2/libs/ml}/sgb.py +16 -283
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/ldpc.py +3 -2
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/interpreter.py +26 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/pyproject.toml +9 -5
- mplang_nightly-0.1.dev254/tests/v2/conftest.py +54 -0
- mplang_nightly-0.1.dev254/tests/v2/libs/ml/__init__.py +15 -0
- mplang_nightly-0.1.dev254/tests/v2/libs/ml/test_sgb.py +164 -0
- mplang_nightly-0.1.dev253/examples/v2/sgb_bench.py → mplang_nightly-0.1.dev254/tests/v2/libs/ml/test_sgb_bench.py +1 -2
- mplang_nightly-0.1.dev254/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.dev254}/.gitignore +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/LICENSE +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/conf/3pc.yaml +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/models.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/stax_nn.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/hist_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/hist_jax_test.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/naive_np.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/readme.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/sgb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/sgb_test.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/_device.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/analysis/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/analysis/diagram.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/context_mgr.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/ast.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/evaluator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/transformer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/visitor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/walk.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/interp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mask.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mpir.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mpobject.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mptype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/pfunc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/host.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/context.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/mock_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/stablehlo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/jax_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/sql_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/cli.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/client.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/communicator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/data_providers.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/exceptions.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/http_api.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/link_comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/server.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/session.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/simulation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/api.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/mpi.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/party.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/random.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/smpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/spu_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/table_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/mem.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/spu_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/typing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/okvs_opt.cpp +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/api.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/analysis/test_diagram.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_ast.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_walk.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_cluster.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_dtype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mask.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mpir.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mptype.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/device/test_device_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_http_e2e.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_tee_workflow.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_tutorials.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_unused_param_integration.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_debug_print.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_kernel_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_stablehlo.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_value.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_value_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/dummy.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_basic_pack.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_feop_base.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_jax_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_spu_defensive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_sql_cc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_cli.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_communicator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_server.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_simulation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_mpi.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_random.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_smpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_sugar.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/server_fixtures.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_spu_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_table_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_driver/test_http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_spu_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_okvs.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/okvs_microbench.py → /mplang_nightly-0.1.dev254/tests/v2/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/psi_bench.py → /mplang_nightly-0.1.dev254/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/vole_bench.py → /mplang_nightly-0.1.dev254/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_store.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/run.sh +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/04_run_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/05_pipeline.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/07_run_nnx.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/pitfalls/late_binding.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/pitfalls/rand.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/00_basic.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/01_condition.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/02_whileloop.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/03_stdio.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/04_phe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/05_tee.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/06_fhe.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/07_advanced.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/06_pipeline.py +0 -0
- /mplang_nightly-0.1.dev253/examples/v2/stax_nn.py → /mplang_nightly-0.1.dev254/tutorials/v2/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/__init__.py +0 -0
{mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/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
|
|
@@ -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.dev254/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)
|
|
@@ -300,12 +300,13 @@ def generate_sparse_noise(n: int, weight: int) -> el.Object:
|
|
|
300
300
|
|
|
301
301
|
# Generate unique indices using rejection-free Fisher-Yates-like approach
|
|
302
302
|
# Map random u64 to positions while ensuring uniqueness
|
|
303
|
-
|
|
303
|
+
# Use int64 to avoid dtype mismatch warning in scatter operations
|
|
304
|
+
positions = jnp.zeros(weight, dtype=jnp.int64)
|
|
304
305
|
|
|
305
306
|
# Build positions array (unrolled for JAX compatibility)
|
|
306
307
|
for i in range(weight):
|
|
307
308
|
# Map random value to remaining range [0, n-i)
|
|
308
|
-
pos = jnp.
|
|
309
|
+
pos = jnp.int64(idx_entropy[i] % (n - i))
|
|
309
310
|
|
|
310
311
|
# Shift position to avoid already-used indices
|
|
311
312
|
# Count how many existing positions are <= current pos
|
|
@@ -360,6 +360,32 @@ class Interpreter(AbstractInterpreter):
|
|
|
360
360
|
self.trace_pid = trace_pid
|
|
361
361
|
self.store: ObjectStore | None = store
|
|
362
362
|
|
|
363
|
+
def shutdown(self) -> None:
|
|
364
|
+
"""Shutdown the interpreter and release resources.
|
|
365
|
+
|
|
366
|
+
This method is idempotent and safe to call multiple times.
|
|
367
|
+
It performs the following cleanup:
|
|
368
|
+
1. Shuts down the internal executor (if any).
|
|
369
|
+
2. Stops the execution tracer (if any).
|
|
370
|
+
3. Shuts down any attached dialect states (e.g., stopping drivers).
|
|
371
|
+
"""
|
|
372
|
+
# 1. Shutdown Executor
|
|
373
|
+
if self.executor:
|
|
374
|
+
self.executor.shutdown(wait=True)
|
|
375
|
+
self.executor = None
|
|
376
|
+
|
|
377
|
+
# 2. Stop Tracer
|
|
378
|
+
if self.tracer:
|
|
379
|
+
self.tracer.stop()
|
|
380
|
+
# Don't clear self.tracer, as we might want to read stats later
|
|
381
|
+
|
|
382
|
+
# 3. Shutdown Dialect States
|
|
383
|
+
# Iterate over all attached states (e.g., drivers, cluster managers)
|
|
384
|
+
# and shut them down if they support it.
|
|
385
|
+
for state in self._states.values():
|
|
386
|
+
if hasattr(state, "shutdown") and callable(state.shutdown):
|
|
387
|
+
state.shutdown()
|
|
388
|
+
|
|
363
389
|
# =========================================================================
|
|
364
390
|
# Dialect State Management
|
|
365
391
|
# =========================================================================
|
|
@@ -49,6 +49,7 @@ mplang-cli = "mplang.runtime.cli:main"
|
|
|
49
49
|
[dependency-groups]
|
|
50
50
|
dev = [
|
|
51
51
|
"pytest",
|
|
52
|
+
"pytest-benchmark",
|
|
52
53
|
"pytest-cov",
|
|
53
54
|
"pytest-asyncio",
|
|
54
55
|
"ruff",
|
|
@@ -174,12 +175,15 @@ testpaths = ["tests"]
|
|
|
174
175
|
python_files = ["test_*.py"]
|
|
175
176
|
python_classes = ["Test*"]
|
|
176
177
|
python_functions = ["test_*"]
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
# Skip benchmark files by default (to run: pytest --ignore-glob='' or pytest tests/*_bench.py)
|
|
179
|
+
addopts = "--strict-markers --strict-config --ignore-glob=*_bench.py"
|
|
180
|
+
markers = [
|
|
181
|
+
"integration: cross-module or multi-party integration tests",
|
|
182
|
+
"benchmark: performance benchmark tests (deselected by default)",
|
|
183
|
+
]
|
|
179
184
|
filterwarnings = [
|
|
180
|
-
# Suppress insecure mock TEE warnings in tests
|
|
181
|
-
"ignore:Insecure mock TEE
|
|
182
|
-
"ignore:Insecure mock TEE kernel 'mock_tee.attest' in use.*:UserWarning",
|
|
185
|
+
# Suppress insecure mock TEE warnings in tests (expected for local testing)
|
|
186
|
+
"ignore:Insecure mock TEE operation.*:UserWarning",
|
|
183
187
|
]
|
|
184
188
|
|
|
185
189
|
# Taskipy configuration for task management (mirrors .github/workflows checks)
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
import warnings
|
|
16
|
+
|
|
17
|
+
import jax
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
# Disable JAX persistent compilation cache to avoid warnings in tests
|
|
21
|
+
# (cache fails when jax_compilation_cache_dir is not configured)
|
|
22
|
+
jax.config.update("jax_enable_compilation_cache", False)
|
|
23
|
+
|
|
24
|
+
# Suppress known TEE mock warnings in tests (expected for local testing)
|
|
25
|
+
warnings.filterwarnings("ignore", message=".*Insecure mock TEE.*")
|
|
26
|
+
|
|
27
|
+
import mplang.v2.edsl.context # noqa: E402
|
|
28
|
+
from mplang.v2.dialects import simp # noqa: E402
|
|
29
|
+
from tests.v2.utils.tensor_patch import patch_object_operators # noqa: E402
|
|
30
|
+
|
|
31
|
+
# Apply tensor operator overloading patch for tests
|
|
32
|
+
patch_object_operators()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture
|
|
36
|
+
def simp_simulator_default():
|
|
37
|
+
"""Provide a SIMP simulator context for tests that need it.
|
|
38
|
+
|
|
39
|
+
Usage: Add @pytest.mark.usefixtures("simp_simulator_default") to test classes
|
|
40
|
+
or use simp_simulator_default fixture parameter in test functions.
|
|
41
|
+
"""
|
|
42
|
+
sim = simp.make_simulator(world_size=3)
|
|
43
|
+
with sim:
|
|
44
|
+
yield sim
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.fixture(autouse=True)
|
|
48
|
+
def reset_context_stack():
|
|
49
|
+
"""Reset the context stack before and after each test."""
|
|
50
|
+
# Clear context stack for test isolation
|
|
51
|
+
mplang.v2.edsl.context._context_stack.clear()
|
|
52
|
+
yield
|
|
53
|
+
# Clear again after test
|
|
54
|
+
mplang.v2.edsl.context._context_stack.clear()
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
"""Tests for machine learning algorithms."""
|