mplang-nightly 0.1.dev150__tar.gz → 0.1.dev152__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 (165) hide show
  1. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/PKG-INFO +1 -1
  2. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/context.py +10 -5
  3. mplang_nightly-0.1.dev150/mplang/kernels/tee.py → mplang_nightly-0.1.dev152/mplang/kernels/mock_tee.py +11 -2
  4. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/sql_duckdb.py +5 -0
  5. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/base.py +2 -2
  6. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/ibis_cc.py +1 -0
  7. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/sql.py +2 -1
  8. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/simulation.py +34 -30
  9. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_crypto_tee.py +3 -1
  10. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/test_simulation.py +2 -2
  11. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/3_device.py +3 -1
  12. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/9_tee.py +3 -1
  13. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/.gitignore +0 -0
  14. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/LICENSE +0 -0
  15. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/README.md +0 -0
  16. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/conf/3pc.yaml +0 -0
  17. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/stax_nn/README.md +0 -0
  18. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/stax_nn/models.py +0 -0
  19. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/stax_nn/stax_nn.py +0 -0
  20. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/hist_jax.py +0 -0
  21. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/hist_jax_test.py +0 -0
  22. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/naive_np.py +0 -0
  23. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/readme.md +0 -0
  24. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/sgb.py +0 -0
  25. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/examples/xgboost/sgb_test.py +0 -0
  26. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/hatch_build.py +0 -0
  27. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/__init__.py +0 -0
  28. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/analysis/__init__.py +0 -0
  29. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/analysis/diagram.py +0 -0
  30. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/api.py +0 -0
  31. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/__init__.py +0 -0
  32. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/cluster.py +0 -0
  33. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/comm.py +0 -0
  34. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/context_mgr.py +0 -0
  35. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/dtype.py +0 -0
  36. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/__init__.py +0 -0
  37. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/ast.py +0 -0
  38. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/evaluator.py +0 -0
  39. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/printer.py +0 -0
  40. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/transformer.py +0 -0
  41. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/utils.py +0 -0
  42. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/visitor.py +0 -0
  43. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/expr/walk.py +0 -0
  44. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/interp.py +0 -0
  45. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/mask.py +0 -0
  46. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/mpir.py +0 -0
  47. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/mpobject.py +0 -0
  48. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/mptype.py +0 -0
  49. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/pfunc.py +0 -0
  50. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/primitive.py +0 -0
  51. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/table.py +0 -0
  52. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/tensor.py +0 -0
  53. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/core/tracer.py +0 -0
  54. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/device.py +0 -0
  55. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/__init__.py +0 -0
  56. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/base.py +0 -0
  57. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/builtin.py +0 -0
  58. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/crypto.py +0 -0
  59. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/phe.py +0 -0
  60. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/spu.py +0 -0
  61. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/kernels/stablehlo.py +0 -0
  62. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/__init__.py +0 -0
  63. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/builtin.py +0 -0
  64. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/crypto.py +0 -0
  65. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/jax_cc.py +0 -0
  66. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/phe.py +0 -0
  67. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/spu.py +0 -0
  68. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/ops/tee.py +0 -0
  69. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/protos/v1alpha1/mpir_pb2.py +0 -0
  70. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/protos/v1alpha1/mpir_pb2.pyi +0 -0
  71. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/protos/v1alpha1/mpir_pb2_grpc.py +0 -0
  72. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/__init__.py +0 -0
  73. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/cli.py +0 -0
  74. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/client.py +0 -0
  75. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/communicator.py +0 -0
  76. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/data_providers.py +0 -0
  77. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/driver.py +0 -0
  78. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/exceptions.py +0 -0
  79. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/http_api.md +0 -0
  80. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/link_comm.py +0 -0
  81. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/resource.py +0 -0
  82. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/runtime/server.py +0 -0
  83. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/simp/__init__.py +0 -0
  84. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/simp/mpi.py +0 -0
  85. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/simp/random.py +0 -0
  86. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/simp/smpc.py +0 -0
  87. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/utils/__init__.py +0 -0
  88. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/utils/crypto.py +0 -0
  89. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/utils/func_utils.py +0 -0
  90. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/utils/spu_utils.py +0 -0
  91. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/mplang/utils/table_utils.py +0 -0
  92. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/pyproject.toml +0 -0
  93. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/__init__.py +0 -0
  94. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/analysis/test_diagram.py +0 -0
  95. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/__init__.py +0 -0
  96. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/__init__.py +0 -0
  97. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/conftest.py +0 -0
  98. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/test_ast.py +0 -0
  99. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/test_printer.py +0 -0
  100. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/test_utils.py +0 -0
  101. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/expr/test_walk.py +0 -0
  102. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_cluster.py +0 -0
  103. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_dtype.py +0 -0
  104. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_mask.py +0 -0
  105. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_mpir.py +0 -0
  106. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_mptype.py +0 -0
  107. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_primitive.py +0 -0
  108. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_table.py +0 -0
  109. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_tensor.py +0 -0
  110. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/core/test_tracer.py +0 -0
  111. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/device/__init__.py +0 -0
  112. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/device/test_device_basic.py +0 -0
  113. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/README.md +0 -0
  114. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/test_crypto_roundtrip.py +0 -0
  115. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/test_http_e2e.py +0 -0
  116. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/test_symbols_roundtrip.py +0 -0
  117. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/test_tutorials.py +0 -0
  118. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/integration/test_unused_param_integration.py +0 -0
  119. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_builtin.py +0 -0
  120. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_debug_print.py +0 -0
  121. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_kernel_binding.py +0 -0
  122. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_phe.py +0 -0
  123. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_spu.py +0 -0
  124. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_sql_duckdb.py +0 -0
  125. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/kernels/test_stablehlo.py +0 -0
  126. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/__init__.py +0 -0
  127. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/dummy.py +0 -0
  128. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_builtin_pack.py +0 -0
  129. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_feop_base.py +0 -0
  130. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_ibis.py +0 -0
  131. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_ibis_cc.py +0 -0
  132. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_jax_cc.py +0 -0
  133. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_phe.py +0 -0
  134. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_spu.py +0 -0
  135. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_spu_defensive.py +0 -0
  136. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_sql.py +0 -0
  137. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/ops/test_table_tensor_conversion.py +0 -0
  138. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/__init__.py +0 -0
  139. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/test_cli.py +0 -0
  140. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/test_communicator.py +0 -0
  141. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/test_driver.py +0 -0
  142. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/runtime/test_server.py +0 -0
  143. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/simp/test_mpi.py +0 -0
  144. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/simp/test_random.py +0 -0
  145. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/simp/test_simp.py +0 -0
  146. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/simp/test_smpc.py +0 -0
  147. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/simp/test_sugar.py +0 -0
  148. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/utils/__init__.py +0 -0
  149. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/utils/server_fixtures.py +0 -0
  150. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/utils/test_func_utils.py +0 -0
  151. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/utils/test_spu_utils.py +0 -0
  152. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tests/utils/test_table_utils.py +0 -0
  153. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/0_basic.py +0 -0
  154. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/10_analysis.py +0 -0
  155. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/1_condition.py +0 -0
  156. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/2_whileloop.py +0 -0
  157. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/4_simulation.py +0 -0
  158. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/5_ir_dump.py +0 -0
  159. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/6_advanced.py +0 -0
  160. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/7_stdio.py +0 -0
  161. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/8_phe.py +0 -0
  162. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/__init__.py +0 -0
  163. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/pitfalls/late_binding.py +0 -0
  164. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/pitfalls/rand.py +0 -0
  165. {mplang_nightly-0.1.dev150 → mplang_nightly-0.1.dev152}/tutorials/run.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev150
