mplang-nightly 0.1.dev253__tar.gz → 0.1.dev255__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 (386) hide show
  1. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/PKG-INFO +1 -1
  2. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/mem.py +4 -0
  3. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/spu_impl.py +10 -79
  4. mplang_nightly-0.1.dev255/mplang/v2/backends/spu_state.py +124 -0
  5. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/cli.py +1 -1
  6. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/context.py +4 -4
  7. mplang_nightly-0.1.dev255/mplang/v2/libs/ml/__init__.py +23 -0
  8. {mplang_nightly-0.1.dev253/examples/v2 → mplang_nightly-0.1.dev255/mplang/v2/libs/ml}/sgb.py +16 -283
  9. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/ldpc.py +3 -2
  10. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/interpreter.py +26 -0
  11. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/pyproject.toml +9 -5
  12. mplang_nightly-0.1.dev255/tests/v2/conftest.py +54 -0
  13. mplang_nightly-0.1.dev255/tests/v2/libs/ml/__init__.py +15 -0
  14. mplang_nightly-0.1.dev255/tests/v2/libs/ml/test_sgb.py +164 -0
  15. mplang_nightly-0.1.dev253/examples/v2/sgb_bench.py → mplang_nightly-0.1.dev255/tests/v2/libs/ml/test_sgb_bench.py +1 -2
  16. mplang_nightly-0.1.dev255/tutorials/v2/02_simulation_and_driver.py +124 -0
  17. mplang_nightly-0.1.dev253/examples/v2/bfv_sort_agg.py +0 -213
  18. mplang_nightly-0.1.dev253/examples/v2/pcall_jax.py +0 -89
  19. mplang_nightly-0.1.dev253/examples/v2/phe_sort_agg.py +0 -190
  20. mplang_nightly-0.1.dev253/examples/v2/secure_shuffle_agg.py +0 -131
  21. mplang_nightly-0.1.dev253/tests/v2/conftest.py +0 -46
  22. mplang_nightly-0.1.dev253/tutorials/v2/02_simulation_and_driver.py +0 -181
  23. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/.gitignore +0 -0
  24. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/LICENSE +0 -0
  25. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/README.md +0 -0
  26. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/conf/3pc.yaml +0 -0
  27. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/README.md +0 -0
  28. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/models.py +0 -0
  29. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/stax_nn/stax_nn.py +0 -0
  30. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
  31. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/hist_jax.py +0 -0
  32. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/hist_jax_test.py +0 -0
  33. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/naive_np.py +0 -0
  34. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/readme.md +0 -0
  35. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/sgb.py +0 -0
  36. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/examples/v1/xgboost/sgb_test.py +0 -0
  37. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/hatch_build.py +0 -0
  38. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/__init__.py +0 -0
  39. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/__init__.py +0 -0
  40. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/_device.py +0 -0
  41. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/analysis/__init__.py +0 -0
  42. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/analysis/diagram.py +0 -0
  43. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/__init__.py +0 -0
  44. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/cluster.py +0 -0
  45. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/comm.py +0 -0
  46. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/context_mgr.py +0 -0
  47. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/dtypes.py +0 -0
  48. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/__init__.py +0 -0
  49. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/ast.py +0 -0
  50. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/evaluator.py +0 -0
  51. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/printer.py +0 -0
  52. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/transformer.py +0 -0
  53. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/utils.py +0 -0
  54. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/visitor.py +0 -0
  55. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/expr/walk.py +0 -0
  56. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/interp.py +0 -0
  57. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mask.py +0 -0
  58. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mpir.py +0 -0
  59. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mpobject.py +0 -0
  60. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/mptype.py +0 -0
  61. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/pfunc.py +0 -0
  62. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/primitive.py +0 -0
  63. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/table.py +0 -0
  64. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/tensor.py +0 -0
  65. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/core/tracer.py +0 -0
  66. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/host.py +0 -0
  67. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/__init__.py +0 -0
  68. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/base.py +0 -0
  69. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/basic.py +0 -0
  70. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/context.py +0 -0
  71. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/crypto.py +0 -0
  72. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/fhe.py +0 -0
  73. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/mock_tee.py +0 -0
  74. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/phe.py +0 -0
  75. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/spu.py +0 -0
  76. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/sql_duckdb.py +0 -0
  77. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/stablehlo.py +0 -0
  78. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/kernels/value.py +0 -0
  79. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/__init__.py +0 -0
  80. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/base.py +0 -0
  81. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/basic.py +0 -0
  82. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/crypto.py +0 -0
  83. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/fhe.py +0 -0
  84. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/jax_cc.py +0 -0
  85. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/nnx_cc.py +0 -0
  86. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/phe.py +0 -0
  87. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/spu.py +0 -0
  88. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/sql_cc.py +0 -0
  89. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/ops/tee.py +0 -0
  90. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
  91. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
  92. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
  93. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
  94. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/cli.py +0 -0
  96. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/client.py +0 -0
  97. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/communicator.py +0 -0
  98. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/data_providers.py +0 -0
  99. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/driver.py +0 -0
  100. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/exceptions.py +0 -0
  101. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/http_api.md +0 -0
  102. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/link_comm.py +0 -0
  103. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/server.py +0 -0
  104. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/session.py +0 -0
  105. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/runtime/simulation.py +0 -0
  106. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/__init__.py +0 -0
  107. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/api.py +0 -0
  108. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/mpi.py +0 -0
  109. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/party.py +0 -0
  110. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/random.py +0 -0
  111. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/simp/smpc.py +0 -0
  112. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/__init__.py +0 -0
  113. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/crypto.py +0 -0
  114. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/func_utils.py +0 -0
  115. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/spu_utils.py +0 -0
  116. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v1/utils/table_utils.py +0 -0
  117. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/__init__.py +0 -0
  118. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/__init__.py +0 -0
  119. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/bfv_impl.py +0 -0
  120. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/crypto_impl.py +0 -0
  121. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/field_impl.py +0 -0
  122. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/func_impl.py +0 -0
  123. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/phe_impl.py +0 -0
  124. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_design.md +0 -0
  125. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/__init__.py +0 -0
  126. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/http.py +0 -0
  127. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/ops.py +0 -0
  128. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/state.py +0 -0
  129. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_driver/values.py +0 -0
  130. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/__init__.py +0 -0
  131. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/http.py +0 -0
  132. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/mem.py +0 -0
  133. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/ops.py +0 -0
  134. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/simp_worker/state.py +0 -0
  135. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/store_impl.py +0 -0
  136. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/table_impl.py +0 -0
  137. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/tee_impl.py +0 -0
  138. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/backends/tensor_impl.py +0 -0
  139. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/cli_guide.md +0 -0
  140. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/__init__.py +0 -0
  141. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/bfv.py +0 -0
  142. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/crypto.py +0 -0
  143. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/dtypes.py +0 -0
  144. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/field.py +0 -0
  145. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/func.py +0 -0
  146. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/phe.py +0 -0
  147. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/simp.py +0 -0
  148. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/spu.py +0 -0
  149. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/store.py +0 -0
  150. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/table.py +0 -0
  151. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/tee.py +0 -0
  152. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/dialects/tensor.py +0 -0
  153. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/README.md +0 -0
  154. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/__init__.py +0 -0
  155. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/graph.py +0 -0
  156. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/jit.py +0 -0
  157. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/object.py +0 -0
  158. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/primitive.py +0 -0
  159. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/printer.py +0 -0
  160. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/registry.py +0 -0
  161. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/serde.py +0 -0
  162. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/tracer.py +0 -0
  163. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/edsl/typing.py +0 -0
  164. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/Makefile +0 -0
  165. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/__init__.py +0 -0
  166. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/gf128.cpp +0 -0
  167. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/ldpc.cpp +0 -0
  168. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/okvs.cpp +0 -0
  169. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/okvs_opt.cpp +0 -0
  170. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/kernels/py_kernels.py +0 -0
  171. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/collective.py +0 -0
  172. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/__init__.py +0 -0
  173. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/api.py +0 -0
  174. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/device/cluster.py +0 -0
  175. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/__init__.py +0 -0
  176. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/_utils.py +0 -0
  177. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
  178. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
  179. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
  180. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
  181. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
  182. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/common/constants.py +0 -0
  183. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
  184. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/base.py +0 -0
  185. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/extension.py +0 -0
  186. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/ot/silent.py +0 -0
  187. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
  188. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
  189. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
  190. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
  191. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
  192. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
  193. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
  194. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
  195. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
  196. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/libs/mpc/vole/silver.py +0 -0
  197. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/__init__.py +0 -0
  198. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/dialect_state.py +0 -0
  199. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/object_store.py +0 -0
  200. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/mplang/v2/runtime/value.py +0 -0
  201. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/__init__.py +0 -0
  202. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/conftest.py +0 -0
  203. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/__init__.py +0 -0
  204. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/analysis/test_diagram.py +0 -0
  205. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/conftest.py +0 -0
  206. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/__init__.py +0 -0
  207. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/__init__.py +0 -0
  208. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/conftest.py +0 -0
  209. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_ast.py +0 -0
  210. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_printer.py +0 -0
  211. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_utils.py +0 -0
  212. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/expr/test_walk.py +0 -0
  213. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_cluster.py +0 -0
  214. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_dtype.py +0 -0
  215. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mask.py +0 -0
  216. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mpir.py +0 -0
  217. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_mptype.py +0 -0
  218. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_primitive.py +0 -0
  219. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_table.py +0 -0
  220. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_tensor.py +0 -0
  221. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/core/test_tracer.py +0 -0
  222. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/device/__init__.py +0 -0
  223. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/device/test_device_basic.py +0 -0
  224. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/README.md +0 -0
  225. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
  226. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_http_e2e.py +0 -0
  227. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
  228. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_tee_workflow.py +0 -0
  229. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_tutorials.py +0 -0
  230. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/integration/test_unused_param_integration.py +0 -0
  231. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/__init__.py +0 -0
  232. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_basic.py +0 -0
  233. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_debug_print.py +0 -0
  234. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_fhe.py +0 -0
  235. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_kernel_binding.py +0 -0
  236. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_phe.py +0 -0
  237. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_spu.py +0 -0
  238. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_sql_duckdb.py +0 -0
  239. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_stablehlo.py +0 -0
  240. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_value.py +0 -0
  241. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/kernels/test_value_serde.py +0 -0
  242. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/__init__.py +0 -0
  243. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/dummy.py +0 -0
  244. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_basic_pack.py +0 -0
  245. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_crypto.py +0 -0
  246. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_feop_base.py +0 -0
  247. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_jax_cc.py +0 -0
  248. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_nnx_cc.py +0 -0
  249. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_phe.py +0 -0
  250. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_spu.py +0 -0
  251. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_spu_defensive.py +0 -0
  252. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_sql.py +0 -0
  253. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_sql_cc.py +0 -0
  254. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
  255. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/__init__.py +0 -0
  256. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_cli.py +0 -0
  257. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_communicator.py +0 -0
  258. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_driver.py +0 -0
  259. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_server.py +0 -0
  260. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/runtime/test_simulation.py +0 -0
  261. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_mpi.py +0 -0
  262. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_random.py +0 -0
  263. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_smpc.py +0 -0
  264. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/simp/test_sugar.py +0 -0
  265. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/__init__.py +0 -0
  266. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/server_fixtures.py +0 -0
  267. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_func_utils.py +0 -0
  268. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_spu_utils.py +0 -0
  269. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v1/utils/test_table_utils.py +0 -0
  270. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/__init__.py +0 -0
  271. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/__init__.py +0 -0
  272. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_driver/__init__.py +0 -0
  273. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_driver/test_http.py +0 -0
  274. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/__init__.py +0 -0
  275. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/test_http.py +0 -0
  276. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/simp_worker/test_mem.py +0 -0
  277. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_bfv_impl.py +0 -0
  278. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_crypto_impl.py +0 -0
  279. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_okvs_binding.py +0 -0
  280. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_simp_integration.py +0 -0
  281. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_simp_object_store.py +0 -0
  282. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_spu_impl.py +0 -0
  283. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_table_impl.py +0 -0
  284. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_tee_impl.py +0 -0
  285. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_tensor_impl.py +0 -0
  286. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/backends/test_verify_clean.py +0 -0
  287. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/__init__.py +0 -0
  288. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_bfv.py +0 -0
  289. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_crypto.py +0 -0
  290. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_dtypes.py +0 -0
  291. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_field.py +0 -0
  292. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_func.py +0 -0
  293. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_okvs.py +0 -0
  294. /mplang_nightly-0.1.dev253/examples/v2/okvs_microbench.py → /mplang_nightly-0.1.dev255/tests/v2/dialects/test_okvs_bench.py +0 -0
  295. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_phe.py +0 -0
  296. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_simp.py +0 -0
  297. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_simp_comm.py +0 -0
  298. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_spu.py +0 -0
  299. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_table.py +0 -0
  300. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_tee.py +0 -0
  301. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/dialects/test_tensor.py +0 -0
  302. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/__init__.py +0 -0
  303. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_context.py +0 -0
  304. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_graph.py +0 -0
  305. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_primitive.py +0 -0
  306. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
  307. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_printer.py +0 -0
  308. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_serde.py +0 -0
  309. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_tracer.py +0 -0
  310. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_typing.py +0 -0
  311. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
  312. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/__init__.py +0 -0
  313. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/conftest.py +0 -0
  314. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_api_errors.py +0 -0
  315. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_dialects.py +0 -0
  316. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_layouts.py +0 -0
  317. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/device/test_device_tee.py +0 -0
  318. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/__init__.py +0 -0
  319. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
  320. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
  321. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
  322. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
  323. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/__init__.py +0 -0
  324. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
  325. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
  326. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
  327. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/__init__.py +0 -0
  328. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
  329. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
  330. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
  331. /mplang_nightly-0.1.dev253/examples/v2/psi_bench.py → /mplang_nightly-0.1.dev255/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
  332. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
  333. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  334. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
  335. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/test_utils.py +0 -0
  336. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/__init__.py +0 -0
  337. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
  338. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
  339. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
  340. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
  341. /mplang_nightly-0.1.dev253/examples/v2/vole_bench.py → /mplang_nightly-0.1.dev255/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
  342. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
  343. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/test_collective.py +0 -0
  344. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/libs/test_simple_guide.py +0 -0
  345. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_interpreter_async.py +0 -0
  346. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_object_store.py +0 -0
  347. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/runtime/test_object_store_fs.py +0 -0
  348. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_fetch_semantics.py +0 -0
  349. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_pytree_io.py +0 -0
  350. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/test_store.py +0 -0
  351. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/utils/__init__.py +0 -0
  352. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tests/v2/utils/tensor_patch.py +0 -0
  353. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/MIGRATION.md +0 -0
  354. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/README.md +0 -0
  355. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/__init__.py +0 -0
  356. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/alice.csv +0 -0
  357. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/bob.csv +0 -0
  358. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/data/prepare_vertical_iris.py +0 -0
  359. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/run.sh +0 -0
  360. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/00_device_basics.py +0 -0
  361. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/01_function_decorator.py +0 -0
  362. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
  363. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/03_run_jax.py +0 -0
  364. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/04_run_sql.py +0 -0
  365. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/05_pipeline.py +0 -0
  366. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
  367. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/device/07_run_nnx.py +0 -0
  368. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/pitfalls/late_binding.py +0 -0
  369. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/pitfalls/rand.py +0 -0
  370. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/00_basic.py +0 -0
  371. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/01_condition.py +0 -0
  372. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/02_whileloop.py +0 -0
  373. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/03_stdio.py +0 -0
  374. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/04_phe.py +0 -0
  375. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/05_tee.py +0 -0
  376. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/06_fhe.py +0 -0
  377. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/07_advanced.py +0 -0
  378. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
  379. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/00_device_basics.py +0 -0
  380. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/01_function_decorator.py +0 -0
  381. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/03_run_jax.py +0 -0
  382. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
  383. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/05_run_sql.py +0 -0
  384. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/tutorials/v2/06_pipeline.py +0 -0
  385. /mplang_nightly-0.1.dev253/examples/v2/stax_nn.py → /mplang_nightly-0.1.dev255/tutorials/v2/07_stax_nn.py +0 -0
  386. {mplang_nightly-0.1.dev253 → mplang_nightly-0.1.dev255}/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.dev255
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
@@ -27,6 +27,7 @@ import spu.api as spu_api
27
27
  import spu.libspu as libspu
