mplang-nightly 0.1.dev253__tar.gz → 0.1.dev254__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 (385) hide show
  1. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/PKG-INFO +1 -1
  2. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/mem.py +4 -0
  3. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/cli.py +1 -1
  4. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/context.py +4 -4
  5. mplang_nightly-0.1.dev254/mplang/v2/libs/ml/__init__.py +23 -0
  6. {mplang_nightly-0.1.dev253/examples/v2 → mplang_nightly-0.1.dev254/mplang/v2/libs/ml}/sgb.py +16 -283
  7. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/ldpc.py +3 -2
  8. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/interpreter.py +26 -0
  9. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/pyproject.toml +9 -5
  10. mplang_nightly-0.1.dev254/tests/v2/conftest.py +54 -0
  11. mplang_nightly-0.1.dev254/tests/v2/libs/ml/__init__.py +15 -0
  12. mplang_nightly-0.1.dev254/tests/v2/libs/ml/test_sgb.py +164 -0
  13. mplang_nightly-0.1.dev253/examples/v2/sgb_bench.py → mplang_nightly-0.1.dev254/tests/v2/libs/ml/test_sgb_bench.py +1 -2
  14. mplang_nightly-0.1.dev254/tutorials/v2/02_simulation_and_driver.py +124 -0
  15. mplang_nightly-0.1.dev253/examples/v2/bfv_sort_agg.py +0 -213
  16. mplang_nightly-0.1.dev253/examples/v2/pcall_jax.py +0 -89
  17. mplang_nightly-0.1.dev253/examples/v2/phe_sort_agg.py +0 -190
  18. mplang_nightly-0.1.dev253/examples/v2/secure_shuffle_agg.py +0 -131
  19. mplang_nightly-0.1.dev253/tests/v2/conftest.py +0 -46
  20. mplang_nightly-0.1.dev253/tutorials/v2/02_simulation_and_driver.py +0 -181
  21. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/.gitignore +0 -0
  22. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/LICENSE +0 -0
  23. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/README.md +0 -0
  24. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/conf/3pc.yaml +0 -0
  25. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/README.md +0 -0
  26. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/models.py +0 -0
  27. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/stax_nn/stax_nn.py +0 -0
  28. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
  29. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/hist_jax.py +0 -0
  30. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/hist_jax_test.py +0 -0
  31. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/naive_np.py +0 -0
  32. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/readme.md +0 -0
  33. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/sgb.py +0 -0
  34. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/examples/v1/xgboost/sgb_test.py +0 -0
  35. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/hatch_build.py +0 -0
  36. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/__init__.py +0 -0
  37. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/__init__.py +0 -0
  38. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/_device.py +0 -0
  39. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/analysis/__init__.py +0 -0
  40. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/analysis/diagram.py +0 -0
  41. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/__init__.py +0 -0
  42. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/cluster.py +0 -0
  43. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/comm.py +0 -0
  44. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/context_mgr.py +0 -0
  45. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/dtypes.py +0 -0
  46. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/__init__.py +0 -0
  47. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/ast.py +0 -0
  48. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/evaluator.py +0 -0
  49. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/printer.py +0 -0
  50. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/transformer.py +0 -0
  51. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/utils.py +0 -0
  52. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/visitor.py +0 -0
  53. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/expr/walk.py +0 -0
  54. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/interp.py +0 -0
  55. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mask.py +0 -0
  56. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mpir.py +0 -0
  57. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mpobject.py +0 -0
  58. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/mptype.py +0 -0
  59. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/pfunc.py +0 -0
  60. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/primitive.py +0 -0
  61. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/table.py +0 -0
  62. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/tensor.py +0 -0
  63. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/core/tracer.py +0 -0
  64. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/host.py +0 -0
  65. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/__init__.py +0 -0
  66. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/base.py +0 -0
  67. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/basic.py +0 -0
  68. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/context.py +0 -0
  69. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/crypto.py +0 -0
  70. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/fhe.py +0 -0
  71. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/mock_tee.py +0 -0
  72. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/phe.py +0 -0
  73. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/spu.py +0 -0
  74. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/sql_duckdb.py +0 -0
  75. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/stablehlo.py +0 -0
  76. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/kernels/value.py +0 -0
  77. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/__init__.py +0 -0
  78. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/base.py +0 -0
  79. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/basic.py +0 -0
  80. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/crypto.py +0 -0
  81. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/fhe.py +0 -0
  82. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/jax_cc.py +0 -0
  83. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/nnx_cc.py +0 -0
  84. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/phe.py +0 -0
  85. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/spu.py +0 -0
  86. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/sql_cc.py +0 -0
  87. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/ops/tee.py +0 -0
  88. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
  89. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
  90. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
  91. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
  92. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/__init__.py +0 -0
  93. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/cli.py +0 -0
  94. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/client.py +0 -0
  95. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/communicator.py +0 -0
  96. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/data_providers.py +0 -0
  97. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/driver.py +0 -0
  98. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/exceptions.py +0 -0
  99. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/http_api.md +0 -0
  100. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/link_comm.py +0 -0
  101. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/server.py +0 -0
  102. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/session.py +0 -0
  103. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/runtime/simulation.py +0 -0
  104. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/__init__.py +0 -0
  105. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/api.py +0 -0
  106. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/mpi.py +0 -0
  107. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/party.py +0 -0
  108. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/random.py +0 -0
  109. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/simp/smpc.py +0 -0
  110. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/__init__.py +0 -0
  111. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/crypto.py +0 -0
  112. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/func_utils.py +0 -0
  113. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/spu_utils.py +0 -0
  114. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v1/utils/table_utils.py +0 -0
  115. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/__init__.py +0 -0
  116. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/__init__.py +0 -0
  117. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/bfv_impl.py +0 -0
  118. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/crypto_impl.py +0 -0
  119. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/field_impl.py +0 -0
  120. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/func_impl.py +0 -0
  121. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/phe_impl.py +0 -0
  122. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_design.md +0 -0
  123. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/__init__.py +0 -0
  124. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/http.py +0 -0
  125. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/ops.py +0 -0
  126. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/state.py +0 -0
  127. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_driver/values.py +0 -0
  128. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/__init__.py +0 -0
  129. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/http.py +0 -0
  130. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/mem.py +0 -0
  131. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/ops.py +0 -0
  132. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/simp_worker/state.py +0 -0
  133. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/spu_impl.py +0 -0
  134. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/store_impl.py +0 -0
  135. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/table_impl.py +0 -0
  136. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/tee_impl.py +0 -0
  137. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/backends/tensor_impl.py +0 -0
  138. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/cli_guide.md +0 -0
  139. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/__init__.py +0 -0
  140. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/bfv.py +0 -0
  141. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/crypto.py +0 -0
  142. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/dtypes.py +0 -0
  143. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/field.py +0 -0
  144. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/func.py +0 -0
  145. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/phe.py +0 -0
  146. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/simp.py +0 -0
  147. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/spu.py +0 -0
  148. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/store.py +0 -0
  149. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/table.py +0 -0
  150. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/tee.py +0 -0
  151. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/dialects/tensor.py +0 -0
  152. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/README.md +0 -0
  153. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/__init__.py +0 -0
  154. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/graph.py +0 -0
  155. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/jit.py +0 -0
  156. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/object.py +0 -0
  157. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/primitive.py +0 -0
  158. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/printer.py +0 -0
  159. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/registry.py +0 -0
  160. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/serde.py +0 -0
  161. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/tracer.py +0 -0
  162. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/edsl/typing.py +0 -0
  163. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/Makefile +0 -0
  164. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/__init__.py +0 -0
  165. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/gf128.cpp +0 -0
  166. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/ldpc.cpp +0 -0
  167. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/okvs.cpp +0 -0
  168. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/okvs_opt.cpp +0 -0
  169. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/kernels/py_kernels.py +0 -0
  170. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/collective.py +0 -0
  171. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/__init__.py +0 -0
  172. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/api.py +0 -0
  173. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/device/cluster.py +0 -0
  174. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/__init__.py +0 -0
  175. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/_utils.py +0 -0
  176. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
  177. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
  178. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
  179. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
  180. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
  181. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/common/constants.py +0 -0
  182. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
  183. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/base.py +0 -0
  184. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/extension.py +0 -0
  185. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/ot/silent.py +0 -0
  186. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
  187. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
  188. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
  189. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
  190. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
  191. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
  192. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
  193. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
  194. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
  195. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/libs/mpc/vole/silver.py +0 -0
  196. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/__init__.py +0 -0
  197. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/dialect_state.py +0 -0
  198. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/object_store.py +0 -0
  199. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/mplang/v2/runtime/value.py +0 -0
  200. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/__init__.py +0 -0
  201. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/conftest.py +0 -0
  202. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/__init__.py +0 -0
  203. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/analysis/test_diagram.py +0 -0
  204. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/conftest.py +0 -0
  205. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/__init__.py +0 -0
  206. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/__init__.py +0 -0
  207. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/conftest.py +0 -0
  208. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_ast.py +0 -0
  209. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_printer.py +0 -0
  210. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_utils.py +0 -0
  211. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/expr/test_walk.py +0 -0
  212. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_cluster.py +0 -0
  213. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_dtype.py +0 -0
  214. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mask.py +0 -0
  215. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mpir.py +0 -0
  216. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_mptype.py +0 -0
  217. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_primitive.py +0 -0
  218. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_table.py +0 -0
  219. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_tensor.py +0 -0
  220. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/core/test_tracer.py +0 -0
  221. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/device/__init__.py +0 -0
  222. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/device/test_device_basic.py +0 -0
  223. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/README.md +0 -0
  224. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
  225. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_http_e2e.py +0 -0
  226. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
  227. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_tee_workflow.py +0 -0
  228. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_tutorials.py +0 -0
  229. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/integration/test_unused_param_integration.py +0 -0
  230. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/__init__.py +0 -0
  231. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_basic.py +0 -0
  232. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_debug_print.py +0 -0
  233. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_fhe.py +0 -0
  234. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_kernel_binding.py +0 -0
  235. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_phe.py +0 -0
  236. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_spu.py +0 -0
  237. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_sql_duckdb.py +0 -0
  238. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_stablehlo.py +0 -0
  239. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_value.py +0 -0
  240. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/kernels/test_value_serde.py +0 -0
  241. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/__init__.py +0 -0
  242. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/dummy.py +0 -0
  243. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_basic_pack.py +0 -0
  244. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_crypto.py +0 -0
  245. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_feop_base.py +0 -0
  246. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_jax_cc.py +0 -0
  247. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_nnx_cc.py +0 -0
  248. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_phe.py +0 -0
  249. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_spu.py +0 -0
  250. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_spu_defensive.py +0 -0
  251. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_sql.py +0 -0
  252. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_sql_cc.py +0 -0
  253. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
  254. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/__init__.py +0 -0
  255. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_cli.py +0 -0
  256. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_communicator.py +0 -0
  257. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_driver.py +0 -0
  258. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_server.py +0 -0
  259. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/runtime/test_simulation.py +0 -0
  260. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_mpi.py +0 -0
  261. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_random.py +0 -0
  262. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_smpc.py +0 -0
  263. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/simp/test_sugar.py +0 -0
  264. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/__init__.py +0 -0
  265. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/server_fixtures.py +0 -0
  266. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_func_utils.py +0 -0
  267. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_spu_utils.py +0 -0
  268. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v1/utils/test_table_utils.py +0 -0
  269. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/__init__.py +0 -0
  270. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/__init__.py +0 -0
  271. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_driver/__init__.py +0 -0
  272. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_driver/test_http.py +0 -0
  273. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/__init__.py +0 -0
  274. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/test_http.py +0 -0
  275. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/simp_worker/test_mem.py +0 -0
  276. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_bfv_impl.py +0 -0
  277. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_crypto_impl.py +0 -0
  278. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_okvs_binding.py +0 -0
  279. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_simp_integration.py +0 -0
  280. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_simp_object_store.py +0 -0
  281. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_spu_impl.py +0 -0
  282. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_table_impl.py +0 -0
  283. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_tee_impl.py +0 -0
  284. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_tensor_impl.py +0 -0
  285. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/backends/test_verify_clean.py +0 -0
  286. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/__init__.py +0 -0
  287. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_bfv.py +0 -0
  288. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_crypto.py +0 -0
  289. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_dtypes.py +0 -0
  290. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_field.py +0 -0
  291. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_func.py +0 -0
  292. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_okvs.py +0 -0
  293. /mplang_nightly-0.1.dev253/examples/v2/okvs_microbench.py → /mplang_nightly-0.1.dev254/tests/v2/dialects/test_okvs_bench.py +0 -0
  294. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_phe.py +0 -0
  295. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_simp.py +0 -0
  296. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_simp_comm.py +0 -0
  297. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_spu.py +0 -0
  298. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_table.py +0 -0
  299. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_tee.py +0 -0
  300. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/dialects/test_tensor.py +0 -0
  301. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/__init__.py +0 -0
  302. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_context.py +0 -0
  303. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_graph.py +0 -0
  304. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_primitive.py +0 -0
  305. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
  306. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_printer.py +0 -0
  307. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_serde.py +0 -0
  308. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_tracer.py +0 -0
  309. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_typing.py +0 -0
  310. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
  311. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/__init__.py +0 -0
  312. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/conftest.py +0 -0
  313. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_api_errors.py +0 -0
  314. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_dialects.py +0 -0
  315. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_layouts.py +0 -0
  316. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/device/test_device_tee.py +0 -0
  317. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/__init__.py +0 -0
  318. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
  319. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
  320. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
  321. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
  322. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/__init__.py +0 -0
  323. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
  324. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
  325. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
  326. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/__init__.py +0 -0
  327. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
  328. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
  329. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
  330. /mplang_nightly-0.1.dev253/examples/v2/psi_bench.py → /mplang_nightly-0.1.dev254/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
  331. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
  332. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  333. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
  334. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/test_utils.py +0 -0
  335. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/__init__.py +0 -0
  336. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
  337. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
  338. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
  339. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
  340. /mplang_nightly-0.1.dev253/examples/v2/vole_bench.py → /mplang_nightly-0.1.dev254/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
  341. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
  342. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/test_collective.py +0 -0
  343. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/libs/test_simple_guide.py +0 -0
  344. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_interpreter_async.py +0 -0
  345. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_object_store.py +0 -0
  346. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/runtime/test_object_store_fs.py +0 -0
  347. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_fetch_semantics.py +0 -0
  348. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_pytree_io.py +0 -0
  349. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/test_store.py +0 -0
  350. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/utils/__init__.py +0 -0
  351. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tests/v2/utils/tensor_patch.py +0 -0
  352. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/MIGRATION.md +0 -0
  353. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/README.md +0 -0
  354. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/__init__.py +0 -0
  355. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/alice.csv +0 -0
  356. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/bob.csv +0 -0
  357. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/data/prepare_vertical_iris.py +0 -0
  358. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/run.sh +0 -0
  359. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/00_device_basics.py +0 -0
  360. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/01_function_decorator.py +0 -0
  361. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
  362. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/03_run_jax.py +0 -0
  363. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/04_run_sql.py +0 -0
  364. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/05_pipeline.py +0 -0
  365. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
  366. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/device/07_run_nnx.py +0 -0
  367. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/pitfalls/late_binding.py +0 -0
  368. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/pitfalls/rand.py +0 -0
  369. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/00_basic.py +0 -0
  370. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/01_condition.py +0 -0
  371. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/02_whileloop.py +0 -0
  372. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/03_stdio.py +0 -0
  373. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/04_phe.py +0 -0
  374. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/05_tee.py +0 -0
  375. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/06_fhe.py +0 -0
  376. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/07_advanced.py +0 -0
  377. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
  378. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/00_device_basics.py +0 -0
  379. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/01_function_decorator.py +0 -0
  380. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/03_run_jax.py +0 -0
  381. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
  382. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/05_run_sql.py +0 -0
  383. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/06_pipeline.py +0 -0
  384. /mplang_nightly-0.1.dev253/examples/v2/stax_nn.py → /mplang_nightly-0.1.dev254/tutorials/v2/07_stax_nn.py +0 -0
  385. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev254}/tutorials/v2/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev253