3
+ Version: 0.1.dev152
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -37,11 +37,11 @@ def _ensure_impl_imported() -> None:
37
37
  return
38
38
  from mplang.kernels import builtin as _impl_builtin # noqa: F401
39
39
  from mplang.kernels import crypto as _impl_crypto # noqa: F401
40
+ from mplang.kernels import mock_tee as _impl_tee # noqa: F401
40
41
  from mplang.kernels import phe as _impl_phe # noqa: F401
41
42
  from mplang.kernels import spu as _impl_spu # noqa: F401
42
43
  from mplang.kernels import sql_duckdb as _impl_sql_duckdb # noqa: F401
43
44
  from mplang.kernels import stablehlo as _impl_stablehlo # noqa: F401
44
- from mplang.kernels import tee as _impl_tee # noqa: F401
45
45
 
46
46
  _IMPL_IMPORTED = True
47
47
 
@@ -91,8 +91,8 @@ _DEFAULT_BINDINGS: dict[str, str] = {
91
91
  # generic SQL op; backend-specific kernel id for duckdb
92
92
  "sql.run": "duckdb.run_sql",
93
93
  # tee
94
- "tee.quote": "tee.quote",
95
- "tee.attest": "tee.attest",
94
+ # "tee.quote": "mock_tee.quote",
95
+ # "tee.attest": "mock_tee.attest",
96
96
  }
97
97
 
98
98
 