28
28
 
29
29
  from mplang.v2.backends.simp_worker import SimpWorker
30
+ from mplang.v2.backends.spu_state import SPUState
30
31
  from mplang.v2.backends.tensor_impl import TensorValue
31
32
  from mplang.v2.dialects import spu
32
33
  from mplang.v2.edsl import serde
@@ -107,84 +108,6 @@ def to_runtime_config(config: spu.SPUConfig) -> libspu.RuntimeConfig:
107
108
  return runtime_config
108
109
 
109
110
 
110
- # Global cache for SPU runtimes per (local_rank, world_size) pair
111
- # Key: (local_rank, spu_world_size, protocol, field, link_mode), Value: (Runtime, Io)
112
- _SPU_RUNTIMES: dict[
113
- tuple[int, int, str, str, str], tuple[spu_api.Runtime, spu_api.Io]
114
- ] = {}
115
-
116
-
117
- def _create_mem_link(local_rank: int, spu_world_size: int) -> libspu.link.Context:
118
- """Create in-memory link for simulation."""
119
- desc = libspu.link.Desc() # type: ignore
120
- desc.recv_timeout_ms = 30 * 1000
121
- for i in range(spu_world_size):
122
- desc.add_party(f"P{i}", f"mem:{i}")
123
- return libspu.link.create_mem(desc, local_rank)
124
-
125
-
126
- def _create_brpc_link(local_rank: int, spu_endpoints: list[str]) -> libspu.link.Context:
127
- """Create BRPC link for distributed execution.
128
-
129
- Args:
130
- local_rank: The local rank within the SPU device (0-indexed).
131
- spu_endpoints: List of BRPC endpoints for all SPU parties.
132
-
133
- Returns:
134
- A libspu.link.Context for BRPC communication.
135
- """
136
- desc = libspu.link.Desc() # type: ignore
137
- desc.recv_timeout_ms = 100 * 1000 # 100 seconds
138
- desc.http_max_payload_size = 32 * 1024 * 1024 # 32MB
139
-
140
- for i, endpoint in enumerate(spu_endpoints):
141
- desc.add_party(f"P{i}", endpoint)
142
-
143
- return libspu.link.create_brpc(desc, local_rank)
144
-
145
-
146
- def _get_spu_ctx(
147
- local_rank: int,
148
- spu_world_size: int,
149
- config: spu.SPUConfig,
150
- spu_endpoints: list[str] | None = None,
151
- ) -> tuple[spu_api.Runtime, spu_api.Io]:
152
- """Get or create SPU runtime and IO for the given local rank within SPU.
153
-
154
- Args:
155
- local_rank: The local rank within the SPU device (0-indexed).
156
- spu_world_size: The number of parties in the SPU device.
157
- config: SPU configuration including protocol settings.
158
- spu_endpoints: Optional list of BRPC endpoints. If None, use mem link.
159
-
160
- Returns:
161
- A tuple of (Runtime, Io) for this party.
162
- """
163
- # Determine link mode
164
- link_mode = "brpc" if spu_endpoints else "mem"
165
-
166
- # Include protocol, field, and link_mode in cache key
167
- cache_key = (local_rank, spu_world_size, config.protocol, config.field, link_mode)
168
- if cache_key in _SPU_RUNTIMES:
169
- return _SPU_RUNTIMES[cache_key]
170
-
171
- # Create Link
172
- if spu_endpoints:
173
- link = _create_brpc_link(local_rank, spu_endpoints)
174
- else:
175
- link = _create_mem_link(local_rank, spu_world_size)
176
-
177
- # Use config from SPUConfig
178
- runtime_config = to_runtime_config(config)
179
-
180
- # Create Runtime and Io
181
- runtime = spu_api.Runtime(link, runtime_config)
182
- io = spu_api.Io(spu_world_size, runtime_config)
183
-
184
- _SPU_RUNTIMES[cache_key] = (runtime, io)
185
- return runtime, io
186
-
187
-
188
111
  @spu.makeshares_p.def_impl
