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.
Files changed (217) hide show
  1. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/PKG-INFO +1 -1
  2. mplang_nightly-0.1.dev286/mplang/edsl/README.md +252 -0
  3. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/typing.py +26 -10
  4. mplang_nightly-0.1.dev284/mplang/edsl/README.md +0 -279
  5. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/.gitignore +0 -0
  6. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/LICENSE +0 -0
  7. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/README.md +0 -0
  8. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/examples/.gitkeep +0 -0
  9. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/hatch_build.py +0 -0
  10. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/__init__.py +0 -0
  11. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/__init__.py +0 -0
  12. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/bfv_impl.py +0 -0
  13. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/channel.py +0 -0
  14. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/crypto_impl.py +0 -0
  15. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/field_impl.py +0 -0
  16. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/func_impl.py +0 -0
  17. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/phe_impl.py +0 -0
  18. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_design.md +0 -0
  19. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/__init__.py +0 -0
  20. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/http.py +0 -0
  21. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/mem.py +0 -0
  22. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/ops.py +0 -0
  23. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/state.py +0 -0
  24. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_driver/values.py +0 -0
  25. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/__init__.py +0 -0
  26. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/http.py +0 -0
  27. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/mem.py +0 -0
  28. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/ops.py +0 -0
  29. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/simp_worker/state.py +0 -0
  30. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/spu_impl.py +0 -0
  31. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/spu_state.py +0 -0
  32. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/store_impl.py +0 -0
  33. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/table_impl.py +0 -0
  34. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/tee_impl.py +0 -0
  35. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/backends/tensor_impl.py +0 -0
  36. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/cli.py +0 -0
  37. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/cli_guide.md +0 -0
  38. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/__init__.py +0 -0
  39. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/bfv.py +0 -0
  40. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/crypto.py +0 -0
  41. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/dtypes.py +0 -0
  42. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/field.py +0 -0
  43. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/func.py +0 -0
  44. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/phe.py +0 -0
  45. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/simp.py +0 -0
  46. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/spu.py +0 -0
  47. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/store.py +0 -0
  48. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/table.py +0 -0
  49. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/tee.py +0 -0
  50. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/dialects/tensor.py +0 -0
  51. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/__init__.py +0 -0
  52. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/context.py +0 -0
  53. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/graph.py +0 -0
  54. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/jit.py +0 -0
  55. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/object.py +0 -0
  56. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/primitive.py +0 -0
  57. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/printer.py +0 -0
  58. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/program.py +0 -0
  59. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/registry.py +0 -0
  60. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/serde.py +0 -0
  61. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/edsl/tracer.py +0 -0
  62. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/Makefile +0 -0
  63. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/__init__.py +0 -0
  64. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/gf128.cpp +0 -0
  65. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/ldpc.cpp +0 -0
  66. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/okvs.cpp +0 -0
  67. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/okvs_opt.cpp +0 -0
  68. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/kernels/py_kernels.py +0 -0
  69. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/collective.py +0 -0
  70. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/__init__.py +0 -0
  71. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/api.py +0 -0
  72. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/device/cluster.py +0 -0
  73. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/ml/__init__.py +0 -0
  74. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/ml/sgb.py +0 -0
  75. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/__init__.py +0 -0
  76. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/_utils.py +0 -0
  77. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/__init__.py +0 -0
  78. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/aggregation.py +0 -0
  79. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/groupby.md +0 -0
  80. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/groupby.py +0 -0
  81. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/analytics/permutation.py +0 -0
  82. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/common/constants.py +0 -0
  83. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/__init__.py +0 -0
  84. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/base.py +0 -0
  85. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/extension.py +0 -0
  86. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/ot/silent.py +0 -0
  87. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/__init__.py +0 -0
  88. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/cuckoo.py +0 -0
  89. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/okvs.py +0 -0
  90. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/okvs_gct.py +0 -0
  91. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/oprf.py +0 -0
  92. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/rr22.py +0 -0
  93. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/psi/unbalanced.py +0 -0
  94. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/gilboa.py +0 -0
  96. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/ldpc.py +0 -0
  97. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/libs/mpc/vole/silver.py +0 -0
  98. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/py.typed +0 -0
  99. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/__init__.py +0 -0
  100. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/dialect_state.py +0 -0
  101. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/interpreter.py +0 -0
  102. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/object_store.py +0 -0
  103. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/runtime/value.py +0 -0
  104. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/tool/__init__.py +0 -0
  105. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/tool/program.py +0 -0
  106. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/__init__.py +0 -0
  107. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/func_utils.py +0 -0
  108. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/mplang/utils/logging.py +0 -0
  109. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/pyproject.toml +0 -0
  110. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/__init__.py +0 -0
  111. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/__init__.py +0 -0
  112. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_driver/__init__.py +0 -0
  113. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_driver/test_http.py +0 -0
  114. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/__init__.py +0 -0
  115. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_http.py +0 -0
  116. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_mem.py +0 -0
  117. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/simp_worker/test_shuffle_exec_id_key.py +0 -0
  118. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_bfv_impl.py +0 -0
  119. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_channel.py +0 -0
  120. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_crypto_impl.py +0 -0
  121. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_okvs_binding.py +0 -0
  122. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_simp_integration.py +0 -0
  123. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_simp_object_store.py +0 -0
  124. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_spu_impl.py +0 -0
  125. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_table_impl.py +0 -0
  126. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_tee_impl.py +0 -0
  127. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_tensor_impl.py +0 -0
  128. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/backends/test_verify_clean.py +0 -0
  129. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/conftest.py +0 -0
  130. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/__init__.py +0 -0
  131. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_bfv.py +0 -0
  132. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_crypto.py +0 -0
  133. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_dtypes.py +0 -0
  134. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_field.py +0 -0
  135. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_func.py +0 -0
  136. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_okvs.py +0 -0
  137. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_okvs_bench.py +0 -0
  138. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_phe.py +0 -0
  139. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_simp.py +0 -0
  140. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_simp_comm.py +0 -0
  141. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_spu.py +0 -0
  142. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_store.py +0 -0
  143. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_table.py +0 -0
  144. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_tee.py +0 -0
  145. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/dialects/test_tensor.py +0 -0
  146. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/__init__.py +0 -0
  147. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_compiled_program_artifact.py +0 -0
  148. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_context.py +0 -0
  149. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_graph.py +0 -0
  150. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_primitive.py +0 -0
  151. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_primitive_multi_output.py +0 -0
  152. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_printer.py +0 -0
  153. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_serde.py +0 -0
  154. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_tracer.py +0 -0
  155. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_typing.py +0 -0
  156. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/edsl/test_typing_graph_serde.py +0 -0
  157. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/__init__.py +0 -0
  158. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/conftest.py +0 -0
  159. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_api_errors.py +0 -0
  160. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_dialects.py +0 -0
  161. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_layouts.py +0 -0
  162. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/device/test_device_tee.py +0 -0
  163. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/__init__.py +0 -0
  164. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/test_sgb.py +0 -0
  165. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/ml/test_sgb_bench.py +0 -0
  166. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/__init__.py +0 -0
  167. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/__init__.py +0 -0
  168. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_aggregation.py +0 -0
  169. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_groupby.py +0 -0
  170. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/analytics/test_permutation.py +0 -0
  171. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/__init__.py +0 -0
  172. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_ot.py +0 -0
  173. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_ot_extension.py +0 -0
  174. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/ot/test_silent_ot.py +0 -0
  175. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/__init__.py +0 -0
  176. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_okvs_gct.py +0 -0
  177. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_oprf.py +0 -0
  178. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_psi.py +0 -0
  179. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_psi_bench.py +0 -0
  180. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/test_rr22.py +0 -0
  181. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  182. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/test_field_gf128.py +0 -0
  183. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/test_utils.py +0 -0
  184. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/__init__.py +0 -0
  185. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_gilboa_manual.py +0 -0
  186. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_ldpc.py +0 -0
  187. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_silver_vole.py +0 -0
  188. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_vole.py +0 -0
  189. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/test_vole_bench.py +0 -0
  190. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/mpc/vole/verify_vole_logic.py +0 -0
  191. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/test_collective.py +0 -0
  192. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/libs/test_simple_guide.py +0 -0
  193. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_interpreter_async.py +0 -0
  194. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_object_store.py +0 -0
  195. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/runtime/test_object_store_fs.py +0 -0
  196. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/test_fetch_semantics.py +0 -0
  197. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/test_pytree_io.py +0 -0
  198. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/__init__.py +0 -0
  199. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/tensor_patch.py +0 -0
  200. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/test_func_utils.py +0 -0
  201. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tests/utils/test_logging.py +0 -0
  202. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/00_device_basics.py +0 -0
  203. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/01_function_decorator.py +0 -0
  204. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/02_simulation_and_driver.py +0 -0
  205. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/03_run_jax.py +0 -0
  206. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/04_ir_dump_and_analysis.py +0 -0
  207. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/05_run_sql.py +0 -0
  208. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/06_pipeline.py +0 -0
  209. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/07_stax_nn.py +0 -0
  210. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/08_logging.py +0 -0
  211. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/MIGRATION.md +0 -0
  212. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/README.md +0 -0
  213. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/__init__.py +0 -0
  214. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/alice.csv +0 -0
  215. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/bob.csv +0 -0
  216. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/data/prepare_vertical_iris.py +0 -0
  217. {mplang_nightly-0.1.dev284 → mplang_nightly-0.1.dev286}/tutorials/run.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev284
3
+ Version: 0.1.dev286
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -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
- 2. **Encryption Types**: Wrap other types to confer privacy properties by making them opaque.
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
- return str(self)
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 variable-length integer type.
193
+ """Represents a fixed-width integer type with configurable bitwidth.
179
194
 
180
- This is a standard integer type with configurable bit width, used for
181
- arbitrary-precision arithmetic. It can represent integers that exceed
182
- the range of fixed-width types like i64.
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 configurable
235
- precision (bitwidth).
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