@@ -102,6 +102,10 @@ _DEFAULT_BINDINGS: dict[str, str] = {
102
102
  class RuntimeContext:
103
103
  """Per-runtime execution context with isolated op->kernel bindings.
104
104
 
105
+ This object owns ONLY static dispatch metadata ("op bindings") and mutable
106
+ per-rank kernel side state/cache/stats. It does NOT store per-evaluation
107
+ variable bindings (those are provided to the evaluator at evaluation time).
108
+
105
109
  Parameters
106
110
  ----------
107
111
  rank : int
@@ -110,9 +114,10 @@ class RuntimeContext:
110
114
  Total number of participants.
111
115
  initial_bindings : Mapping[str, str] | None, optional
112
116
  Optional partial overrides applied on top of the default binding table
113
- during construction (override semantics, not replace). After
117
+ during construction (override semantics, not replace). These map
118
+ op_type -> kernel_id and form a *template* for dispatch. After
114
119
  initialization, all (re)binding must go through ``bind_op`` /
115
- ``rebind_op``.
120
+ ``rebind_op`` on this context (scoped to THIS runtime only).
116
121
  state / cache / stats : dict, optional
117
122
  Mutable pockets reused across kernel invocations. If omitted, new
118
123
  dictionaries are created.
@@ -15,6 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import os
18
+ import warnings
18
19
 
19
20
  import numpy as np
20
21
  from numpy.typing import NDArray
@@ -43,16 +44,24 @@ def _quote_from_pk(pk: np.ndarray) -> NDArray[np.uint8]:
43
44
  return out
44
45
 
45
46
 
46
- @kernel_def("tee.quote")
47
+ @kernel_def("mock_tee.quote")
47
48
  def _tee_quote(pfunc: PFunction, pk: object) -> NDArray[np.uint8]:
49
+ warnings.warn(
50
+ "Insecure mock TEE kernel 'mock_tee.quote' in use. NOT secure; for local testing only.",
51
+ stacklevel=3,
52
+ )
48
53
  pk = np.asarray(pk, dtype=np.uint8)
49
54
  # rng access ensures deterministic seeding per rank even if unused now
50
55
  _rng()
51
56
  return _quote_from_pk(pk)
52
57
 
53
58
 
54
- @kernel_def("tee.attest")
59
+ @kernel_def("mock_tee.attest")
55
60
  def _tee_attest(pfunc: PFunction, quote: object) -> NDArray[np.uint8]:
61
+ warnings.warn(
62
+ "Insecure mock TEE kernel 'mock_tee.attest' in use. NOT secure; for local testing only.",
63
+ stacklevel=3,
64
+ )
56
65
  quote = np.asarray(quote, dtype=np.uint8)
57
66
  if quote.size != 33:
58
67
  raise ValueError("mock quote must be 33 bytes (1 header + 32 pk)")
@@ -25,6 +25,11 @@ def _duckdb_sql(pfunc: PFunction, *args: Any) -> Any:
25
25
  import duckdb
26
26
  import pandas as pd
27
27
 
28
+ # TODO: maybe we could translate the sql to duckdb dialect
29
+ # instead of raising an exception
30
+ if pfunc.attrs.get("dialect") != "duckdb":
31
+ raise ValueError("duckdb.run_sql must have dialect=duckdb attr")
32
+
28
33
  conn = duckdb.connect(":memory:")
29
34
  if args:
30
35
  in_names = pfunc.attrs.get("in_names")
@@ -30,7 +30,7 @@ from mplang.core.tensor import TensorType
30
30
  # The standard return contract for frontend operations (FeOperation.trace).
31
31
  #
32
32
  # Triad := (PFunction, list[MPObject], PyTreeDef)
33
- # - PFunction: Captures fn_type (routing key, e.g., "mlir.stablehlo", "sql.duckdb"),
33
+ # - PFunction: Captures fn_type (routing key, e.g., "mlir.stablehlo", "sql.run"),
34
34
  # input/output MPTypes and optional attributes.
35
35
  # - list[MPObject]: The flat positional MPObjects captured under the current
36
36
  # context (Trace/Interp). Order matches pfunc.ins_info.
@@ -422,6 +422,6 @@ def list_ops(module: str | None = None) -> dict[tuple[str, str], FeOperation]:
422
422
  # - For type-only kernels, use @module.typed_op(pfunc_name)(kernel). The op name is derived from the kernel function name.
423
423
  # - For complex ops (with Python callables/closures), subclass FeOperation and register
424
424
  # using get_registry().register_op(module, name, op_instance) or use @module.feop with InlineFeOperation.
425
- # - Ensure PFunction.fn_type is set as the routing key (e.g., "mlir.stablehlo", "sql.duckdb").
425
+ # - Ensure PFunction.fn_type is set as the routing key (e.g., "mlir.stablehlo", "sql.run").
426
426
  # - Keep device selection/routing out of frontend code; only set fn_type and attributes.
427
427
  # - Avoid moving MPObjects across contexts directly; capture within current ctx in trace().
@@ -65,6 +65,7 @@ def ibis2sql(
65
65
  ins_info=tuple(ins_info),
66
66
  outs_info=tuple(outs_info),
67
67
  in_names=tuple(in_names),
68
+ dialect="duckdb",
68
69
  )
69
70
  return pfn
70
71
 
@@ -46,12 +46,13 @@ class SqlFE(FeOperation):
46
46
  in_vars.append(tbl)
47
47
 
48
48
  pfn = PFunction(
49
- fn_type=f"sql[{self._dialect}]",
49
+ fn_type="sql.run",
50
50
  fn_name="",
51
51
  fn_text=sql,
52
52
  ins_info=tuple(ins_info),
53
53
  outs_info=(out_type,),
54
54
  in_names=tuple(in_names),
55
+ dialect=self._dialect,
55
56
  )
56
57
  _, treedef = tree_flatten(out_type)
57
58
  return pfn, in_vars, treedef
@@ -34,10 +34,6 @@ from mplang.core.mpir import Reader, Writer
34
34
  from mplang.core.mpobject import MPObject
35
35
  from mplang.core.mptype import MPType, TensorLike
36
36
  from mplang.core.pfunc import PFunction # for spu.seed_env kernel seeding
37
-
38
- # New explicit binding model: we only need RuntimeContext which ensures
39
- # bindings via bind_all_ops() on creation; per-module side-effect imports
40
- # are no longer required here.
41
37
  from mplang.kernels.context import RuntimeContext
42
38
  from mplang.runtime.link_comm import LinkCommunicator
43
39
  from mplang.utils.spu_utils import parse_field, parse_protocol
@@ -90,14 +86,20 @@ class Simulator(InterpContext):
90
86
  cluster_spec: ClusterSpec,
91
87
  *,
92
88
  trace_ranks: list[int] | None = None,
89
+ op_bindings: dict[str, str] | None = None,
93
90
  ) -> None:
94
91
  """Initialize a simulator with the given cluster specification.
95
92
 
96
93
  Args:
97
94
  cluster_spec: The cluster specification defining the simulation environment.
98
95
  trace_ranks: List of ranks to trace execution for debugging.
96
+ op_bindings: Optional op->kernel binding template applied to all
97
+ RuntimeContexts. These are static dispatch overrides (merged
98
+ with project defaults) and are orthogonal to the per-evaluate
99
+ variable ``bindings`` dict passed into ``evaluate``.
99
100
  """
100
101
  super().__init__(cluster_spec)
102
+ self._op_bindings_template = op_bindings or {}
101
103
  self._trace_ranks = trace_ranks or []
102
104
 
103
105
  spu_devices = cluster_spec.get_devices_by_kind("SPU")
@@ -141,20 +143,18 @@ class Simulator(InterpContext):
141
143
  self._spu_world = spu_mask.num_parties()
142
144
  self._spu_mask = spu_mask
143
145
 
144
- # No per-backend handlers needed anymore (all flat kernels)
145
- self._handlers: list[list[Any]] = [[] for _ in range(self.world_size())]
146
-
147
- self._evaluators: list[IEvaluator] = []
148
- for rank in range(self.world_size()):
149
- runtime = RuntimeContext(rank=rank, world_size=self.world_size())
150
- ev = create_evaluator(
151
- rank,
152
- {}, # the global environment for this rank
153
- self._comms[rank],
154
- runtime,
155
- None,
146
+ # Persistent per-rank RuntimeContext instances (reused across evaluates).
147
+ # We no longer pre-create evaluators since each evaluate has different env bindings.
148
+ self._runtimes: list[RuntimeContext] = [
149
+ RuntimeContext(
150
+ rank=rank,
151
+ world_size=self.world_size(),
152
+ # Static op bindings template cloned into each runtime. These are kernel
153
+ # dispatch mappings, not per-evaluate variable bindings.
154
+ initial_bindings=self._op_bindings_template,
156
155
  )
157
- self._evaluators.append(ev)
156
+ for rank in range(self.world_size())
157
+ ]
158
158
 
159
159
  @classmethod
160
160
  def simple(
@@ -215,10 +215,10 @@ class Simulator(InterpContext):
215
215
  for rank in range(self.world_size())
216
216
  ]
217
217
 
218
- # Build per-rank evaluators with the per-party environment
218
+ # Build per-rank evaluators with the per-party environment (runtime reused)
219
219
  pts_evaluators: list[IEvaluator] = []
220
220
  for rank in range(self.world_size()):
221
- runtime = RuntimeContext(rank=rank, world_size=self.world_size())
221
+ runtime = self._runtimes[rank]
222
222
  ev = create_evaluator(
223
223
  rank,
224
224
  pts_env[rank],
@@ -226,17 +226,21 @@ class Simulator(InterpContext):
226
226
  runtime,
227
227
  None,
228
228
  )
229
- link_ctx = self._spu_link_ctxs[rank]
230
- seed_fn = PFunction(
231
- fn_type="spu.seed_env",
232
- ins_info=(),
233
- outs_info=(),
234
- config=self._spu_runtime_cfg,
235
- world=self._spu_world,
236
- link=link_ctx,
237
- )
238
- # Seed SPU backend environment explicitly via runtime (no evaluator fast-path)
239
- ev.runtime.run_kernel(seed_fn, []) # type: ignore[arg-type]
229
+ # Seed SPU once per runtime (idempotent logical requirement)
230
+ # Use setdefault to both retrieve and create metadata dict in one step.
231
+ spu_meta = runtime.state.setdefault("_spu", {})
232
+ if not spu_meta.get("inited", False):
233
+ link_ctx = self._spu_link_ctxs[rank]
234
+ seed_fn = PFunction(
235
+ fn_type="spu.seed_env",
236
+ ins_info=(),
237
+ outs_info=(),
238
+ config=self._spu_runtime_cfg,
239
+ world=self._spu_world,
240
+ link=link_ctx,
241
+ )
242
+ ev.runtime.run_kernel(seed_fn, []) # type: ignore[arg-type]
243
+ spu_meta["inited"] = True
240
244
  pts_evaluators.append(ev)
241
245
 
242
246
  # Collect evaluation results from all parties
@@ -74,7 +74,9 @@ def _demo_flow():
74
74
 
75
75
 
76
76
  def test_crypto_enc_dec_and_tee_quote_attest_roundtrip():
77
- sim = mplang.Simulator.simple(3)
77
+ # Create simulator with TEE bindings using the new initial_bindings parameter
78
+ tee_bindings = {"tee.quote": "mock_tee.quote", "tee.attest": "mock_tee.attest"}
79
+ sim = mplang.Simulator.simple(3, op_bindings=tee_bindings)
78
80
  p0, p1 = mplang.evaluate(sim, _demo_flow)
79
81
  a = mplang.fetch(sim, p0)
80
82
  b = mplang.fetch(sim, p1)
@@ -107,10 +107,10 @@ class TestSimulator:
107
107
  def test_simulator_creation(self):
108
108
  """Test Simulator creation."""
109
109
  sim = Simulator.simple(world_size=3)
110
-
111
110
  assert sim.world_size() == 3
112
111
  assert len(sim._comms) == 3
113
- assert len(sim._evaluators) == 3
112
+ # persistent runtimes after refactor
113
+ assert len(sim._runtimes) == 3
114
114
 
115
115
  # Check that communicators are properly connected
116
116
  for i, comm in enumerate(sim._comms):
@@ -100,7 +100,9 @@ def run_spu():
100
100
  def run_tee():
101
101
  print("-" * 10, "millionaire (TEE)", "-" * 10)
102
102
 
103
- sim = mplang.Simulator(cluster_spec)
103
+ # TEE operations need explicit binding for security
104
+ tee_bindings = {"tee.quote": "mock_tee.quote", "tee.attest": "mock_tee.attest"}
105
+ sim = mplang.Simulator(cluster_spec, op_bindings=tee_bindings)
104
106
  x_p0, y_p1, z_t, r_p0 = mplang.evaluate(sim, millionaire, "TEE0")
105
107
  print("x_p0:", x_p0, mpd.fetch(sim, x_p0))
106
108
  print("y_p1:", y_p1, mpd.fetch(sim, y_p1))
@@ -116,7 +116,9 @@ def millionaire_manual():
116
116
 
117
117
  def main():
118
118
  print("-" * 10, "TEE millionaire: device vs manual (end-to-end IR)", "-" * 10)
119
- sim = Simulator(cluster_spec)
119
+ # Create simulator with TEE bindings
120
+ tee_bindings = {"tee.quote": "mock_tee.quote", "tee.attest": "mock_tee.attest"}
121
+ sim = Simulator(cluster_spec, op_bindings=tee_bindings)
120
122
 
121
123
  compiled_dev = mplang.compile(sim, millionaire_device)
122
124
  compiled_man = mplang.compile(sim, millionaire_manual)