mplang-nightly 0.1.dev283__tar.gz → 0.1.dev285__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.dev283 → mplang_nightly-0.1.dev285}/PKG-INFO +1 -1
- mplang_nightly-0.1.dev285/mplang/edsl/README.md +252 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/typing.py +1 -1
- mplang_nightly-0.1.dev283/mplang/edsl/README.md +0 -279
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/.gitignore +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/LICENSE +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/README.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/examples/.gitkeep +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/hatch_build.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/channel.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/field_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/func_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/phe_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_design.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/http.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/mem.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/ops.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/state.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/values.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/http.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/mem.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/ops.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/state.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/spu_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/spu_state.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/store_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/table_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/tee_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/cli.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/cli_guide.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/bfv.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/crypto.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/dtypes.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/field.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/func.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/phe.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/simp.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/spu.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/store.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/table.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/tee.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/dialects/tensor.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/context.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/graph.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/jit.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/object.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/primitive.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/printer.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/program.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/registry.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/serde.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/edsl/tracer.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/Makefile +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/gf128.cpp +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/ldpc.cpp +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/okvs.cpp +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/okvs_opt.cpp +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/kernels/py_kernels.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/collective.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/device/api.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/device/cluster.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/ml/sgb.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/_utils.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/analytics/aggregation.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/analytics/groupby.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/analytics/groupby.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/analytics/permutation.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/common/constants.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/ot/base.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/ot/extension.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/ot/silent.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/cuckoo.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/okvs.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/oprf.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/rr22.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/psi/unbalanced.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/vole/gilboa.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/vole/ldpc.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/libs/mpc/vole/silver.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/py.typed +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/runtime/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/runtime/dialect_state.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/runtime/interpreter.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/runtime/object_store.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/runtime/value.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/tool/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/tool/program.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/utils/func_utils.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/utils/logging.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/pyproject.toml +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_driver/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_driver/test_http.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_worker/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_worker/test_http.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_worker/test_mem.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/simp_worker/test_shuffle_exec_id_key.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_bfv_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_channel.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_crypto_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_okvs_binding.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_simp_integration.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_simp_object_store.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_spu_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_table_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_tee_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_tensor_impl.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/backends/test_verify_clean.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/conftest.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_bfv.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_crypto.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_dtypes.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_field.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_func.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_okvs.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_okvs_bench.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_phe.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_simp.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_simp_comm.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_spu.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_store.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_table.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_tee.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/dialects/test_tensor.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_compiled_program_artifact.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_context.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_graph.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_primitive.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_primitive_multi_output.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_printer.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_serde.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_tracer.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_typing.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/edsl/test_typing_graph_serde.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/conftest.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/test_device_api_errors.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/test_device_dialects.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/test_device_layouts.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/device/test_device_tee.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/ml/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/ml/test_sgb.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/ml/test_sgb_bench.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/analytics/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/analytics/test_aggregation.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/analytics/test_groupby.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/analytics/test_permutation.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/ot/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/ot/test_ot.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/ot/test_ot_extension.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/ot/test_silent_ot.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/test_okvs_gct.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/test_oprf.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/test_psi.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/test_psi_bench.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/test_rr22.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/test_field_gf128.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/test_utils.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/test_gilboa_manual.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/test_ldpc.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/test_silver_vole.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/test_vole.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/test_vole_bench.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/mpc/vole/verify_vole_logic.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/test_collective.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/libs/test_simple_guide.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/runtime/test_interpreter_async.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/runtime/test_object_store.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/runtime/test_object_store_fs.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/test_fetch_semantics.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/test_pytree_io.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/utils/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/utils/tensor_patch.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/utils/test_func_utils.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tests/utils/test_logging.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/00_device_basics.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/01_function_decorator.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/02_simulation_and_driver.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/03_run_jax.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/04_ir_dump_and_analysis.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/05_run_sql.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/06_pipeline.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/07_stax_nn.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/08_logging.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/MIGRATION.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/README.md +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/__init__.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/data/alice.csv +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/data/bob.csv +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/tutorials/data/prepare_vertical_iris.py +0 -0
- {mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/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
|
|
|
@@ -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.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/state.py
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_driver/values.py
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev283 → mplang_nightly-0.1.dev285}/mplang/backends/simp_worker/state.py
RENAMED
|
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
|
|
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
|