189
112
  def makeshares_impl(
190
113
  interpreter: Interpreter, op: Operation, data: TensorValue
@@ -293,7 +216,15 @@ def exec_impl(interpreter: Interpreter, op: Operation, *args: Any) -> Any:
293
216
  )
294
217
  spu_endpoints.append(spu_endpoints_map[party_rank])
295
218
 
296
- runtime, io = _get_spu_ctx(local_rank, spu_world_size, config, spu_endpoints)
219
+ # Get or create SPUState for caching Runtime/Io
220
+ spu_state = interpreter.get_dialect_state(SPUState.dialect_name)
221
+ if not isinstance(spu_state, SPUState):
222
+ spu_state = SPUState()
223
+ interpreter.set_dialect_state(SPUState.dialect_name, spu_state)
224
+
225
+ runtime, io = spu_state.get_or_create(
226
+ local_rank, spu_world_size, config, spu_endpoints
227
+ )
297
228
 
298
229
  executable_code = op.attrs["executable"]
299
230
  input_names = op.attrs["input_names"]
@@ -0,0 +1,124 @@
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
+ """SPU Dialect State.
16
+
17
+ Manages SPU Runtime lifecycle as a dialect state, enabling reuse across
18
+ multiple executions while binding to the Interpreter's lifecycle.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from typing import TYPE_CHECKING
24
+
25
+ import spu.api as spu_api
26
+ import spu.libspu as libspu
27
+
28
+ from mplang.v2.runtime.dialect_state import DialectState
29
+
30
+ if TYPE_CHECKING:
31
+ from mplang.v2.dialects import spu
32
+
33
+
34
+ class SPUState(DialectState):
35
+ """SPU Runtime cache as dialect state.
36
+
37
+ Caches SPU Runtime and Io objects per (local_rank, world_size, config, link_mode)
38
+ to enable reuse across multiple SPU kernel executions.
39
+
40
+ This replaces the previous global `_SPU_RUNTIMES` cache with a properly
41
+ lifecycle-managed dialect state.
42
+ """
43
+
44
+ dialect_name: str = "spu"
45
+
46
+ def __init__(self) -> None:
47
+ # Key: (local_rank, world_size, protocol, field, link_mode)
48
+ # Value: (Runtime, Io)
49
+ self._runtimes: dict[
50
+ tuple[int, int, str, str, str], tuple[spu_api.Runtime, spu_api.Io]
51
+ ] = {}
52
+
53
+ def get_or_create(
54
+ self,
55
+ local_rank: int,
56
+ spu_world_size: int,
57
+ config: spu.SPUConfig,
58
+ spu_endpoints: list[str] | None = None,
59
+ ) -> tuple[spu_api.Runtime, spu_api.Io]:
60
+ """Get or create SPU Runtime and Io for the given configuration.
61
+
62
+ Args:
63
+ local_rank: The local rank within the SPU device (0-indexed).
64
+ spu_world_size: The number of parties in the SPU device.
65
+ config: SPU configuration including protocol settings.
66
+ spu_endpoints: Optional list of BRPC endpoints. If None, use mem link.
67
+
68
+ Returns:
69
+ A tuple of (Runtime, Io) for this party.
70
+ """
71
+ from mplang.v2.backends.spu_impl import to_runtime_config
72
+
73
+ link_mode = "brpc" if spu_endpoints else "mem"
74
+ cache_key = (
75
+ local_rank,
76
+ spu_world_size,
77
+ config.protocol,
78
+ config.field,
79
+ link_mode,
80
+ )
81
+
82
+ if cache_key in self._runtimes:
83
+ return self._runtimes[cache_key]
84
+
85
+ # Create Link
86
+ if spu_endpoints:
87
+ link = self._create_brpc_link(local_rank, spu_endpoints)
88
+ else:
89
+ link = self._create_mem_link(local_rank, spu_world_size)
90
+
91
+ # Create Runtime and Io
92
+ runtime_config = to_runtime_config(config)
93
+ runtime = spu_api.Runtime(link, runtime_config)
94
+ io = spu_api.Io(spu_world_size, runtime_config)
95
+
96
+ self._runtimes[cache_key] = (runtime, io)
97
+ return runtime, io
98
+
99
+ def _create_mem_link(
100
+ self, local_rank: int, spu_world_size: int
101
+ ) -> libspu.link.Context:
102
+ """Create in-memory link for simulation."""
103
+ desc = libspu.link.Desc() # type: ignore
104
+ desc.recv_timeout_ms = 30 * 1000
105
+ for i in range(spu_world_size):
106
+ desc.add_party(f"P{i}", f"mem:{i}")
107
+ return libspu.link.create_mem(desc, local_rank)
108
+
109
+ def _create_brpc_link(
110
+ self, local_rank: int, spu_endpoints: list[str]
111
+ ) -> libspu.link.Context:
112
+ """Create BRPC link for distributed execution."""
113
+ desc = libspu.link.Desc() # type: ignore
114
+ desc.recv_timeout_ms = 100 * 1000 # 100 seconds
115
+ desc.http_max_payload_size = 32 * 1024 * 1024 # 32MB
116
+
117
+ for i, endpoint in enumerate(spu_endpoints):
118
+ desc.add_party(f"P{i}", endpoint)
119
+
120
+ return libspu.link.create_brpc(desc, local_rank)
121
+
122
+ def shutdown(self) -> None:
123
+ """Clear all cached runtimes."""
124
+ self._runtimes.clear()
@@ -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)