mplang-nightly 0.1.dev284__tar.gz → 0.1.dev286__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.dev284 → mplang_nightly-0.1.dev286}/PKG-INFO +1 -1
- mplang_nightly-0.1.dev286/mplang/edsl/README.md +252 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/typing.py +26 -10
- mplang_nightly-0.1.dev284/mplang/edsl/README.md +0 -279
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/.gitignore +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/LICENSE +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/README.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/examples/.gitkeep +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/channel.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/http.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/mem.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/http.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/mem.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/spu_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/spu_state.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/cli.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/crypto.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/context.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/program.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/okvs_opt.cpp +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/api.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/ml/sgb.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/rr22.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/ldpc.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/py.typed +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/interpreter.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/tool/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/tool/program.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/logging.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/pyproject.toml +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_driver/test_http.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_shuffle_exec_id_key.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_channel.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_spu_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_okvs.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_store.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_compiled_program_artifact.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/test_sgb.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/test_sgb_bench.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_psi.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_rr22.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_vole.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/test_logging.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/06_pipeline.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/08_logging.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/run.sh +0 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# MPLang EDSL - Embedded Domain-Specific Language
|
|
2
|
+
|
|
3
|
+
The EDSL (Embedded Domain-Specific Language) module is the core infrastructure for MPLang's graph-based IR system. It provides the foundational components for tracing Python functions into SSA-based graphs, type checking, and program compilation.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
MPLang EDSL uses a modern **Operation List + SSA** approach for better analyzability and optimization, similar to PyTorch FX and JAX. The EDSL captures Python function execution into an explicit graph IR that can be analyzed, optimized, and executed across distributed parties and devices.
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
### Key Components
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
mplang/edsl/
|
|
15
|
+
├── typing.py # Unified type system (MPType hierarchy)
|
|
16
|
+
├── graph.py # IR: Operation List + SSA (Graph, Operation, Value)
|
|
17
|
+
├── primitive.py # Primitive abstraction and registration
|
|
18
|
+
├── object.py # Object hierarchy (TraceObject, runtime values)
|
|
19
|
+
├── context.py # Context management (tracing vs execution)
|
|
20
|
+
├── tracer.py # Explicit tracer for graph construction
|
|
21
|
+
├── jit.py # @jit decorator for function compilation
|
|
22
|
+
├── program.py # Compiled program representation
|
|
23
|
+
├── printer.py # Graph visualization and debugging
|
|
24
|
+
├── registry.py # Op registry and dialect management
|
|
25
|
+
└── serde.py # Serialization/deserialization
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Type System
|
|
29
|
+
|
|
30
|
+
**Single source of truth**: `mplang.edsl.typing.MPType`
|
|
31
|
+
|
|
32
|
+
The EDSL provides a unified, extensible type system that supports:
|
|
33
|
+
|
|
34
|
+
- **ScalarType**: `i32`, `i64`, `f32`, `f64`, `bool`, etc.
|
|
35
|
+
- **TensorType**: Multi-dimensional arrays with shape and dtype
|
|
36
|
+
- **TableType**: Structured tabular data
|
|
37
|
+
- **VectorType**: Encrypted vectors (for FHE/MPC)
|
|
38
|
+
- **SSType**: Secret-shared values (for MPC)
|
|
39
|
+
- **CustomType**: Extensible type system for domain-specific types
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from mplang.edsl.typing import TensorType, VectorType, f32, i64
|
|
43
|
+
|
|
44
|
+
# Define types
|
|
45
|
+
plaintext: TensorType = TensorType(f32, (4096,))
|
|
46
|
+
ciphertext: VectorType = VectorType(f32, 4096)
|
|
47
|
+
counter: TensorType = TensorType(i64, ()) # scalar
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Graph IR
|
|
51
|
+
|
|
52
|
+
The Graph IR uses SSA (Static Single Assignment) form with explicit operations:
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
# Example graph structure:
|
|
56
|
+
# %0 = input "x"
|
|
57
|
+
# %1 = input "y"
|
|
58
|
+
# %2 = add %0, %1
|
|
59
|
+
# return %2
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Each operation has:
|
|
63
|
+
- **opcode**: Operation type (e.g., "add", "mul", "simp.pcall")
|
|
64
|
+
- **inputs**: List of input Values (SSA variables)
|
|
65
|
+
- **outputs**: List of output Values
|
|
66
|
+
- **attributes**: Operation-specific metadata
|
|
67
|
+
|
|
68
|
+
### Tracing and Compilation
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from mplang.edsl import jit, trace, Tracer
|
|
72
|
+
|
|
73
|
+
# Method 1: @jit decorator (automatic tracing and execution)
|
|
74
|
+
@jit
|
|
75
|
+
def my_program(x, y):
|
|
76
|
+
return x + y
|
|
77
|
+
|
|
78
|
+
result = my_program(data_x, data_y)
|
|
79
|
+
|
|
80
|
+
# Method 2: Explicit tracing (returns TracedFunction with .graph)
|
|
81
|
+
traced_fn = trace(my_program, x_obj, y_obj)
|
|
82
|
+
graph = traced_fn.graph
|
|
83
|
+
|
|
84
|
+
# Method 3: Manual tracing with Tracer context
|
|
85
|
+
tracer = Tracer()
|
|
86
|
+
with tracer:
|
|
87
|
+
result = my_program(x, y)
|
|
88
|
+
graph = tracer.finalize(result)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## API Layers
|
|
92
|
+
|
|
93
|
+
The EDSL provides two distinct API layers:
|
|
94
|
+
|
|
95
|
+
### 1. High-Level API (User-Facing)
|
|
96
|
+
|
|
97
|
+
- **Tracing**: `@jit`, `trace()`, `Tracer` context manager
|
|
98
|
+
- **Primitives**: `@primitive` decorator for defining new operations
|
|
99
|
+
- **Types**: Type annotations and type inference
|
|
100
|
+
- **Objects**: Automatic wrapping of Python values
|
|
101
|
+
|
|
102
|
+
This is the **primary interface for users**.
|
|
103
|
+
|
|
104
|
+
### 2. Low-Level API (Compiler/Backend)
|
|
105
|
+
|
|
106
|
+
- **Graph manipulation**: Direct `Graph.add_op()` calls
|
|
107
|
+
- **Op registry**: `register_impl()`, `get_impl()`
|
|
108
|
+
- **Serialization**: Graph to/from protobuf
|
|
109
|
+
- **Execution**: Direct graph interpretation via runtime
|
|
110
|
+
|
|
111
|
+
Used by compiler passes and backend implementations.
|
|
112
|
+
|
|
113
|
+
## Integration with Dialects
|
|
114
|
+
|
|
115
|
+
The EDSL is dialect-agnostic. Dialects provide domain-specific operations:
|
|
116
|
+
|
|
117
|
+
- **mplang.dialects.simp**: SPMD/MPI-style operations (pcall_static, pcall_dynamic)
|
|
118
|
+
- **mplang.dialects.tensor**: Tensor operations (run_jax for JAX-backed computation, structural ops)
|
|
119
|
+
- **mplang.dialects.table**: Table operations (run_sql, read/write, conversions)
|
|
120
|
+
- **mplang.dialects.spu**: Secure multi-party computation
|
|
121
|
+
- **mplang.dialects.tee**: Trusted execution environment
|
|
122
|
+
- **mplang.dialects.bfv**: Homomorphic encryption (BFV scheme)
|
|
123
|
+
- **mplang.dialects.phe**: Paillier homomorphic encryption
|
|
124
|
+
|
|
125
|
+
Each dialect registers its operations and type implementations with the EDSL.
|
|
126
|
+
|
|
127
|
+
## Examples
|
|
128
|
+
|
|
129
|
+
### Basic Tracing
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
import mplang.edsl as el
|
|
133
|
+
from mplang.dialects.simp import pcall_static
|
|
134
|
+
|
|
135
|
+
@el.jit
|
|
136
|
+
def distribute_computation(x, y):
|
|
137
|
+
# Execute computation on parties 0 and 1
|
|
138
|
+
result = pcall_static((0, 1), lambda a, b: a + b, x, y)
|
|
139
|
+
return result
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Custom Primitives
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
from mplang.edsl import primitive
|
|
146
|
+
from mplang.edsl.typing import TensorType, f32
|
|
147
|
+
|
|
148
|
+
@primitive("custom_op")
|
|
149
|
+
def custom_op_abstract(x: TensorType, y: TensorType) -> TensorType:
|
|
150
|
+
# Type inference (abstract evaluation) for the "custom_op" primitive.
|
|
151
|
+
# In this simple example, we say the result has the same abstract type as `x`.
|
|
152
|
+
return x
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Graph Inspection
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
from mplang.edsl import trace, format_graph
|
|
159
|
+
|
|
160
|
+
def my_fn(x):
|
|
161
|
+
return x * 2 + 1
|
|
162
|
+
|
|
163
|
+
# Trace the function
|
|
164
|
+
traced_fn = trace(my_fn, x_obj)
|
|
165
|
+
|
|
166
|
+
# Print graph IR
|
|
167
|
+
print(format_graph(traced_fn.graph))
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Testing
|
|
171
|
+
|
|
172
|
+
The EDSL has comprehensive test coverage:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Run all EDSL tests
|
|
176
|
+
uv run pytest tests/edsl/
|
|
177
|
+
|
|
178
|
+
# Run specific test files
|
|
179
|
+
uv run pytest tests/edsl/test_tracer.py
|
|
180
|
+
uv run pytest tests/edsl/test_typing.py
|
|
181
|
+
uv run pytest tests/edsl/test_graph.py
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Test files:
|
|
185
|
+
- `test_typing.py`: Type system tests
|
|
186
|
+
- `test_graph.py`: Graph IR tests
|
|
187
|
+
- `test_tracer.py`: Tracing functionality
|
|
188
|
+
- `test_primitive.py`: Primitive operations
|
|
189
|
+
- `test_context.py`: Context management
|
|
190
|
+
- `test_printer.py`: Graph visualization
|
|
191
|
+
- `test_serde.py`: Serialization/deserialization
|
|
192
|
+
- `test_compiled_program_artifact.py`: Program compilation
|
|
193
|
+
|
|
194
|
+
## Development
|
|
195
|
+
|
|
196
|
+
### Adding New Operations
|
|
197
|
+
|
|
198
|
+
1. Define the operation in the appropriate dialect (e.g., `mplang/dialects/tensor.py`)
|
|
199
|
+
2. Register the operation with `@primitive` or explicit registry
|
|
200
|
+
3. Implement backend execution in `mplang/backends/`
|
|
201
|
+
4. Add tests in `tests/dialects/` and `tests/backends/`
|
|
202
|
+
|
|
203
|
+
### Type System Extension
|
|
204
|
+
|
|
205
|
+
To add a new type:
|
|
206
|
+
|
|
207
|
+
1. Subclass `MPType` in `mplang/edsl/typing.py`
|
|
208
|
+
2. Implement required methods (`__repr__`, `__eq__`, `__hash__`)
|
|
209
|
+
3. Add serialization support in `typing.py` and `serde.py`
|
|
210
|
+
4. Add tests in `tests/edsl/test_typing.py`
|
|
211
|
+
|
|
212
|
+
### Code Style
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# Format code
|
|
216
|
+
uv run ruff format mplang/edsl/
|
|
217
|
+
|
|
218
|
+
# Lint
|
|
219
|
+
uv run ruff check mplang/edsl/ --fix
|
|
220
|
+
|
|
221
|
+
# Type check
|
|
222
|
+
uv run mypy mplang/edsl/
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Relationship with Other Components
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
mplang/
|
|
229
|
+
├── edsl/ # Core IR and tracing (this module)
|
|
230
|
+
├── dialects/ # Domain-specific operations
|
|
231
|
+
├── backends/ # Execution implementations
|
|
232
|
+
├── runtime/ # Runtime execution engine
|
|
233
|
+
├── libs/ # High-level libraries (device, ml, mpc)
|
|
234
|
+
└── kernels/ # Low-level kernel implementations
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Design documents** are in the project root `design/` directory:
|
|
238
|
+
- [`design/architecture.md`](../../design/architecture.md): Overall architecture
|
|
239
|
+
- [`design/control_flow.md`](../../design/control_flow.md): Control flow handling
|
|
240
|
+
- [`design/compile_execute_decoupling.md`](../../design/compile_execute_decoupling.md): Compilation model
|
|
241
|
+
|
|
242
|
+
## References
|
|
243
|
+
|
|
244
|
+
- **MPLang Documentation**: See repository root README.md and AGENTS.md
|
|
245
|
+
- **Design Documents**: `/design/` directory
|
|
246
|
+
- **PyTorch FX**: https://pytorch.org/docs/stable/fx.html
|
|
247
|
+
- **JAX jaxpr**: https://jax.readthedocs.io/en/latest/jaxpr.html
|
|
248
|
+
- **MLIR**: https://mlir.llvm.org/
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
**Last Updated**: 2026-02-02
|
|
@@ -59,7 +59,7 @@ rather than by creating a large, monolithic set of specific types.
|
|
|
59
59
|
- `Tensor`: A multi-dimensional array of a `ScalarType` element type.
|
|
60
60
|
- `Table`: A dictionary-like structure with named columns of any type.
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
2. **Encryption Types**: Wrap other types to confer privacy properties by making them opaque.
|
|
63
63
|
- `SS`: A single share of a secret-shared value.
|
|
64
64
|
- Note: Element-wise HE types (like `phe.CiphertextType`) are defined in their respective dialects (e.g., `phe`).
|
|
65
65
|
|
|
@@ -82,11 +82,18 @@ underlying HE libraries.
|
|
|
82
82
|
- **Core Type**: `Tensor[Scalar, ...]`
|
|
83
83
|
- **API Standard**: Follows NumPy/JAX conventions. All layout and arithmetic operations are valid.
|
|
84
84
|
|
|
85
|
+
- **World 2: The Element-wise HE World**
|
|
85
86
|
- **Core Type**: `Tensor[EncryptedScalar, ...]` (e.g., `Tensor[phe.CiphertextType, ...]`)
|
|
86
87
|
- **API Standard**: Follows TenSEAL-like (Tensor-level) conventions. Layout operations
|
|
87
88
|
(`transpose`, `reshape`) are valid as they merely shuffle independent ciphertext objects.
|
|
88
89
|
Arithmetic operations are overloaded for element-wise HE computation.
|
|
89
90
|
|
|
91
|
+
- **World 3: The SIMD HE World**
|
|
92
|
+
- **Core Type**: `Tensor[Vector[...], ...]` where the inner `Vector` holds SIMD-encrypted slots
|
|
93
|
+
- **API Standard**: SIMD-HE specific (e.g., BFV/CKKS). Only specific operations are supported
|
|
94
|
+
due to the batched nature of SIMD encryption. Layout operations must account for slot packing,
|
|
95
|
+
and arithmetic operates on batched ciphertexts with slot-wise semantics.
|
|
96
|
+
|
|
90
97
|
===========================
|
|
91
98
|
Principle 3: Contracts via Protocols
|
|
92
99
|
===========================
|
|
@@ -137,7 +144,15 @@ class BaseType:
|
|
|
137
144
|
"""Base class for all MPLang types."""
|
|
138
145
|
|
|
139
146
|
def __repr__(self) -> str:
|
|
140
|
-
|
|
147
|
+
# Prevent infinite recursion: only call __str__ if it's overridden
|
|
148
|
+
if type(self).__str__ is not BaseType.__str__:
|
|
149
|
+
return str(self)
|
|
150
|
+
# Fallback to default object repr if __str__ not implemented
|
|
151
|
+
return object.__repr__(self)
|
|
152
|
+
|
|
153
|
+
def __str__(self) -> str:
|
|
154
|
+
# Default implementation for subclasses that don't override
|
|
155
|
+
return f"{self.__class__.__name__}()"
|
|
141
156
|
|
|
142
157
|
|
|
143
158
|
# ==============================================================================
|
|
@@ -175,11 +190,11 @@ class ScalarType(BaseType):
|
|
|
175
190
|
|
|
176
191
|
@serde.register_class
|
|
177
192
|
class IntegerType(ScalarType):
|
|
178
|
-
"""Represents a
|
|
193
|
+
"""Represents a fixed-width integer type with configurable bitwidth.
|
|
179
194
|
|
|
180
|
-
This is a standard integer type with
|
|
181
|
-
arbitrary-precision arithmetic.
|
|
182
|
-
the range of
|
|
195
|
+
This is a standard integer type with parameterized bit width, used for
|
|
196
|
+
arbitrary-precision arithmetic. By configuring larger bitwidths (e.g., 128, 256),
|
|
197
|
+
this type can represent integers that exceed the range of standard types like i64.
|
|
183
198
|
|
|
184
199
|
Examples:
|
|
185
200
|
>>> i128 = IntegerType(bitwidth=128, signed=True) # i128
|
|
@@ -229,15 +244,16 @@ class IntegerType(ScalarType):
|
|
|
229
244
|
|
|
230
245
|
@serde.register_class
|
|
231
246
|
class FloatType(ScalarType):
|
|
232
|
-
"""Represents a floating-point type.
|
|
247
|
+
"""Represents a fixed-width floating-point type with configurable bitwidth.
|
|
233
248
|
|
|
234
|
-
This supports standard IEEE 754 floating-point types with
|
|
235
|
-
precision
|
|
249
|
+
This supports standard IEEE 754 floating-point types with parameterized
|
|
250
|
+
bit width for different precision requirements.
|
|
236
251
|
|
|
237
252
|
Examples:
|
|
238
253
|
>>> f16 = FloatType(bitwidth=16) # half precision
|
|
239
254
|
>>> f32 = FloatType(bitwidth=32) # single precision
|
|
240
255
|
>>> f64 = FloatType(bitwidth=64) # double precision
|
|
256
|
+
>>> f128 = FloatType(bitwidth=128) # quadruple precision
|
|
241
257
|
"""
|
|
242
258
|
|
|
243
259
|
def __init__(self, *, bitwidth: int = 32):
|
|
@@ -245,7 +261,7 @@ class FloatType(ScalarType):
|
|
|
245
261
|
|
|
246
262
|
Args:
|
|
247
263
|
bitwidth: Number of bits for the float representation.
|
|
248
|
-
Standard values: 16 (half), 32 (single), 64 (double).
|
|
264
|
+
Standard values: 16 (half), 32 (single), 64 (double), 128 (quadruple).
|
|
249
265
|
"""
|
|
250
266
|
if bitwidth not in (16, 32, 64, 128):
|
|
251
267
|
raise ValueError(f"bitwidth must be 16, 32, 64, or 128, got {bitwidth}")
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
# MPLang EDSL - Experimental Architecture
|
|
2
|
-
|
|
3
|
-
**⚠️ Status**: Experimental / Work in Progress
|
|
4
|
-
|
|
5
|
-
This directory contains the next-generation EDSL (Embedded Domain-Specific Language) architecture for MPLang.
|
|
6
|
-
|
|
7
|
-
## Why a New Architecture?
|
|
8
|
-
|
|
9
|
-
The current `mplang.core` architecture (Expr Tree + @primitive) has served us well, but we're hitting limitations:
|
|
10
|
-
|
|
11
|
-
1. **Expr Tree** is hard to optimize (visitor pattern, nested structure)
|
|
12
|
-
2. **@primitive decorators** hide complexity and limit flexibility
|
|
13
|
-
3. **Type system** is split between `mptype.MPType` and `typing.BaseType`
|
|
14
|
-
4. **No clear separation** between IR, frontend, and backend
|
|
15
|
-
|
|
16
|
-
Modern EDSLs (torch.fx, JAX) use **Operation List + SSA** for better analyzability and optimization.
|
|
17
|
-
|
|
18
|
-
## Goals
|
|
19
|
-
|
|
20
|
-
### 1. Modern IR (Operation List)
|
|
21
|
-
|
|
22
|
-
**From** (Expr Tree):
|
|
23
|
-
```python
|
|
24
|
-
CallExpr(
|
|
25
|
-
func=add,
|
|
26
|
-
args=[VariableExpr("x"), VariableExpr("y")]
|
|
27
|
-
)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**To** (Operation List):
|
|
31
|
-
```python
|
|
32
|
-
%0 = input "x"
|
|
33
|
-
%1 = input "y"
|
|
34
|
-
%2 = add %0, %1
|
|
35
|
-
return %2
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### 2. Unified Type System
|
|
39
|
-
|
|
40
|
-
**Single source of truth**: `mplang.edsl.typing.MPType`
|
|
41
|
-
|
|
42
|
-
```python
|
|
43
|
-
from mplang2.edsl.typing import Tensor, Vector, MPType, f32
|
|
44
|
-
|
|
45
|
-
# All types use BaseType
|
|
46
|
-
plaintext: MPType = Tensor[f32, (4096,)]
|
|
47
|
-
ciphertext: MPType = Vector[f32, 4096]
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 3. Explicit Tracing
|
|
51
|
-
|
|
52
|
-
**Clean context management**:
|
|
53
|
-
```python
|
|
54
|
-
from mplang2.edsl import Tracer
|
|
55
|
-
|
|
56
|
-
tracer = Tracer()
|
|
57
|
-
with tracer: # Context manager protocol
|
|
58
|
-
result = my_function(x, y)
|
|
59
|
-
graph = tracer.finalize(result)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### 4. Extensibility
|
|
63
|
-
|
|
64
|
-
Easy to add new backends:
|
|
65
|
-
- FHE (Fully Homomorphic Encryption)
|
|
66
|
-
- TEE (Trusted Execution Environment)
|
|
67
|
-
- Custom accelerators
|
|
68
|
-
|
|
69
|
-
### 5. Layered API Architecture
|
|
70
|
-
|
|
71
|
-
The EDSL provides two distinct API layers:
|
|
72
|
-
|
|
73
|
-
1. **Low-Level API (Graph Manipulation)**:
|
|
74
|
-
- Direct manipulation of the `Graph` IR.
|
|
75
|
-
- Generic `add_op` method (pure graph API, no op semantics).
|
|
76
|
-
- Analogous to MLIR's generic operation construction.
|
|
77
|
-
- Used by compiler passes and backend implementations.
|
|
78
|
-
|
|
79
|
-
2. **High-Level API (Tracing)**:
|
|
80
|
-
- Uses `Tracer` + `Primitive` (with `abstract_eval`).
|
|
81
|
-
- Pythonic interface (functions, operators).
|
|
82
|
-
- Automatic type inference and graph construction.
|
|
83
|
-
- The primary interface for users.
|
|
84
|
-
|
|
85
|
-
## Directory Structure
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
mplang/edsl/
|
|
89
|
-
├── __init__.py # Public API
|
|
90
|
-
├── README.md # This file
|
|
91
|
-
│
|
|
92
|
-
├── design/ # Design documents
|
|
93
|
-
│ ├── architecture.md # Complete architecture overview
|
|
94
|
-
│ ├── type_system.md # Type system design
|
|
95
|
-
│ └── migration.md # Migration from mplang.core
|
|
96
|
-
│
|
|
97
|
-
├── typing.py # ✅ Unified type system
|
|
98
|
-
├── graph.py # ✅ IR: Operation List + SSA
|
|
99
|
-
├── primitive.py # ✅ Primitive abstraction
|
|
100
|
-
├── object.py # ✅ TraceObject/InterpObject
|
|
101
|
-
├── context.py # ✅ Context management
|
|
102
|
-
├── tracer.py # ✅ Explicit tracer
|
|
103
|
-
├── interpreter.py # ✅ Interpreter + GraphInterpreter
|
|
104
|
-
└── jit.py # ✅ @jit decorator
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Implementation Status
|
|
108
|
-
|
|
109
|
-
### ✅ Completed (Phase 1-4)
|
|
110
|
-
|
|
111
|
-
- [x] Type system (`typing.py`) - 649 lines
|
|
112
|
-
- [x] Graph IR (`graph.py`) - 388 lines
|
|
113
|
-
- [x] Primitive abstraction (`primitive.py`) - 338 lines
|
|
114
|
-
- [x] Object hierarchy (`object.py`) - 153 lines
|
|
115
|
-
- [x] Context system (`context.py`) - 117 lines
|
|
116
|
-
- [x] Tracer (`tracer.py`) - 201 lines
|
|
117
|
-
- [x] Interpreter (`interpreter.py`) - 66 lines
|
|
118
|
-
- [x] JIT decorator (`jit.py`) - 42 lines
|
|
119
|
-
- [x] Design documents
|
|
120
|
-
- [x] **153 tests passing** (140 edsl + 13 core2)
|
|
121
|
-
|
|
122
|
-
### 🚧 In Progress
|
|
123
|
-
- [ ] Integration with existing ops/kernels
|
|
124
|
-
- [ ] Migration utilities
|
|
125
|
-
- [ ] Performance benchmarks
|
|
126
|
-
|
|
127
|
-
### ❌ Dropped / Deprecated
|
|
128
|
-
- [x] Builder API (`builder.py`) - Integrated into `Tracer`
|
|
129
|
-
|
|
130
|
-
### 📋 Planned
|
|
131
|
-
- [ ] Advanced optimizations
|
|
132
|
-
- [ ] More backends (TEE, MPC)
|
|
133
|
-
|
|
134
|
-
## Quick Start
|
|
135
|
-
|
|
136
|
-
### Using the New Type System
|
|
137
|
-
|
|
138
|
-
```python
|
|
139
|
-
from mplang2.edsl.typing import Tensor, Vector, CustomType, f32
|
|
140
|
-
|
|
141
|
-
# Define types
|
|
142
|
-
PlaintextVec = Tensor[f32, (4096,)]
|
|
143
|
-
CiphertextVec = Vector[f32, 4096]
|
|
144
|
-
EncryptionKey = CustomType("EncryptionKey")
|
|
145
|
-
|
|
146
|
-
# Type annotations
|
|
147
|
-
def encrypt(data: PlaintextVec, key: EncryptionKey) -> CiphertextVec:
|
|
148
|
-
...
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Using the Tracer (Graph Construction)
|
|
152
|
-
|
|
153
|
-
```python
|
|
154
|
-
from mplang2.edsl import Tracer
|
|
155
|
-
from mplang2.dialects.simp import pcall_static
|
|
156
|
-
|
|
157
|
-
def my_program(x, y):
|
|
158
|
-
# This function is traced into a Graph
|
|
159
|
-
return pcall_static((0, 1), lambda a, b: a + b, x, y)
|
|
160
|
-
|
|
161
|
-
tracer = Tracer()
|
|
162
|
-
with tracer:
|
|
163
|
-
# Inputs are automatically lifted to TraceObjects
|
|
164
|
-
result = my_program(x, y)
|
|
165
|
-
|
|
166
|
-
# Finalize graph
|
|
167
|
-
graph = tracer.finalize(result)
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## Design Documents
|
|
171
|
-
|
|
172
|
-
Detailed design documents are in the `design/` subdirectory:
|
|
173
|
-
|
|
174
|
-
### 1. [architecture.md](design/architecture.md)
|
|
175
|
-
|
|
176
|
-
Complete EDSL architecture overview covering:
|
|
177
|
-
- Core components (Tracer, Graph)
|
|
178
|
-
- Design principles (Closed-World, TracedFunction vs First-Class Functions)
|
|
179
|
-
- Control flow handling (Dialect-specific, e.g., `simp.uniform_cond`)
|
|
180
|
-
- Comparison with JAX, PyTorch, TensorFlow
|
|
181
|
-
|
|
182
|
-
### 2. [type_system.md](design/type_system.md)
|
|
183
|
-
|
|
184
|
-
New type system design:
|
|
185
|
-
- Three orthogonal dimensions (Layout, Encryption, Distribution)
|
|
186
|
-
- Type composition examples
|
|
187
|
-
- Ops writing guide
|
|
188
|
-
- Migration strategy
|
|
189
|
-
|
|
190
|
-
### 3. [migration.md](design/migration.md)
|
|
191
|
-
|
|
192
|
-
Migration path from `mplang.core` to `mplang.edsl`:
|
|
193
|
-
- 6-phase migration plan
|
|
194
|
-
- Backward compatibility strategy
|
|
195
|
-
- Type conversion utilities
|
|
196
|
-
|
|
197
|
-
## Relationship with mplang.core
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
mplang/
|
|
201
|
-
├── core/ # Stable API (current production)
|
|
202
|
-
│ ├── primitive.py
|
|
203
|
-
│ ├── tracer.py
|
|
204
|
-
│ └── expr/
|
|
205
|
-
│
|
|
206
|
-
├── edsl/ # Experimental (this directory)
|
|
207
|
-
│ ├── typing.py # Can be used independently
|
|
208
|
-
│ ├── graph.py # Future replacement for core.expr
|
|
209
|
-
│ └── tracer.py # Future replacement for core.tracer
|
|
210
|
-
│
|
|
211
|
-
├── ops/ # Shared between core and edsl
|
|
212
|
-
├── kernels/ # Shared between core and edsl
|
|
213
|
-
└── runtime/ # Shared between core and edsl
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
**Migration Strategy**:
|
|
217
|
-
1. Develop `edsl` in parallel (no breaking changes to `core`)
|
|
218
|
-
2. Gradually move internal code to use `edsl.typing`
|
|
219
|
-
3. Add adapters between `core` and `edsl`
|
|
220
|
-
4. Deprecate `core` in future major version
|
|
221
|
-
|
|
222
|
-
## Contributing
|
|
223
|
-
|
|
224
|
-
We welcome contributions! Since this is experimental:
|
|
225
|
-
|
|
226
|
-
1. **Read the design docs first**: Understand the architecture
|
|
227
|
-
2. **Start small**: Pick a specific component (e.g., Graph IR)
|
|
228
|
-
3. **Discuss early**: Open an issue before implementing
|
|
229
|
-
4. **Test thoroughly**: Add unit tests for new code
|
|
230
|
-
|
|
231
|
-
### Development Workflow
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
# Install dev dependencies
|
|
235
|
-
uv sync --group dev
|
|
236
|
-
|
|
237
|
-
# Run tests (future)
|
|
238
|
-
uv run pytest mplang/edsl/
|
|
239
|
-
|
|
240
|
-
# Lint
|
|
241
|
-
uv run ruff check mplang/edsl/
|
|
242
|
-
uv run ruff format mplang/edsl/
|
|
243
|
-
|
|
244
|
-
# Type check
|
|
245
|
-
uv run mypy mplang/edsl/
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
## FAQ
|
|
249
|
-
|
|
250
|
-
### Q: Should I use `mplang.edsl` in production?
|
|
251
|
-
|
|
252
|
-
**A**: No, use `mplang.core`. `mplang.edsl` is experimental.
|
|
253
|
-
|
|
254
|
-
### Q: Can I use `mplang.edsl.typing` independently?
|
|
255
|
-
|
|
256
|
-
**A**: Yes! The type system is stable and can be used for type annotations.
|
|
257
|
-
|
|
258
|
-
### Q: When will `edsl` replace `core`?
|
|
259
|
-
|
|
260
|
-
**A**: No timeline yet. We need to:
|
|
261
|
-
1. Complete the implementation
|
|
262
|
-
2. Validate performance
|
|
263
|
-
3. Migrate all tests
|
|
264
|
-
4. Get community feedback
|
|
265
|
-
|
|
266
|
-
### Q: How can I help?
|
|
267
|
-
|
|
268
|
-
**A**: Check the implementation status above and pick an unimplemented component. Open an issue to discuss!
|
|
269
|
-
|
|
270
|
-
## References
|
|
271
|
-
|
|
272
|
-
- **torch.fx**: https://pytorch.org/docs/stable/fx.html
|
|
273
|
-
- **JAX jaxpr**: https://jax.readthedocs.io/en/latest/jaxpr.html
|
|
274
|
-
- **MLIR**: https://mlir.llvm.org/
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
**Last Updated**: 2025-01-11
|
|
279
|
-
**Maintainers**: MPLang Team
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/state.py
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/values.py
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/state.py
RENAMED
|
File without changes
|
|
File without changes
|