3
+ Version: 0.1.dev254
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -154,6 +154,10 @@ class SimpMemDriver(SimpDriver):
154
154
  self._workers = workers
155
155
  self._mesh = mesh
156
156
 
157
+ def shutdown(self) -> None:
158
+ """Shutdown the local memory driver and its mesh."""
159
+ self._mesh.shutdown()
160
+
157
161
  @property
158
162
  def world_size(self) -> int:
159
163
  return self._world_size
@@ -62,7 +62,7 @@ def run_worker(
62
62
  signal.signal(signal.SIGINT, signal.SIG_DFL)
63
63
  signal.signal(signal.SIGTERM, signal.SIG_DFL)
64
64
 
65
- from mplang.v2.backends.simp_http_worker import create_worker_app
65
+ from mplang.v2.backends.simp_worker.http import create_worker_app
66
66
 
67
67
  app = create_worker_app(rank, world_size, endpoints, spu_endpoints)
68
68
 
@@ -69,7 +69,7 @@ class Context(ABC):
69
69
  """
70
70
 
71
71
  def __init__(self) -> None:
72
- self._state: dict[str, Any] = {}
72
+ self._states: dict[str, Any] = {}
73
73
 
74
74
  # =========================================================================
75
75
  # State Management
@@ -82,7 +82,7 @@ class Context(ABC):
82
82
  key: State key (e.g., "dialect.simp", "device.cluster")
83
83
  value: State value
84
84
  """
85
- self._state[key] = value
85
+ self._states[key] = value
86
86
 
87
87
  def get_state(self, key: str, default: Any = None) -> Any:
88
88
  """Get attached state by key.
@@ -94,7 +94,7 @@ class Context(ABC):
94
94
  Returns:
95
95
  State value or default
96
96
  """
97
- return self._state.get(key, default)
97
+ return self._states.get(key, default)
98
98
 
99
99
  def has_state(self, key: str) -> bool:
100
100
  """Check if state exists.
@@ -105,7 +105,7 @@ class Context(ABC):
105
105
  Returns:
106
106
  True if state exists
107
107
  """
108
- return key in self._state
108
+ return key in self._states
109
109
 
110
110
  # =========================================================================
111
111
  # Abstract Methods
@@ -0,0 +1,23 @@
1
+ # Copyright 2025 Ant Group Co., Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Machine Learning algorithms for secure multi-party computation."""
16
+
17
+ from mplang.v2.libs.ml.sgb import SecureBoost, Tree, TreeEnsemble
18
+
19
+ __all__ = [
20
+ "SecureBoost",
21
+ "Tree",
22
+ "TreeEnsemble",
23
+ ]
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ # mypy: disable-error-code="no-untyped-def,no-any-return,var-annotated"
16
+
15
17
  """SecureBoost v2: Optimized implementation using mplang.v2 low-level BFV APIs.
16
18
 
17
19
  This implementation improves upon v1 by leveraging BFV SIMD slots and the
@@ -879,7 +881,7 @@ def _find_splits_pps(
879
881
  subgroup_map_fn = make_get_subgroup_map(n_level)
880
882
  subgroup_map = simp.pcall_static(
881
883
  (pp_rank,),
882
- lambda fn=subgroup_map_fn: tensor.run_jax(fn, bt_level_pp),
884
+ lambda fn=subgroup_map_fn, bt_lv=bt_level_pp: tensor.run_jax(fn, bt_lv),
883
885
  )
884
886
 
885
887
  n_pp_features = n_features_per_party[pp_idx + 1]
@@ -978,8 +980,8 @@ def _find_splits_pps(
978
980
 
979
981
  pp_hists = simp.pcall_static(
980
982
  (ap_rank,),
981
- lambda: tensor.run_jax(
982
- derive_right_and_combine, left_hists, parent_hists
983
+ lambda lh=left_hists, ph=parent_hists: tensor.run_jax(
984
+ derive_right_and_combine, lh, ph
983
985
  ),
984
986
  )
985
987
 
@@ -996,7 +998,7 @@ def _find_splits_pps(
996
998
 
997
999
  pp_gains, pp_feats, pp_threshs = simp.pcall_static(
998
1000
  (ap_rank,),
999
- lambda: tensor.run_jax(find_splits, pp_hists),
1001
+ lambda h=pp_hists: tensor.run_jax(find_splits, h),
1000
1002
  )
1001
1003
 
1002
1004
  pp_gains_list.append(pp_gains)
@@ -1292,7 +1294,7 @@ def build_tree(
1292
1294
  # Local bt for this level
1293
1295
  bt_level = simp.pcall_static(
1294
1296
  (ap_rank,),
1295
- lambda off=level_offset: tensor.run_jax(lambda b: b - off, bt),
1297
+ lambda off=level_offset, b=bt: tensor.run_jax(lambda x: x - off, b),
1296
1298
  )
1297
1299
 
1298
1300
  # === AP: Local histogram computation ===
@@ -1352,7 +1354,7 @@ def build_tree(
1352
1354
 
1353
1355
  best_gains, best_party = simp.pcall_static(
1354
1356
  (ap_rank,),
1355
- lambda: tensor.run_jax(find_global_best, *all_gains),
1357
+ lambda gains=all_gains: tensor.run_jax(find_global_best, *gains),
1356
1358
  )
1357
1359
 
1358
1360
  # === Update Tree State ===
@@ -1498,8 +1500,9 @@ def predict_tree(
1498
1500
  (rank,),
1499
1501
  lambda d=all_datas[i],
1500
1502
  f=tree.feature[i],
1501
- t=tree.threshold[i]: predict_tree_single_party(
1502
- d, f, t, tree.is_leaf, tree.owned_party_id, i, n_nodes
1503
+ t=tree.threshold[i],
1504
+ idx=i: predict_tree_single_party(
1505
+ d, f, t, tree.is_leaf, tree.owned_party_id, idx, n_nodes
1503
1506
  ),
1504
1507
  )
1505
1508
  # Transfer to AP
@@ -1564,7 +1567,7 @@ def predict_ensemble(
1564
1567
 
1565
1568
  y_pred_logits = simp.pcall_static(
1566
1569
  (ap_rank,),
1567
- lambda: tensor.run_jax(update_pred, y_pred_logits, tree_pred),
1570
+ lambda yp=y_pred_logits, tp=tree_pred: tensor.run_jax(update_pred, yp, tp),
1568
1571
  )
1569
1572
 
1570
1573
  # Convert logits to probabilities
@@ -1634,7 +1637,9 @@ def fit_tree_ensemble(
1634
1637
 
1635
1638
  gh, qg, qh = simp.pcall_static(
1636
1639
  (ap_rank,),
1637
- lambda: tensor.run_jax(compute_gh_quantized, y_data, y_pred, fxp_scale),
1640
+ lambda yp=y_pred: tensor.run_jax(
1641
+ compute_gh_quantized, y_data, yp, fxp_scale
1642
+ ),
1638
1643
  )
1639
1644
 
1640
1645
  # FHE encrypt only if we have passive parties
@@ -1678,7 +1683,7 @@ def fit_tree_ensemble(
1678
1683
 
1679
1684
  y_pred = simp.pcall_static(
1680
1685
  (ap_rank,),
1681
- lambda: tensor.run_jax(update_pred_fn, y_pred, tree_pred),
1686
+ lambda yp=y_pred, tp=tree_pred: tensor.run_jax(update_pred_fn, yp, tp),
1682
1687
  )
1683
1688
 
1684
1689
  return TreeEnsemble(
@@ -1866,275 +1871,3 @@ class SecureBoost:
1866
1871
  lambda: tensor.run_jax(compute_metrics, y_prob, y_data),
1867
1872
  )
1868
1873
  return accuracy
1869
-
1870
- # ==============================================================================
1871
- # Main
1872
- # ==============================================================================
1873
-
1874
- print("=" * 60)
1875
-
1876
-
1877
- def run_sgb_demo(sim):
1878
- """Test SecureBoost with 2 parties, enabling BFV FHE.
1879
-
1880
- AP (party 0) holds labels + some features.
1881
- PP (party 1) holds remaining features.
1882
-
1883
- Flow:
1884
- 1. PP encrypts its histogram buckets with BFV
1885
- 2. AP receives encrypted histogram, multiplies with gradient mask
1886
- 3. PP decrypts and aggregates
1887
- """
1888
- import mplang.v2 as mp
1889
-
1890
- print("=" * 60)
1891
- print("Multi-Party SecureBoost Test (with BFV FHE)")
1892
- print("=" * 60)
1893
-
1894
- # Load BFV backend (registers implementations)
1895
- from mplang.v2.backends import load_backend
1896
-
1897
- try:
1898
- load_backend("mplang.v2.backends.bfv_impl")
1899
- print("✓ BFV backend loaded successfully")
1900
- except ImportError as e:
1901
- print(f"✗ Failed to load BFV backend: {e}")
1902
- print(" Make sure 'tenseal' is installed: pip install tenseal")
1903
- return
1904
-
1905
- # Generate synthetic data for 2 parties
1906
- np.random.seed(42)
1907
- n_samples = 100
1908
- n_features_ap = 3 # AP's features
1909
- n_features_pp = 2 # PP's features
1910
-
1911
- # Generate linearly separable data
1912
- X_all = np.random.randn(n_samples, n_features_ap + n_features_pp).astype(np.float32)
1913
- y = (X_all[:, 0] + X_all[:, 1] + X_all[:, 3] > 0).astype(np.float32)
1914
-
1915
- # Split features by party
1916
- X_ap = X_all[:, :n_features_ap] # Party 0's features
1917
- X_pp = X_all[:, n_features_ap:] # Party 1's features
1918
-
1919
- print("\nData Distribution:")
1920
- print(f" Party 0 (AP): {X_ap.shape} features + labels")
1921
- print(f" Party 1 (PP): {X_pp.shape} features (encrypted)")
1922
-
1923
- # Model parameters
1924
- n_estimators = 2 # Small for test
1925
- max_depth = 2
1926
-
1927
- def job():
1928
- # Put data on respective parties
1929
- data_ap = mp.put("P0", X_ap)
1930
- data_pp = mp.put("P1", X_pp)
1931
- y_data = mp.put("P0", y)
1932
-
1933
- # Create model with passive party
1934
- model = SecureBoost(
1935
- n_estimators=n_estimators,
1936
- max_depth=max_depth,
1937
- learning_rate=0.1,
1938
- max_bin=8,
1939
- ap_rank=0,
1940
- pp_ranks=[1], # Party 1 is passive party (uses FHE)
1941
- )
1942
-
1943
- print("\nTraining with BFV FHE...")
1944
- model.fit(
1945
- [data_ap, data_pp], # Both parties' data
1946
- y_data,
1947
- n_samples=n_samples,
1948
- n_features_per_party=[n_features_ap, n_features_pp],
1949
- )
1950
- print("Training complete!")
1951
-
1952
- # Predict
1953
- print("\nPredicting...")
1954
- y_prob = model.predict([data_ap, data_pp], n_samples=n_samples)
1955
- print(f"Predictions type: {y_prob.type}")
1956
- return y_prob
1957
-
1958
- # Execute with 2 parties
1959
- print("\nExecuting graph with 2 parties...")
1960
- y_prob_obj = mp.evaluate(job, context=sim)
1961
-
1962
- # Calculate accuracy
1963
- y_pred_probs = mp.fetch(y_prob_obj, context=sim)
1964
- if isinstance(y_pred_probs, list):
1965
- y_pred_probs = y_pred_probs[0]
1966
- y_pred_class = (y_pred_probs > 0.5).astype(np.float32)
1967
- accuracy = np.mean(y_pred_class == y)
1968
- print(f"\nPredictions (first 10): {y_pred_probs[:10]}")
1969
- print(f"True labels (first 10): {y[:10]}")
1970
- print(f"Training Accuracy: {accuracy:.4f}")
1971
-
1972
- print("\n" + "=" * 60)
1973
- print("Multi-party test completed!")
1974
- print("=" * 60)
1975
-
1976
-
1977
- def run_sgb_bench(sim):
1978
- """Benchmark SecureBoost with BFV FHE for performance analysis."""
1979
- import time
1980
-
1981
- print("=" * 70)
1982
- print("SecureBoost v2 - Multi-Party FHE Performance Benchmark")
1983
- print("=" * 70)
1984
- # Benchmark configurations
1985
- configs = [
1986
- # Test m > 4096 case (multi-CT support)
1987
- {
1988
- "n_samples": 1000,
1989
- "n_features_ap": 50,
1990
- "n_features_pp": 50,
1991
- "n_trees": 2,
1992
- "max_depth": 3,
1993
- },
1994
- ]
1995
-
1996
- results = []
1997
-
1998
- for cfg in configs:
1999
- n_samples = cfg["n_samples"]
2000
- n_features_ap = cfg["n_features_ap"]
2001
- n_features_pp = cfg["n_features_pp"]
2002
- n_trees = cfg["n_trees"]
2003
- max_depth = cfg["max_depth"]
2004
-
2005
- print(f"\n{'─' * 70}")
2006
- print(
2007
- f"Config: samples={n_samples}, features=({n_features_ap}+{n_features_pp}), "
2008
- f"trees={n_trees}, depth={max_depth}"
2009
- )
2010
- print(f"{'─' * 70}")
2011
-
2012
- # Generate data
2013
- np.random.seed(42)
2014
- X_all = np.random.randn(n_samples, n_features_ap + n_features_pp).astype(
2015
- np.float32
2016
- )
2017
- y = (X_all[:, 0] + X_all[:, 1] > 0).astype(np.float32)
2018
- X_ap = X_all[:, :n_features_ap]
2019
- X_pp = X_all[:, n_features_ap:]
2020
-
2021
- def job():
2022
- data_ap = mp.put("P0", X_ap)
2023
- data_pp = mp.put("P1", X_pp)
2024
- y_data = mp.put("P0", y)
2025
-
2026
- model = SecureBoost(
2027
- n_estimators=n_trees,
2028
- max_depth=max_depth,
2029
- learning_rate=0.1,
2030
- max_bin=8,
2031
- ap_rank=0,
2032
- pp_ranks=[1],
2033
- )
2034
-
2035
- model.fit(
2036
- [data_ap, data_pp],
2037
- y_data,
2038
- n_samples=n_samples,
2039
- n_features_per_party=[n_features_ap, n_features_pp],
2040
- )
2041
-
2042
- y_prob = model.predict([data_ap, data_pp], n_samples=n_samples)
2043
- return y_prob
2044
-
2045
- # Measure tracing time
2046
- t0 = time.perf_counter()
2047
- traced = mp.compile(job, context=sim)
2048
- trace_time = time.perf_counter() - t0
2049
-
2050
- graph = traced.graph
2051
- n_ops = len(graph.operations)
2052
-
2053
- print(f" Tracing: {trace_time:.3f}s ({n_ops} ops)")
2054
-
2055
- # Measure execution time
2056
- t0 = time.perf_counter()
2057
-
2058
- y_prob_obj = mp.evaluate(traced, context=sim)
2059
- exec_time = time.perf_counter() - t0
2060
-
2061
- # Calculate accuracy
2062
- y_pred_probs = mp.fetch(y_prob_obj, context=sim)
2063
- if isinstance(y_pred_probs, list):
2064
- y_pred_probs = y_pred_probs[0]
2065
- y_pred_class = (y_pred_probs > 0.5).astype(np.float32)
2066
- accuracy = np.mean(y_pred_class == y)
2067
-
2068
- print(f" Execution: {exec_time:.3f}s")
2069
- print(f" Total: {trace_time + exec_time:.3f}s")
2070
- print(f" Accuracy: {accuracy:.2%}")
2071
-
2072
- results.append({
2073
- "config": cfg,
2074
- "trace_time": trace_time,
2075
- "exec_time": exec_time,
2076
- "n_ops": n_ops,
2077
- "accuracy": accuracy,
2078
- })
2079
-
2080
- # Summary
2081
- print("\n" + "=" * 70)
2082
- print("BENCHMARK SUMMARY")
2083
- print("=" * 70)
2084
- print(f"{'Config':<40} {'Trace':<10} {'Exec':<10} {'Ops':<8} {'Acc':<8}")
2085
- print("-" * 70)
2086
- for r in results:
2087
- cfg = r["config"]
2088
- cfg_str = f"n={cfg['n_samples']}, f={cfg['n_features_ap']}+{cfg['n_features_pp']}, t={cfg['n_trees']}, d={cfg['max_depth']}"
2089
- print(
2090
- f"{cfg_str:<40} {r['trace_time']:.3f}s {r['exec_time']:.3f}s {r['n_ops']:<8} {r['accuracy']:.2%}"
2091
- )
2092
-
2093
- # Analyze operation distribution for last config
2094
- print("\n" + "=" * 70)
2095
- print("OPERATION DISTRIBUTION (last config)")
2096
- print("=" * 70)
2097
- from collections import Counter
2098
-
2099
- op_counts = Counter(op.opcode for op in graph.operations)
2100
- for op_name, count in sorted(op_counts.items(), key=lambda x: -x[1])[:15]:
2101
- pct = count / n_ops * 100
2102
- bar = "█" * int(pct / 2)
2103
- print(f" {op_name:<30} {count:>5} ({pct:>5.1f}%) {bar}")
2104
-
2105
- # BFV-specific operations
2106
- bfv_ops = {k: v for k, v in op_counts.items() if k.startswith("bfv.")}
2107
- if bfv_ops:
2108
- bfv_total = sum(bfv_ops.values())
2109
- print(f"\n BFV operations total: {bfv_total} ({bfv_total / n_ops * 100:.1f}%)")
2110
- for op_name, count in sorted(bfv_ops.items(), key=lambda x: -x[1]):
2111
- print(f" {op_name:<28} {count:>5}")
2112
-
2113
- # Print profiling results
2114
- if hasattr(sim, "backend") and getattr(sim.backend, "profiler", None) is not None:
2115
- sim.backend.profiler.stop(filename_prefix="sgb_trace")
2116
-
2117
- profiler = mp.get_profiler()
2118
- profiler.print_summary() # All ops (includes container overhead)
2119
-
2120
-
2121
- __mp_main__ = run_sgb_demo
2122
-
2123
-
2124
- if __name__ == "__main__":
2125
- import argparse
2126
-
2127
- import mplang.v2 as mp
2128
-
2129
- parser = argparse.ArgumentParser(description="SecureBoost v2 Example")
2130
- parser.add_argument("--benchmark", action="store_true", help="Run benchmark")
2131
- parser.add_argument("--profile", action="store_true", help="Enable profiling")
2132
- args = parser.parse_args()
2133
-
2134
- # Use high-level Simulator API with profiling if requested
2135
- sim = mp.make_simulator(2, enable_profiling=args.profile)
2136
-
2137
- if args.benchmark:
2138
- run_sgb_bench(sim)
2139
- else:
2140
- run_sgb_demo(sim)
@@ -300,12 +300,13 @@ def generate_sparse_noise(n: int, weight: int) -> el.Object:
300
300
 
301
301
  # Generate unique indices using rejection-free Fisher-Yates-like approach
302
302
  # Map random u64 to positions while ensuring uniqueness
303
- positions = jnp.zeros(weight, dtype=jnp.int32)
303
+ # Use int64 to avoid dtype mismatch warning in scatter operations
304
+ positions = jnp.zeros(weight, dtype=jnp.int64)
304
305
 
305
306
  # Build positions array (unrolled for JAX compatibility)
306
307
  for i in range(weight):
307
308
  # Map random value to remaining range [0, n-i)
308
- pos = jnp.int32(idx_entropy[i] % (n - i))
309
+ pos = jnp.int64(idx_entropy[i] % (n - i))
309
310
 
310
311
  # Shift position to avoid already-used indices
311
312
  # Count how many existing positions are <= current pos
@@ -360,6 +360,32 @@ class Interpreter(AbstractInterpreter):
360
360
  self.trace_pid = trace_pid
361
361
  self.store: ObjectStore | None = store
362
362
 
363
+ def shutdown(self) -> None:
364
+ """Shutdown the interpreter and release resources.
365
+
366
+ This method is idempotent and safe to call multiple times.
367
+ It performs the following cleanup:
368
+ 1. Shuts down the internal executor (if any).
369
+ 2. Stops the execution tracer (if any).
370
+ 3. Shuts down any attached dialect states (e.g., stopping drivers).
371
+ """
372
+ # 1. Shutdown Executor
373
+ if self.executor:
374
+ self.executor.shutdown(wait=True)
375
+ self.executor = None
376
+
377
+ # 2. Stop Tracer
378
+ if self.tracer:
379
+ self.tracer.stop()
380
+ # Don't clear self.tracer, as we might want to read stats later
381
+
382
+ # 3. Shutdown Dialect States
383
+ # Iterate over all attached states (e.g., drivers, cluster managers)
384
+ # and shut them down if they support it.
385
+ for state in self._states.values():
386
+ if hasattr(state, "shutdown") and callable(state.shutdown):
387
+ state.shutdown()
388
+
363
389
  # =========================================================================
364
390
  # Dialect State Management
365
391
  # =========================================================================
@@ -49,6 +49,7 @@ mplang-cli = "mplang.runtime.cli:main"
49
49
  [dependency-groups]
50
50
  dev = [
51
51
  "pytest",
52
+ "pytest-benchmark",
52
53
  "pytest-cov",
53
54
  "pytest-asyncio",
54
55
  "ruff",
@@ -174,12 +175,15 @@ testpaths = ["tests"]
174
175
  python_files = ["test_*.py"]
175
176
  python_classes = ["Test*"]
176
177
  python_functions = ["test_*"]
177
- addopts = "--strict-markers --strict-config"
178
- markers = ["integration: cross-module or multi-party integration tests"]
178
+ # Skip benchmark files by default (to run: pytest --ignore-glob='' or pytest tests/*_bench.py)
179
+ addopts = "--strict-markers --strict-config --ignore-glob=*_bench.py"
180
+ markers = [
181
+ "integration: cross-module or multi-party integration tests",
182
+ "benchmark: performance benchmark tests (deselected by default)",
183
+ ]
179
184
  filterwarnings = [
180
- # Suppress insecure mock TEE warnings in tests
181
- "ignore:Insecure mock TEE kernel 'mock_tee.quote_gen' in use.*:UserWarning",
182
- "ignore:Insecure mock TEE kernel 'mock_tee.attest' in use.*:UserWarning",
185
+ # Suppress insecure mock TEE warnings in tests (expected for local testing)
186
+ "ignore:Insecure mock TEE operation.*:UserWarning",
183
187
  ]
184
188
 
185
189
  # Taskipy configuration for task management (mirrors .github/workflows checks)
@@ -0,0 +1,54 @@
1
+ # Copyright 2025 Ant Group Co., Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import warnings
16
+
17
+ import jax
18
+ import pytest
19
+
20
+ # Disable JAX persistent compilation cache to avoid warnings in tests
21
+ # (cache fails when jax_compilation_cache_dir is not configured)
22
+ jax.config.update("jax_enable_compilation_cache", False)
23
+
24
+ # Suppress known TEE mock warnings in tests (expected for local testing)
25
+ warnings.filterwarnings("ignore", message=".*Insecure mock TEE.*")
26
+
27
+ import mplang.v2.edsl.context # noqa: E402
28
+ from mplang.v2.dialects import simp # noqa: E402
29
+ from tests.v2.utils.tensor_patch import patch_object_operators # noqa: E402
30
+
31
+ # Apply tensor operator overloading patch for tests
32
+ patch_object_operators()
33
+
34
+
35
+ @pytest.fixture
36
+ def simp_simulator_default():
37
+ """Provide a SIMP simulator context for tests that need it.
38
+
39
+ Usage: Add @pytest.mark.usefixtures("simp_simulator_default") to test classes
40
+ or use simp_simulator_default fixture parameter in test functions.
41
+ """
42
+ sim = simp.make_simulator(world_size=3)
43
+ with sim:
44
+ yield sim
45
+
46
+
47
+ @pytest.fixture(autouse=True)
48
+ def reset_context_stack():
49
+ """Reset the context stack before and after each test."""
50
+ # Clear context stack for test isolation
51
+ mplang.v2.edsl.context._context_stack.clear()
52
+ yield
53
+ # Clear again after test
54
+ mplang.v2.edsl.context._context_stack.clear()
@@ -0,0 +1,15 @@
1
+ # Copyright 2025 Ant Group Co., Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Tests for machine learning algorithms."""