mplang-nightly 0.1.dev265__tar.gz → 0.1.dev267__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.dev265 → mplang_nightly-0.1.dev267}/PKG-INFO +2 -2
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/phe.py +8 -4
- mplang_nightly-0.1.dev267/mplang/v1/runtime/channel.py +230 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/communicator.py +37 -13
- mplang_nightly-0.1.dev267/mplang/v1/runtime/link_comm.py +196 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/server.py +10 -1
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/session.py +11 -38
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/simulation.py +30 -8
- mplang_nightly-0.1.dev267/mplang/v2/backends/channel.py +217 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/crypto_impl.py +95 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/http.py +44 -13
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/mem.py +9 -6
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/spu_impl.py +18 -5
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/spu_state.py +66 -3
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/crypto.py +101 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/api.py +30 -11
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/ml/sgb.py +20 -32
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/pyproject.toml +1 -1
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_kernel_binding.py +8 -4
- mplang_nightly-0.1.dev267/tests/v1/runtime/test_channel.py +613 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_driver/test_http.py +10 -12
- mplang_nightly-0.1.dev267/tests/v2/backends/test_channel.py +188 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_crypto_impl.py +201 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_spu_impl.py +79 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_crypto.py +70 -0
- mplang_nightly-0.1.dev265/mplang/v1/runtime/link_comm.py +0 -78
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/.gitignore +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/LICENSE +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/README.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/conf/3pc.yaml +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/README.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/models.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/stax_nn.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/hist_jax.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/hist_jax_test.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/naive_np.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/readme.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/sgb.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/sgb_test.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/_device.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/analysis/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/analysis/diagram.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/cluster.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/comm.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/context_mgr.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/dtypes.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/ast.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/evaluator.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/printer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/transformer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/visitor.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/walk.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/interp.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mask.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mpir.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mpobject.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mptype.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/pfunc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/primitive.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/table.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/tensor.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/tracer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/host.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/base.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/basic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/context.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/crypto.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/fhe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/mock_tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/stablehlo.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/value.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/base.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/basic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/crypto.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/fhe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/jax_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/sql_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/cli.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/client.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/data_providers.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/driver.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/exceptions.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/http_api.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/api.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/mpi.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/party.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/random.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/smpc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/crypto.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/spu_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/table_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/http.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/mem.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/cli.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/README.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/context.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/typing.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/okvs_opt.cpp +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/ldpc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/interpreter.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/analysis/test_diagram.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/conftest.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/conftest.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_ast.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_printer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_walk.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_cluster.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_dtype.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mask.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mpir.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mptype.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_table.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/device/test_device_basic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/README.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_http_e2e.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_tee_workflow.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_tutorials.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_unused_param_integration.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_basic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_debug_print.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_fhe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_sql_duckdb.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_stablehlo.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_value.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_value_serde.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/dummy.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_basic_pack.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_feop_base.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_jax_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_nnx_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_spu_defensive.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_sql.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_sql_cc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_cli.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_communicator.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_driver.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_server.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_simulation.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_mpi.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_random.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_smpc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_sugar.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/server_fixtures.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_spu_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_table_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/conftest.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_okvs.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/test_sgb.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/test_sgb_bench.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_store.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/run.sh +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/04_run_sql.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/05_pipeline.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/07_run_nnx.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/pitfalls/late_binding.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/pitfalls/rand.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/00_basic.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/01_condition.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/02_whileloop.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/03_stdio.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/04_phe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/05_tee.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/06_fhe.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/07_advanced.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/06_pipeline.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mplang-nightly
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.dev267
|
|
4
4
|
Summary: Multi-Party Programming Language
|
|
5
5
|
Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
|
|
6
6
|
License: Apache License
|
|
@@ -219,7 +219,7 @@ Requires-Dist: pandas>=2.0.0
|
|
|
219
219
|
Requires-Dist: protobuf<6.0,>=5.0
|
|
220
220
|
Requires-Dist: pyarrow>=14.0.0
|
|
221
221
|
Requires-Dist: pyyaml>=6.0
|
|
222
|
-
Requires-Dist: spu>=0.10.0.
|
|
222
|
+
Requires-Dist: spu>=0.10.0.dev20251211
|
|
223
223
|
Requires-Dist: sqlglot>=23.0.0
|
|
224
224
|
Requires-Dist: tenseal==0.3.16
|
|
225
225
|
Requires-Dist: typing-extensions
|
|
@@ -637,7 +637,8 @@ def _phe_mul(pfunc: PFunction, ciphertext: CipherText, plaintext: TensorValue) -
|
|
|
637
637
|
# Use numpy to create a properly broadcasted index mapping
|
|
638
638
|
# Create a dummy array with same shape as ciphertext, fill with indices
|
|
639
639
|
dummy_ct = (
|
|
640
|
-
np
|
|
640
|
+
np
|
|
641
|
+
.arange(np.prod(ciphertext.semantic_shape))
|
|
641
642
|
.reshape(ciphertext.semantic_shape)
|
|
642
643
|
.astype(np.int64)
|
|
643
644
|
)
|
|
@@ -744,7 +745,8 @@ def _phe_add_ct2ct(ct1: CipherText, ct2: CipherText) -> CipherText:
|
|
|
744
745
|
# Broadcast ct1 if needed
|
|
745
746
|
if ct1.semantic_shape != result_shape:
|
|
746
747
|
dummy_ct1 = (
|
|
747
|
-
np
|
|
748
|
+
np
|
|
749
|
+
.arange(np.prod(ct1.semantic_shape))
|
|
748
750
|
.reshape(ct1.semantic_shape)
|
|
749
751
|
.astype(np.int64)
|
|
750
752
|
)
|
|
@@ -757,7 +759,8 @@ def _phe_add_ct2ct(ct1: CipherText, ct2: CipherText) -> CipherText:
|
|
|
757
759
|
# Broadcast ct2 if needed
|
|
758
760
|
if ct2.semantic_shape != result_shape:
|
|
759
761
|
dummy_ct2 = (
|
|
760
|
-
np
|
|
762
|
+
np
|
|
763
|
+
.arange(np.prod(ct2.semantic_shape))
|
|
761
764
|
.reshape(ct2.semantic_shape)
|
|
762
765
|
.astype(np.int64)
|
|
763
766
|
)
|
|
@@ -830,7 +833,8 @@ def _phe_add_ct2pt(ciphertext: CipherText, plaintext: TensorValue) -> CipherText
|
|
|
830
833
|
# Broadcast ciphertext if needed
|
|
831
834
|
if ciphertext.semantic_shape != result_shape:
|
|
832
835
|
dummy_ct = (
|
|
833
|
-
np
|
|
836
|
+
np
|
|
837
|
+
.arange(np.prod(ciphertext.semantic_shape))
|
|
834
838
|
.reshape(ciphertext.semantic_shape)
|
|
835
839
|
.astype(np.int64)
|
|
836
840
|
)
|
|
@@ -0,0 +1,230 @@
|
|
|
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 IChannel implementation that bridges to MPLang CommunicatorBase.
|
|
16
|
+
|
|
17
|
+
This module provides BaseChannel, which allows SPU to reuse MPLang's
|
|
18
|
+
existing communication layer (ThreadCommunicator/HttpCommunicator) instead
|
|
19
|
+
of creating separate BRPC connections.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import logging
|
|
25
|
+
from typing import TYPE_CHECKING
|
|
26
|
+
|
|
27
|
+
import spu.libspu as libspu
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from mplang.v1.core.comm import CommunicatorBase
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class BaseChannel(libspu.link.IChannel):
|
|
34
|
+
"""Bridge MPLang CommunicatorBase to SPU IChannel interface.
|
|
35
|
+
|
|
36
|
+
This adapter allows SPU to use MPLang's existing communication layer
|
|
37
|
+
(ThreadCommunicator or HttpCommunicator) instead of creating separate
|
|
38
|
+
BRPC connections.
|
|
39
|
+
|
|
40
|
+
Each BaseChannel represents a channel to ONE peer rank.
|
|
41
|
+
|
|
42
|
+
Communication Protocol:
|
|
43
|
+
- SPU calls send(tag, bytes_data) -> MPLang comm.send(peer, key, bytes_data)
|
|
44
|
+
- SPU calls recv(tag) -> bytes_data <- MPLang comm.recv(peer, key)
|
|
45
|
+
|
|
46
|
+
Tag Namespace:
|
|
47
|
+
All tags are prefixed with "spu:" to avoid collision with other
|
|
48
|
+
MPLang traffic on the same communicator.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
comm: CommunicatorBase,
|
|
54
|
+
local_rank: int,
|
|
55
|
+
peer_rank: int,
|
|
56
|
+
tag_prefix: str = "spu",
|
|
57
|
+
):
|
|
58
|
+
"""Initialize channel to a specific peer.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
comm: MPLang communicator instance (Thread/Http)
|
|
62
|
+
local_rank: Global rank of this party (for logging/debugging)
|
|
63
|
+
peer_rank: Global rank of the peer party
|
|
64
|
+
tag_prefix: Prefix for all tags to avoid collision (default: "spu")
|
|
65
|
+
"""
|
|
66
|
+
super().__init__()
|
|
67
|
+
self._comm = comm
|
|
68
|
+
self._local_rank = local_rank
|
|
69
|
+
self._peer_rank = peer_rank
|
|
70
|
+
self._tag_prefix = tag_prefix
|
|
71
|
+
|
|
72
|
+
logging.debug(
|
|
73
|
+
f"BaseChannel initialized: local_rank={local_rank}, "
|
|
74
|
+
f"peer_rank={peer_rank}, tag_prefix={tag_prefix}"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def _make_key(self, tag: str) -> str:
|
|
78
|
+
"""Create unique key for MPLang comm.
|
|
79
|
+
|
|
80
|
+
Prefixes the tag to avoid collision with non-SPU traffic.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
tag: SPU-provided tag (e.g., "send_0", "recv_0")
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Prefixed key (e.g., "spu:send_0")
|
|
87
|
+
"""
|
|
88
|
+
return f"{self._tag_prefix}:{tag}"
|
|
89
|
+
|
|
90
|
+
def Send(self, tag: str, data: bytes) -> None:
|
|
91
|
+
"""Send bytes to peer (synchronous in SPU semantics).
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
tag: Message tag for matching send/recv pairs
|
|
95
|
+
data: Raw bytes to send
|
|
96
|
+
"""
|
|
97
|
+
key = self._make_key(tag)
|
|
98
|
+
logging.debug(
|
|
99
|
+
f"BaseChannel.Send: {self._local_rank} -> {self._peer_rank}, "
|
|
100
|
+
f"tag={tag}, key={key}, size={len(data)}"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Send raw bytes directly
|
|
104
|
+
# Note: CommunicatorBase.send expects Any type, bytes is acceptable
|
|
105
|
+
self._comm.send(self._peer_rank, key, data)
|
|
106
|
+
|
|
107
|
+
def Recv(self, tag: str) -> bytes:
|
|
108
|
+
"""Receive bytes from peer (blocking).
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
tag: Message tag for matching send/recv pairs
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Raw bytes received
|
|
115
|
+
"""
|
|
116
|
+
key = self._make_key(tag)
|
|
117
|
+
logging.debug(
|
|
118
|
+
f"BaseChannel.Recv: {self._local_rank} <- {self._peer_rank}, "
|
|
119
|
+
f"tag={tag}, key={key}"
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Receive data (should be bytes)
|
|
123
|
+
data = self._comm.recv(self._peer_rank, key)
|
|
124
|
+
|
|
125
|
+
# Validate data type
|
|
126
|
+
if not isinstance(data, bytes):
|
|
127
|
+
raise TypeError(
|
|
128
|
+
f"Expected bytes from communicator, got {type(data).__name__}. "
|
|
129
|
+
f"Communicator must support raw bytes transmission for SPU channels."
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
logging.debug(
|
|
133
|
+
f"BaseChannel.Recv complete: {self._local_rank} <- {self._peer_rank}, "
|
|
134
|
+
f"tag={tag}, size={len(data)}"
|
|
135
|
+
)
|
|
136
|
+
return data
|
|
137
|
+
|
|
138
|
+
def SendAsync(self, tag: str, data: bytes) -> None:
|
|
139
|
+
"""Async send (MPLang's send is already async at network layer).
|
|
140
|
+
|
|
141
|
+
For HttpCommunicator, the underlying httpx.put() is non-blocking
|
|
142
|
+
at the HTTP client level. For ThreadCommunicator, send is instant
|
|
143
|
+
(memory transfer).
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
tag: Message tag
|
|
147
|
+
data: Raw bytes to send
|
|
148
|
+
"""
|
|
149
|
+
# Reuse synchronous send - it's already async underneath
|
|
150
|
+
self.Send(tag, data)
|
|
151
|
+
|
|
152
|
+
def SendAsyncThrottled(self, tag: str, data: bytes) -> None:
|
|
153
|
+
"""Throttled async send.
|
|
154
|
+
|
|
155
|
+
Currently maps to regular SendAsync. Future optimization could
|
|
156
|
+
implement rate limiting if needed.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
tag: Message tag
|
|
160
|
+
data: Raw bytes to send
|
|
161
|
+
"""
|
|
162
|
+
self.SendAsync(tag, data)
|
|
163
|
+
|
|
164
|
+
def TestSend(self, timeout: int) -> None:
|
|
165
|
+
"""Test if this channel can send a dummy msg to peer.
|
|
166
|
+
|
|
167
|
+
Uses fixed 0 seq_id as dummy msg's id to make this function reentrant.
|
|
168
|
+
ConnectToMesh will retry on this multiple times.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
timeout: Timeout in milliseconds
|
|
172
|
+
"""
|
|
173
|
+
# Send a handshake message to test connectivity
|
|
174
|
+
# Use fixed tag "__test__" to make this reentrant (idempotent)
|
|
175
|
+
test_data = b"\x00" # Minimal 1-byte message with seq_id=0
|
|
176
|
+
self.Send("__test__", test_data)
|
|
177
|
+
|
|
178
|
+
def TestRecv(self) -> None:
|
|
179
|
+
"""Wait for dummy msg from peer.
|
|
180
|
+
|
|
181
|
+
Timeout is controlled by recv_timeout_ms in link descriptor.
|
|
182
|
+
"""
|
|
183
|
+
# Receive the handshake message from peer
|
|
184
|
+
# This blocks until message arrives (timeout from desc.recv_timeout_ms)
|
|
185
|
+
test_data = self.Recv("__test__")
|
|
186
|
+
# Validate it's the expected handshake message
|
|
187
|
+
if test_data != b"\x00":
|
|
188
|
+
logging.warning(
|
|
189
|
+
f"TestRecv: unexpected handshake data from {self._peer_rank}, "
|
|
190
|
+
f"expected b'\\x00', got {test_data!r}"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def WaitLinkTaskFinish(self) -> None:
|
|
194
|
+
"""Wait for all pending async tasks.
|
|
195
|
+
|
|
196
|
+
For MPLang communicators:
|
|
197
|
+
- ThreadCommunicator: No-op (instant memory transfer)
|
|
198
|
+
- HttpCommunicator: No explicit wait needed (httpx handles it)
|
|
199
|
+
|
|
200
|
+
This is a no-op in current implementation.
|
|
201
|
+
"""
|
|
202
|
+
|
|
203
|
+
def Abort(self) -> None:
|
|
204
|
+
"""Abort communication (cleanup resources).
|
|
205
|
+
|
|
206
|
+
This could be extended to notify the communicator to drop pending
|
|
207
|
+
messages for this channel, but currently is a no-op.
|
|
208
|
+
"""
|
|
209
|
+
logging.warning(
|
|
210
|
+
f"BaseChannel.Abort called: {self._local_rank} <-> {self._peer_rank}"
|
|
211
|
+
)
|
|
212
|
+
# Future: Could call comm.abort_session() if implemented
|
|
213
|
+
|
|
214
|
+
def SetThrottleWindowSize(self, size: int) -> None:
|
|
215
|
+
"""Set throttle window size.
|
|
216
|
+
|
|
217
|
+
Not applicable to MPLang communicators. No-op.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
size: Window size (ignored)
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
def SetChunkParallelSendSize(self, size: int) -> None:
|
|
224
|
+
"""Set chunk parallel send size.
|
|
225
|
+
|
|
226
|
+
Not applicable to MPLang communicators. No-op.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
size: Chunk size (ignored)
|
|
230
|
+
"""
|
|
@@ -57,7 +57,12 @@ class HttpCommunicator(CommunicatorBase):
|
|
|
57
57
|
return str(res)
|
|
58
58
|
|
|
59
59
|
def send(self, to: int, key: str, data: Any) -> None:
|
|
60
|
-
"""Sends data to a peer party by PUTing to its /comm/{key}/from/{from_rank} endpoint.
|
|
60
|
+
"""Sends data to a peer party by PUTing to its /comm/{key}/from/{from_rank} endpoint.
|
|
61
|
+
|
|
62
|
+
Supports two modes:
|
|
63
|
+
- SPU channel (key starts with "spu:"): sends raw bytes directly
|
|
64
|
+
- Normal channel: wraps data in Value envelope
|
|
65
|
+
"""
|
|
61
66
|
target_endpoint = self.endpoints[to]
|
|
62
67
|
url = f"{target_endpoint}/sessions/{self.session_name}/comm/{key}/from/{self._rank}"
|
|
63
68
|
logging.debug(
|
|
@@ -65,19 +70,20 @@ class HttpCommunicator(CommunicatorBase):
|
|
|
65
70
|
)
|
|
66
71
|
|
|
67
72
|
try:
|
|
68
|
-
#
|
|
69
|
-
if
|
|
73
|
+
# SPU channel mode: send raw bytes directly
|
|
74
|
+
if key.startswith("spu:") and isinstance(data, bytes):
|
|
75
|
+
data_b64 = base64.b64encode(data).decode("utf-8")
|
|
76
|
+
request_data = {"data": data_b64, "is_raw_bytes": True}
|
|
77
|
+
# Normal mode: serialize using Value envelope
|
|
78
|
+
elif isinstance(data, Value):
|
|
79
|
+
data_bytes = encode_value(data)
|
|
80
|
+
data_b64 = base64.b64encode(data_bytes).decode("utf-8")
|
|
81
|
+
request_data = {"data": data_b64}
|
|
82
|
+
else:
|
|
70
83
|
raise TypeError(
|
|
71
84
|
f"Communicator requires Value instance, got {type(data).__name__}. "
|
|
72
85
|
"Wrap data in TensorValue or custom Value subclass."
|
|
73
86
|
)
|
|
74
|
-
data_bytes = encode_value(data)
|
|
75
|
-
|
|
76
|
-
data_b64 = base64.b64encode(data_bytes).decode("utf-8")
|
|
77
|
-
|
|
78
|
-
request_data = {
|
|
79
|
-
"data": data_b64,
|
|
80
|
-
}
|
|
81
87
|
|
|
82
88
|
response = httpx.put(url, json=request_data, timeout=60)
|
|
83
89
|
logging.debug(f"Send response: status={response.status_code}")
|
|
@@ -91,14 +97,32 @@ class HttpCommunicator(CommunicatorBase):
|
|
|
91
97
|
raise OSError(f"Failed to send data to rank {to}") from e
|
|
92
98
|
|
|
93
99
|
def recv(self, frm: int, key: str) -> Any:
|
|
94
|
-
"""Wait until the key is set, returns the value.
|
|
100
|
+
"""Wait until the key is set, returns the value.
|
|
101
|
+
|
|
102
|
+
Supports two modes:
|
|
103
|
+
- SPU channel (key starts with "spu:"): returns raw bytes
|
|
104
|
+
- Normal channel: returns deserialized Value
|
|
105
|
+
"""
|
|
95
106
|
logging.debug(
|
|
96
107
|
f"Waiting to receive: from_rank={frm}, to_rank={self._rank}, key={key}"
|
|
97
108
|
)
|
|
98
|
-
|
|
109
|
+
received_data = super().recv(frm, key)
|
|
99
110
|
|
|
111
|
+
# Check if this is raw bytes (SPU channel)
|
|
112
|
+
if isinstance(received_data, dict) and received_data.get("is_raw_bytes"):
|
|
113
|
+
data_bytes = base64.b64decode(received_data["data"])
|
|
114
|
+
logging.debug(
|
|
115
|
+
f"Received raw bytes: from_rank={frm}, to_rank={self._rank}, key={key}, size={len(data_bytes)}"
|
|
116
|
+
)
|
|
117
|
+
return data_bytes
|
|
118
|
+
|
|
119
|
+
# Normal mode: deserialize Value envelope
|
|
120
|
+
data_b64 = (
|
|
121
|
+
received_data
|
|
122
|
+
if isinstance(received_data, str)
|
|
123
|
+
else received_data.get("data")
|
|
124
|
+
)
|
|
100
125
|
data_bytes = base64.b64decode(data_b64)
|
|
101
|
-
# Deserialize using Value envelope
|
|
102
126
|
result = decode_value(data_bytes)
|
|
103
127
|
|
|
104
128
|
logging.debug(
|
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
from typing import TYPE_CHECKING
|
|
19
|
+
|
|
20
|
+
import spu.libspu as libspu
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from mplang.v1.core.comm import CommunicatorBase
|
|
24
|
+
from mplang.v1.core.mask import Mask
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class LinkCommunicator:
|
|
28
|
+
"""Minimal wrapper for libspu link context.
|
|
29
|
+
|
|
30
|
+
Supports three modes:
|
|
31
|
+
1. BRPC: Production mode with separate BRPC ports (legacy)
|
|
32
|
+
2. Mem: In-memory links for testing (legacy)
|
|
33
|
+
3. Channels: Reuse MPLang communicator via IChannel bridge (NEW)
|
|
34
|
+
|
|
35
|
+
The mode is selected based on constructor arguments:
|
|
36
|
+
- If `comm` is provided: Channels mode (NEW)
|
|
37
|
+
- Elif `mem_link` is True: Mem mode
|
|
38
|
+
- Else: BRPC mode
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
rank: int,
|
|
44
|
+
addrs: list[str] | None = None,
|
|
45
|
+
*,
|
|
46
|
+
mem_link: bool = False,
|
|
47
|
+
comm: CommunicatorBase | None = None,
|
|
48
|
+
spu_mask: Mask | None = None,
|
|
49
|
+
):
|
|
50
|
+
"""Initialize link communicator for SPU.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
rank: Global rank of this party
|
|
54
|
+
addrs: List of addresses for all SPU parties (required for BRPC/Mem mode)
|
|
55
|
+
mem_link: If True, use in-memory link (Mem mode)
|
|
56
|
+
comm: MPLang communicator to reuse (Channels mode, NEW)
|
|
57
|
+
spu_mask: SPU parties mask (required for Channels mode)
|
|
58
|
+
|
|
59
|
+
Raises:
|
|
60
|
+
ValueError: If arguments are invalid for the selected mode
|
|
61
|
+
"""
|
|
62
|
+
self._rank = rank
|
|
63
|
+
|
|
64
|
+
# Select initialization mode based on arguments
|
|
65
|
+
if comm is not None:
|
|
66
|
+
self._init_channels_mode(rank, comm, spu_mask)
|
|
67
|
+
elif mem_link:
|
|
68
|
+
self._init_mem_mode(rank, addrs)
|
|
69
|
+
else:
|
|
70
|
+
self._init_brpc_mode(rank, addrs)
|
|
71
|
+
|
|
72
|
+
def _init_channels_mode(
|
|
73
|
+
self, rank: int, comm: CommunicatorBase, spu_mask: Mask | None
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Initialize Channels mode (reuse MPLang communicator).
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
rank: Global rank of this party
|
|
79
|
+
comm: MPLang communicator to reuse
|
|
80
|
+
spu_mask: SPU parties mask
|
|
81
|
+
|
|
82
|
+
Raises:
|
|
83
|
+
ValueError: If spu_mask is None or rank not in mask
|
|
84
|
+
"""
|
|
85
|
+
if spu_mask is None:
|
|
86
|
+
raise ValueError("spu_mask required when using comm")
|
|
87
|
+
if rank not in spu_mask:
|
|
88
|
+
raise ValueError(f"rank {rank} not in spu_mask {spu_mask}")
|
|
89
|
+
|
|
90
|
+
# Lazy import to avoid circular dependency
|
|
91
|
+
from mplang.v1.runtime.channel import BaseChannel
|
|
92
|
+
|
|
93
|
+
# Create channels to ALL SPU parties (including self)
|
|
94
|
+
# libspu expects world_size channels, with self channel being None
|
|
95
|
+
channels = []
|
|
96
|
+
rel_rank = spu_mask.global_to_relative_rank(rank)
|
|
97
|
+
|
|
98
|
+
for _, peer_rank in enumerate(spu_mask):
|
|
99
|
+
if peer_rank == rank:
|
|
100
|
+
# For self, use None (won't be accessed by SPU)
|
|
101
|
+
channel = None
|
|
102
|
+
else:
|
|
103
|
+
channel = BaseChannel(comm, rank, peer_rank)
|
|
104
|
+
channels.append(channel)
|
|
105
|
+
|
|
106
|
+
# Create link context with custom channels
|
|
107
|
+
desc = libspu.link.Desc() # type: ignore
|
|
108
|
+
desc.recv_timeout_ms = 100 * 1000 # 100 seconds
|
|
109
|
+
|
|
110
|
+
# Add party info to desc (required for world_size inference)
|
|
111
|
+
for idx, peer_rank in enumerate(spu_mask):
|
|
112
|
+
desc.add_party(f"P{idx}", f"dummy_{peer_rank}")
|
|
113
|
+
|
|
114
|
+
self.lctx = libspu.link.create_with_channels(desc, rel_rank, channels)
|
|
115
|
+
self._world_size = spu_mask.num_parties()
|
|
116
|
+
|
|
117
|
+
logging.info(
|
|
118
|
+
f"LinkCommunicator initialized with BaseChannel: "
|
|
119
|
+
f"rank={rank}, rel_rank={rel_rank}, spu_mask={spu_mask}, "
|
|
120
|
+
f"world_size={self._world_size}"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
def _init_mem_mode(self, rank: int, addrs: list[str] | None) -> None:
|
|
124
|
+
"""Initialize Mem mode (in-memory links for testing).
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
rank: Global rank of this party
|
|
128
|
+
addrs: List of addresses for all SPU parties
|
|
129
|
+
|
|
130
|
+
Raises:
|
|
131
|
+
ValueError: If addrs is None
|
|
132
|
+
"""
|
|
133
|
+
if addrs is None:
|
|
134
|
+
raise ValueError("addrs required for Mem mode")
|
|
135
|
+
|
|
136
|
+
self._world_size = len(addrs)
|
|
137
|
+
|
|
138
|
+
desc = libspu.link.Desc() # type: ignore
|
|
139
|
+
desc.recv_timeout_ms = 100 * 1000 # 100 seconds
|
|
140
|
+
desc.http_max_payload_size = 32 * 1024 * 1024 # 32M
|
|
141
|
+
for rank_idx, addr in enumerate(addrs):
|
|
142
|
+
desc.add_party(f"P{rank_idx}", addr)
|
|
143
|
+
|
|
144
|
+
self.lctx = libspu.link.create_mem(desc, self._rank)
|
|
145
|
+
logging.info(
|
|
146
|
+
f"LinkCommunicator initialized with Mem: "
|
|
147
|
+
f"rank={self._rank}, world_size={self._world_size}, addrs={addrs}"
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
def _init_brpc_mode(self, rank: int, addrs: list[str] | None) -> None:
|
|
151
|
+
"""Initialize BRPC mode (production mode with separate BRPC ports).
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
rank: Global rank of this party
|
|
155
|
+
addrs: List of addresses for all SPU parties
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
ValueError: If addrs is None
|
|
159
|
+
"""
|
|
160
|
+
if addrs is None:
|
|
161
|
+
raise ValueError("addrs required for BRPC mode")
|
|
162
|
+
|
|
163
|
+
self._world_size = len(addrs)
|
|
164
|
+
|
|
165
|
+
desc = libspu.link.Desc() # type: ignore
|
|
166
|
+
desc.recv_timeout_ms = 100 * 1000 # 100 seconds
|
|
167
|
+
desc.http_max_payload_size = 32 * 1024 * 1024 # 32M
|
|
168
|
+
for rank_idx, addr in enumerate(addrs):
|
|
169
|
+
desc.add_party(f"P{rank_idx}", addr)
|
|
170
|
+
|
|
171
|
+
self.lctx = libspu.link.create_brpc(desc, self._rank)
|
|
172
|
+
logging.info(
|
|
173
|
+
f"LinkCommunicator initialized with BRPC: "
|
|
174
|
+
f"rank={self._rank}, world_size={self._world_size}, addrs={addrs}"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def rank(self) -> int:
|
|
179
|
+
"""Get rank from underlying link context."""
|
|
180
|
+
return self.lctx.rank # type: ignore[no-any-return]
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def world_size(self) -> int:
|
|
184
|
+
"""Get world size from underlying link context."""
|
|
185
|
+
return self.lctx.world_size # type: ignore[no-any-return]
|
|
186
|
+
|
|
187
|
+
def get_lctx(self) -> libspu.link.Context:
|
|
188
|
+
"""Get the underlying libspu link context.
|
|
189
|
+
|
|
190
|
+
This is the primary interface - SPU runtime uses this context directly.
|
|
191
|
+
All communication and serialization is handled by libspu internally.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
The underlying libspu.link.Context instance.
|
|
195
|
+
"""
|
|
196
|
+
return self.lctx
|
|
@@ -219,6 +219,7 @@ class SymbolResponse(BaseModel):
|
|
|
219
219
|
|
|
220
220
|
class CommSendRequest(BaseModel):
|
|
221
221
|
data: str # Base64 encoded binary data
|
|
222
|
+
is_raw_bytes: bool = False # True for SPU channel raw bytes
|
|
222
223
|
|
|
223
224
|
|
|
224
225
|
# Response Models for enhanced status
|
|
@@ -487,6 +488,14 @@ def comm_send(
|
|
|
487
488
|
# The receiver rank should be the rank of the server hosting this endpoint
|
|
488
489
|
# We don't need to validate to_rank since the request is coming to this server
|
|
489
490
|
|
|
491
|
+
# For raw bytes (SPU channel), pass through as dict with flag
|
|
492
|
+
# For normal data, pass the base64 string directly
|
|
493
|
+
data_payload: str | dict[str, object]
|
|
494
|
+
if request.is_raw_bytes:
|
|
495
|
+
data_payload = {"data": request.data, "is_raw_bytes": True}
|
|
496
|
+
else:
|
|
497
|
+
data_payload = request.data
|
|
498
|
+
|
|
490
499
|
# Use the proper onSent mechanism from CommunicatorBase
|
|
491
|
-
sess.communicator.onSent(from_rank, key,
|
|
500
|
+
sess.communicator.onSent(from_rank, key, data_payload)
|
|
492
501
|
return {"status": "ok"}
|
|
@@ -25,12 +25,10 @@ Process-wide registries (sessions, global symbols) live in the server layer
|
|
|
25
25
|
|
|
26
26
|
from __future__ import annotations
|
|
27
27
|
|
|
28
|
-
import logging
|
|
29
28
|
import time
|
|
30
29
|
from dataclasses import dataclass, field
|
|
31
30
|
from functools import cached_property
|
|
32
31
|
from typing import TYPE_CHECKING, Any, cast
|
|
33
|
-
from urllib.parse import urlparse
|
|
34
32
|
|
|
35
33
|
import spu.libspu as libspu
|
|
36
34
|
|
|
@@ -51,27 +49,6 @@ if TYPE_CHECKING: # pragma: no cover - import only for type checking
|
|
|
51
49
|
from mplang.v1.core.cluster import ClusterSpec, Node, RuntimeInfo
|
|
52
50
|
|
|
53
51
|
|
|
54
|
-
class LinkCommFactory:
|
|
55
|
-
"""Factory for creating and caching link communicators."""
|
|
56
|
-
|
|
57
|
-
def __init__(self) -> None:
|
|
58
|
-
self._cache: dict[tuple[int, tuple[str, ...]], LinkCommunicator] = {}
|
|
59
|
-
|
|
60
|
-
def create_link(self, rel_rank: int, addrs: list[str]) -> LinkCommunicator:
|
|
61
|
-
key = (rel_rank, tuple(addrs))
|
|
62
|
-
link = self._cache.get(key)
|
|
63
|
-
if link is not None:
|
|
64
|
-
return link
|
|
65
|
-
logging.info(f"LinkCommunicator created: rel_rank={rel_rank} addrs={addrs}")
|
|
66
|
-
link = LinkCommunicator(rel_rank, addrs)
|
|
67
|
-
self._cache[key] = link
|
|
68
|
-
return link
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# Shared link factory (module-local, not global registry of sessions)
|
|
72
|
-
g_link_factory = LinkCommFactory()
|
|
73
|
-
|
|
74
|
-
|
|
75
52
|
@dataclass
|
|
76
53
|
class Symbol:
|
|
77
54
|
name: str
|
|
@@ -184,23 +161,19 @@ class Session:
|
|
|
184
161
|
return
|
|
185
162
|
|
|
186
163
|
link_ctx = None
|
|
187
|
-
# TODO(jint): reuse same port for mplang and spu.
|
|
188
|
-
SPU_PORT_OFFSET = 100
|
|
189
164
|
|
|
190
165
|
if self.is_spu_party:
|
|
191
|
-
#
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
rel_index = sum(1 for r in range(self.rank) if r in self.spu_mask)
|
|
203
|
-
link_ctx = g_link_factory.create_link(rel_index, spu_addrs)
|
|
166
|
+
# Use Channels mode to reuse existing HttpCommunicator
|
|
167
|
+
# This eliminates the need for separate BRPC ports (SPU_PORT_OFFSET)
|
|
168
|
+
from mplang.v1.core.comm import CommunicatorBase
|
|
169
|
+
|
|
170
|
+
# Type assertion: ICommunicator is actually CommunicatorBase
|
|
171
|
+
comm = cast(CommunicatorBase, self.communicator)
|
|
172
|
+
link_ctx = LinkCommunicator(
|
|
173
|
+
rank=self.rank,
|
|
174
|
+
comm=comm,
|
|
175
|
+
spu_mask=self.spu_mask,
|
|
176
|
+
)
|
|
204
177
|
|
|
205
178
|
spu_config = libspu.RuntimeConfig(
|
|
206
179
|
protocol=parse_protocol(self.spu_protocol),
|