mplang-nightly 0.1.dev265__tar.gz → 0.1.dev267__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.dev265 → mplang_nightly-0.1.dev267}/PKG-INFO +2 -2
  2. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/phe.py +8 -4
  3. mplang_nightly-0.1.dev267/mplang/v1/runtime/channel.py +230 -0
  4. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/communicator.py +37 -13
  5. mplang_nightly-0.1.dev267/mplang/v1/runtime/link_comm.py +196 -0
  6. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/server.py +10 -1
  7. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/session.py +11 -38
  8. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/simulation.py +30 -8
  9. mplang_nightly-0.1.dev267/mplang/v2/backends/channel.py +217 -0
  10. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/crypto_impl.py +95 -0
  11. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/http.py +44 -13
  12. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/mem.py +9 -6
  13. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/spu_impl.py +18 -5
  14. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/spu_state.py +66 -3
  15. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/crypto.py +101 -0
  16. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/api.py +30 -11
  17. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/ml/sgb.py +20 -32
  18. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/pyproject.toml +1 -1
  19. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_kernel_binding.py +8 -4
  20. mplang_nightly-0.1.dev267/tests/v1/runtime/test_channel.py +613 -0
  21. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_driver/test_http.py +10 -12
  22. mplang_nightly-0.1.dev267/tests/v2/backends/test_channel.py +188 -0
  23. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_crypto_impl.py +201 -0
  24. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_spu_impl.py +79 -0
  25. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_crypto.py +70 -0
  26. mplang_nightly-0.1.dev265/mplang/v1/runtime/link_comm.py +0 -78
  27. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/.gitignore +0 -0
  28. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/LICENSE +0 -0
  29. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/README.md +0 -0
  30. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/conf/3pc.yaml +0 -0
  31. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/README.md +0 -0
  32. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/models.py +0 -0
  33. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/stax_nn/stax_nn.py +0 -0
  34. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/bench_fhe_hist.py +0 -0
  35. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/hist_jax.py +0 -0
  36. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/hist_jax_test.py +0 -0
  37. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/naive_np.py +0 -0
  38. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/readme.md +0 -0
  39. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/sgb.py +0 -0
  40. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/examples/v1/xgboost/sgb_test.py +0 -0
  41. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/hatch_build.py +0 -0
  42. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/__init__.py +0 -0
  43. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/__init__.py +0 -0
  44. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/_device.py +0 -0
  45. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/analysis/__init__.py +0 -0
  46. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/analysis/diagram.py +0 -0
  47. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/__init__.py +0 -0
  48. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/cluster.py +0 -0
  49. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/comm.py +0 -0
  50. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/context_mgr.py +0 -0
  51. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/dtypes.py +0 -0
  52. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/__init__.py +0 -0
  53. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/ast.py +0 -0
  54. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/evaluator.py +0 -0
  55. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/printer.py +0 -0
  56. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/transformer.py +0 -0
  57. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/utils.py +0 -0
  58. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/visitor.py +0 -0
  59. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/expr/walk.py +0 -0
  60. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/interp.py +0 -0
  61. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mask.py +0 -0
  62. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mpir.py +0 -0
  63. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mpobject.py +0 -0
  64. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/mptype.py +0 -0
  65. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/pfunc.py +0 -0
  66. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/primitive.py +0 -0
  67. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/table.py +0 -0
  68. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/tensor.py +0 -0
  69. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/core/tracer.py +0 -0
  70. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/host.py +0 -0
  71. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/__init__.py +0 -0
  72. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/base.py +0 -0
  73. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/basic.py +0 -0
  74. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/context.py +0 -0
  75. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/crypto.py +0 -0
  76. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/fhe.py +0 -0
  77. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/mock_tee.py +0 -0
  78. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/spu.py +0 -0
  79. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/sql_duckdb.py +0 -0
  80. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/stablehlo.py +0 -0
  81. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/kernels/value.py +0 -0
  82. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/__init__.py +0 -0
  83. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/base.py +0 -0
  84. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/basic.py +0 -0
  85. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/crypto.py +0 -0
  86. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/fhe.py +0 -0
  87. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/jax_cc.py +0 -0
  88. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/nnx_cc.py +0 -0
  89. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/phe.py +0 -0
  90. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/spu.py +0 -0
  91. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/sql_cc.py +0 -0
  92. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/ops/tee.py +0 -0
  93. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -0
  94. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -0
  95. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/value_pb2.py +0 -0
  96. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -0
  97. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/__init__.py +0 -0
  98. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/cli.py +0 -0
  99. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/client.py +0 -0
  100. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/data_providers.py +0 -0
  101. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/driver.py +0 -0
  102. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/exceptions.py +0 -0
  103. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/runtime/http_api.md +0 -0
  104. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/__init__.py +0 -0
  105. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/api.py +0 -0
  106. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/mpi.py +0 -0
  107. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/party.py +0 -0
  108. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/random.py +0 -0
  109. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/simp/smpc.py +0 -0
  110. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/__init__.py +0 -0
  111. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/crypto.py +0 -0
  112. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/func_utils.py +0 -0
  113. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/spu_utils.py +0 -0
  114. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v1/utils/table_utils.py +0 -0
  115. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/__init__.py +0 -0
  116. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/__init__.py +0 -0
  117. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/bfv_impl.py +0 -0
  118. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/field_impl.py +0 -0
  119. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/func_impl.py +0 -0
  120. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/phe_impl.py +0 -0
  121. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_design.md +0 -0
  122. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/__init__.py +0 -0
  123. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/http.py +0 -0
  124. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/mem.py +0 -0
  125. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/ops.py +0 -0
  126. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/state.py +0 -0
  127. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_driver/values.py +0 -0
  128. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/__init__.py +0 -0
  129. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/ops.py +0 -0
  130. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/simp_worker/state.py +0 -0
  131. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/store_impl.py +0 -0
  132. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/table_impl.py +0 -0
  133. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/tee_impl.py +0 -0
  134. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/backends/tensor_impl.py +0 -0
  135. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/cli.py +0 -0
  136. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/cli_guide.md +0 -0
  137. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/__init__.py +0 -0
  138. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/bfv.py +0 -0
  139. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/dtypes.py +0 -0
  140. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/field.py +0 -0
  141. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/func.py +0 -0
  142. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/phe.py +0 -0
  143. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/simp.py +0 -0
  144. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/spu.py +0 -0
  145. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/store.py +0 -0
  146. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/table.py +0 -0
  147. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/tee.py +0 -0
  148. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/dialects/tensor.py +0 -0
  149. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/README.md +0 -0
  150. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/__init__.py +0 -0
  151. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/context.py +0 -0
  152. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/graph.py +0 -0
  153. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/jit.py +0 -0
  154. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/object.py +0 -0
  155. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/primitive.py +0 -0
  156. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/printer.py +0 -0
  157. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/registry.py +0 -0
  158. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/serde.py +0 -0
  159. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/tracer.py +0 -0
  160. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/edsl/typing.py +0 -0
  161. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/Makefile +0 -0
  162. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/__init__.py +0 -0
  163. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/gf128.cpp +0 -0
  164. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/ldpc.cpp +0 -0
  165. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/okvs.cpp +0 -0
  166. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/okvs_opt.cpp +0 -0
  167. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/kernels/py_kernels.py +0 -0
  168. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/collective.py +0 -0
  169. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/__init__.py +0 -0
  170. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/device/cluster.py +0 -0
  171. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/ml/__init__.py +0 -0
  172. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/__init__.py +0 -0
  173. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/_utils.py +0 -0
  174. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/__init__.py +0 -0
  175. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/aggregation.py +0 -0
  176. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/groupby.md +0 -0
  177. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/groupby.py +0 -0
  178. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/analytics/permutation.py +0 -0
  179. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/common/constants.py +0 -0
  180. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/__init__.py +0 -0
  181. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/base.py +0 -0
  182. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/extension.py +0 -0
  183. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/ot/silent.py +0 -0
  184. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/__init__.py +0 -0
  185. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/cuckoo.py +0 -0
  186. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/okvs.py +0 -0
  187. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/okvs_gct.py +0 -0
  188. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/oprf.py +0 -0
  189. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/rr22.py +0 -0
  190. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/psi/unbalanced.py +0 -0
  191. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/__init__.py +0 -0
  192. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/gilboa.py +0 -0
  193. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/ldpc.py +0 -0
  194. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/libs/mpc/vole/silver.py +0 -0
  195. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/__init__.py +0 -0
  196. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/dialect_state.py +0 -0
  197. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/interpreter.py +0 -0
  198. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/object_store.py +0 -0
  199. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/mplang/v2/runtime/value.py +0 -0
  200. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/__init__.py +0 -0
  201. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/conftest.py +0 -0
  202. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/__init__.py +0 -0
  203. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/analysis/test_diagram.py +0 -0
  204. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/conftest.py +0 -0
  205. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/__init__.py +0 -0
  206. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/__init__.py +0 -0
  207. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/conftest.py +0 -0
  208. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_ast.py +0 -0
  209. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_printer.py +0 -0
  210. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_utils.py +0 -0
  211. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/expr/test_walk.py +0 -0
  212. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_cluster.py +0 -0
  213. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_dtype.py +0 -0
  214. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mask.py +0 -0
  215. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mpir.py +0 -0
  216. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_mptype.py +0 -0
  217. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_primitive.py +0 -0
  218. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_table.py +0 -0
  219. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_tensor.py +0 -0
  220. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/core/test_tracer.py +0 -0
  221. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/device/__init__.py +0 -0
  222. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/device/test_device_basic.py +0 -0
  223. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/README.md +0 -0
  224. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_crypto_roundtrip.py +0 -0
  225. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_http_e2e.py +0 -0
  226. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_symbols_roundtrip.py +0 -0
  227. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_tee_workflow.py +0 -0
  228. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_tutorials.py +0 -0
  229. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/integration/test_unused_param_integration.py +0 -0
  230. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/__init__.py +0 -0
  231. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_basic.py +0 -0
  232. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_debug_print.py +0 -0
  233. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_fhe.py +0 -0
  234. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_phe.py +0 -0
  235. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_spu.py +0 -0
  236. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_sql_duckdb.py +0 -0
  237. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_stablehlo.py +0 -0
  238. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_value.py +0 -0
  239. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/kernels/test_value_serde.py +0 -0
  240. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/__init__.py +0 -0
  241. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/dummy.py +0 -0
  242. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_basic_pack.py +0 -0
  243. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_crypto.py +0 -0
  244. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_feop_base.py +0 -0
  245. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_jax_cc.py +0 -0
  246. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_nnx_cc.py +0 -0
  247. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_phe.py +0 -0
  248. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_spu.py +0 -0
  249. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_spu_defensive.py +0 -0
  250. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_sql.py +0 -0
  251. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_sql_cc.py +0 -0
  252. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/ops/test_table_tensor_conversion.py +0 -0
  253. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/__init__.py +0 -0
  254. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_cli.py +0 -0
  255. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_communicator.py +0 -0
  256. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_driver.py +0 -0
  257. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_server.py +0 -0
  258. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/runtime/test_simulation.py +0 -0
  259. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_mpi.py +0 -0
  260. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_random.py +0 -0
  261. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_smpc.py +0 -0
  262. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/simp/test_sugar.py +0 -0
  263. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/__init__.py +0 -0
  264. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/server_fixtures.py +0 -0
  265. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_func_utils.py +0 -0
  266. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_spu_utils.py +0 -0
  267. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v1/utils/test_table_utils.py +0 -0
  268. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/__init__.py +0 -0
  269. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/__init__.py +0 -0
  270. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_driver/__init__.py +0 -0
  271. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/__init__.py +0 -0
  272. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/test_http.py +0 -0
  273. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/simp_worker/test_mem.py +0 -0
  274. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_bfv_impl.py +0 -0
  275. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_okvs_binding.py +0 -0
  276. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_simp_integration.py +0 -0
  277. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_simp_object_store.py +0 -0
  278. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_table_impl.py +0 -0
  279. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_tee_impl.py +0 -0
  280. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_tensor_impl.py +0 -0
  281. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/backends/test_verify_clean.py +0 -0
  282. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/conftest.py +0 -0
  283. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/__init__.py +0 -0
  284. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_bfv.py +0 -0
  285. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_dtypes.py +0 -0
  286. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_field.py +0 -0
  287. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_func.py +0 -0
  288. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_okvs.py +0 -0
  289. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_okvs_bench.py +0 -0
  290. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_phe.py +0 -0
  291. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_simp.py +0 -0
  292. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_simp_comm.py +0 -0
  293. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_spu.py +0 -0
  294. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_table.py +0 -0
  295. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_tee.py +0 -0
  296. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/dialects/test_tensor.py +0 -0
  297. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/__init__.py +0 -0
  298. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_context.py +0 -0
  299. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_graph.py +0 -0
  300. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_primitive.py +0 -0
  301. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_primitive_multi_output.py +0 -0
  302. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_printer.py +0 -0
  303. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_serde.py +0 -0
  304. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_tracer.py +0 -0
  305. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_typing.py +0 -0
  306. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/edsl/test_typing_graph_serde.py +0 -0
  307. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/__init__.py +0 -0
  308. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/conftest.py +0 -0
  309. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_api_errors.py +0 -0
  310. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_dialects.py +0 -0
  311. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_layouts.py +0 -0
  312. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/device/test_device_tee.py +0 -0
  313. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/__init__.py +0 -0
  314. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/test_sgb.py +0 -0
  315. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/ml/test_sgb_bench.py +0 -0
  316. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/__init__.py +0 -0
  317. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/__init__.py +0 -0
  318. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_aggregation.py +0 -0
  319. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_groupby.py +0 -0
  320. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/analytics/test_permutation.py +0 -0
  321. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/__init__.py +0 -0
  322. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_ot.py +0 -0
  323. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_ot_extension.py +0 -0
  324. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/ot/test_silent_ot.py +0 -0
  325. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/__init__.py +0 -0
  326. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_okvs_gct.py +0 -0
  327. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_oprf.py +0 -0
  328. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_psi.py +0 -0
  329. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_psi_bench.py +0 -0
  330. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/test_rr22.py +0 -0
  331. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  332. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/test_field_gf128.py +0 -0
  333. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/test_utils.py +0 -0
  334. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/__init__.py +0 -0
  335. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_gilboa_manual.py +0 -0
  336. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_ldpc.py +0 -0
  337. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_silver_vole.py +0 -0
  338. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_vole.py +0 -0
  339. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/test_vole_bench.py +0 -0
  340. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/mpc/vole/verify_vole_logic.py +0 -0
  341. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/test_collective.py +0 -0
  342. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/libs/test_simple_guide.py +0 -0
  343. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_interpreter_async.py +0 -0
  344. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_object_store.py +0 -0
  345. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/runtime/test_object_store_fs.py +0 -0
  346. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_fetch_semantics.py +0 -0
  347. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_pytree_io.py +0 -0
  348. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/test_store.py +0 -0
  349. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/utils/__init__.py +0 -0
  350. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tests/v2/utils/tensor_patch.py +0 -0
  351. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/MIGRATION.md +0 -0
  352. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/README.md +0 -0
  353. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/__init__.py +0 -0
  354. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/alice.csv +0 -0
  355. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/bob.csv +0 -0
  356. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/data/prepare_vertical_iris.py +0 -0
  357. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/run.sh +0 -0
  358. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/00_device_basics.py +0 -0
  359. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/01_function_decorator.py +0 -0
  360. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/02_simulation_and_driver.py +0 -0
  361. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/03_run_jax.py +0 -0
  362. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/04_run_sql.py +0 -0
  363. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/05_pipeline.py +0 -0
  364. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/06_ir_dump_and_analysis.py +0 -0
  365. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/device/07_run_nnx.py +0 -0
  366. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/pitfalls/late_binding.py +0 -0
  367. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/pitfalls/rand.py +0 -0
  368. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/00_basic.py +0 -0
  369. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/01_condition.py +0 -0
  370. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/02_whileloop.py +0 -0
  371. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/03_stdio.py +0 -0
  372. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/04_phe.py +0 -0
  373. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/05_tee.py +0 -0
  374. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/06_fhe.py +0 -0
  375. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/07_advanced.py +0 -0
  376. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v1/simp/08_simple_secret_sharing.py +0 -0
  377. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/00_device_basics.py +0 -0
  378. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/01_function_decorator.py +0 -0
  379. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/02_simulation_and_driver.py +0 -0
  380. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/03_run_jax.py +0 -0
  381. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/04_ir_dump_and_analysis.py +0 -0
  382. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/05_run_sql.py +0 -0
  383. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/06_pipeline.py +0 -0
  384. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/tutorials/v2/07_stax_nn.py +0 -0
  385. {mplang_nightly-0.1.dev265 → mplang_nightly-0.1.dev267}/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.dev265
3
+ Version: 0.1.dev267
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -219,7 +219,7 @@ Requires-Dist: pandas>=2.0.0
219
219
  Requires-Dist: protobuf<6.0,>=5.0
220
220
  Requires-Dist: pyarrow>=14.0.0
221
221
  Requires-Dist: pyyaml>=6.0
222
- Requires-Dist: spu>=0.10.0.dev20251208
222
+ Requires-Dist: spu>=0.10.0.dev20251211
223
223
  Requires-Dist: sqlglot>=23.0.0
224
224
  Requires-Dist: tenseal==0.3.16
225
225
  Requires-Dist: typing-extensions
@@ -637,7 +637,8 @@ def _phe_mul(pfunc: PFunction, ciphertext: CipherText, plaintext: TensorValue) -
637
637
  # Use numpy to create a properly broadcasted index mapping
638
638
  # Create a dummy array with same shape as ciphertext, fill with indices
639
639
  dummy_ct = (
640
- np.arange(np.prod(ciphertext.semantic_shape))
640
+ np
641
+ .arange(np.prod(ciphertext.semantic_shape))
641
642
  .reshape(ciphertext.semantic_shape)
642
643
  .astype(np.int64)
643
644
  )
@@ -744,7 +745,8 @@ def _phe_add_ct2ct(ct1: CipherText, ct2: CipherText) -> CipherText:
744
745
  # Broadcast ct1 if needed
745
746
  if ct1.semantic_shape != result_shape:
746
747
  dummy_ct1 = (
747
- np.arange(np.prod(ct1.semantic_shape))
748
+ np
749
+ .arange(np.prod(ct1.semantic_shape))
748
750
  .reshape(ct1.semantic_shape)
749
751
  .astype(np.int64)
750
752
  )
@@ -757,7 +759,8 @@ def _phe_add_ct2ct(ct1: CipherText, ct2: CipherText) -> CipherText:
757
759
  # Broadcast ct2 if needed
758
760
  if ct2.semantic_shape != result_shape:
759
761
  dummy_ct2 = (
760
- np.arange(np.prod(ct2.semantic_shape))
762
+ np
763
+ .arange(np.prod(ct2.semantic_shape))
761
764
  .reshape(ct2.semantic_shape)
762
765
  .astype(np.int64)
763
766
  )
@@ -830,7 +833,8 @@ def _phe_add_ct2pt(ciphertext: CipherText, plaintext: TensorValue) -> CipherText
830
833
  # Broadcast ciphertext if needed
831
834
  if ciphertext.semantic_shape != result_shape:
832
835
  dummy_ct = (
833
- np.arange(np.prod(ciphertext.semantic_shape))
836
+ np
837
+ .arange(np.prod(ciphertext.semantic_shape))
834
838
  .reshape(ciphertext.semantic_shape)
835
839
  .astype(np.int64)
836
840
  )
@@ -0,0 +1,230 @@
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 IChannel implementation that bridges to MPLang CommunicatorBase.
16
+
17
+ This module provides BaseChannel, which allows SPU to reuse MPLang's
18
+ existing communication layer (ThreadCommunicator/HttpCommunicator) instead
19
+ of creating separate BRPC connections.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import logging
25
+ from typing import TYPE_CHECKING
26
+
27
+ import spu.libspu as libspu
28
+
29
+ if TYPE_CHECKING:
30
+ from mplang.v1.core.comm import CommunicatorBase
31
+
32
+
33
+ class BaseChannel(libspu.link.IChannel):
34
+ """Bridge MPLang CommunicatorBase to SPU IChannel interface.
35
+
36
+ This adapter allows SPU to use MPLang's existing communication layer
37
+ (ThreadCommunicator or HttpCommunicator) instead of creating separate
38
+ BRPC connections.
39
+
40
+ Each BaseChannel represents a channel to ONE peer rank.
41
+
42
+ Communication Protocol:
43
+ - SPU calls send(tag, bytes_data) -> MPLang comm.send(peer, key, bytes_data)
44
+ - SPU calls recv(tag) -> bytes_data <- MPLang comm.recv(peer, key)
45
+
46
+ Tag Namespace:
47
+ All tags are prefixed with "spu:" to avoid collision with other
48
+ MPLang traffic on the same communicator.
49
+ """
50
+
51
+ def __init__(
52
+ self,
53
+ comm: CommunicatorBase,
54
+ local_rank: int,
55
+ peer_rank: int,
56
+ tag_prefix: str = "spu",
57
+ ):
58
+ """Initialize channel to a specific peer.
59
+
60
+ Args:
61
+ comm: MPLang communicator instance (Thread/Http)
62
+ local_rank: Global rank of this party (for logging/debugging)
63
+ peer_rank: Global rank of the peer party
64
+ tag_prefix: Prefix for all tags to avoid collision (default: "spu")
65
+ """
66
+ super().__init__()
67
+ self._comm = comm
68
+ self._local_rank = local_rank
69
+ self._peer_rank = peer_rank
70
+ self._tag_prefix = tag_prefix
71
+
72
+ logging.debug(
73
+ f"BaseChannel initialized: local_rank={local_rank}, "
74
+ f"peer_rank={peer_rank}, tag_prefix={tag_prefix}"
75
+ )
76
+
77
+ def _make_key(self, tag: str) -> str:
78
+ """Create unique key for MPLang comm.
79
+
80
+ Prefixes the tag to avoid collision with non-SPU traffic.
81
+
82
+ Args:
83
+ tag: SPU-provided tag (e.g., "send_0", "recv_0")
84
+
85
+ Returns:
86
+ Prefixed key (e.g., "spu:send_0")
87
+ """
88
+ return f"{self._tag_prefix}:{tag}"
89
+
90
+ def Send(self, tag: str, data: bytes) -> None:
91
+ """Send bytes to peer (synchronous in SPU semantics).
92
+
93
+ Args:
94
+ tag: Message tag for matching send/recv pairs
95
+ data: Raw bytes to send
96
+ """
97
+ key = self._make_key(tag)
98
+ logging.debug(
99
+ f"BaseChannel.Send: {self._local_rank} -> {self._peer_rank}, "
100
+ f"tag={tag}, key={key}, size={len(data)}"
101
+ )
102
+
103
+ # Send raw bytes directly
104
+ # Note: CommunicatorBase.send expects Any type, bytes is acceptable
105
+ self._comm.send(self._peer_rank, key, data)
106
+
107
+ def Recv(self, tag: str) -> bytes:
108
+ """Receive bytes from peer (blocking).
109
+
110
+ Args:
111
+ tag: Message tag for matching send/recv pairs
112
+
113
+ Returns:
114
+ Raw bytes received
115
+ """
116
+ key = self._make_key(tag)
117
+ logging.debug(
118
+ f"BaseChannel.Recv: {self._local_rank} <- {self._peer_rank}, "
119
+ f"tag={tag}, key={key}"
120
+ )
121
+
122
+ # Receive data (should be bytes)
123
+ data = self._comm.recv(self._peer_rank, key)
124
+
125
+ # Validate data type
126
+ if not isinstance(data, bytes):
127
+ raise TypeError(
128
+ f"Expected bytes from communicator, got {type(data).__name__}. "
129
+ f"Communicator must support raw bytes transmission for SPU channels."
130
+ )
131
+
132
+ logging.debug(
133
+ f"BaseChannel.Recv complete: {self._local_rank} <- {self._peer_rank}, "
134
+ f"tag={tag}, size={len(data)}"
135
+ )
136
+ return data
137
+
138
+ def SendAsync(self, tag: str, data: bytes) -> None:
139
+ """Async send (MPLang's send is already async at network layer).
140
+
141
+ For HttpCommunicator, the underlying httpx.put() is non-blocking
142
+ at the HTTP client level. For ThreadCommunicator, send is instant
143
+ (memory transfer).
144
+
145
+ Args:
146
+ tag: Message tag
147
+ data: Raw bytes to send
148
+ """
149
+ # Reuse synchronous send - it's already async underneath
150
+ self.Send(tag, data)
151
+
152
+ def SendAsyncThrottled(self, tag: str, data: bytes) -> None:
153
+ """Throttled async send.
154
+
155
+ Currently maps to regular SendAsync. Future optimization could
156
+ implement rate limiting if needed.
157
+
158
+ Args:
159
+ tag: Message tag
160
+ data: Raw bytes to send
161
+ """
162
+ self.SendAsync(tag, data)
163
+
164
+ def TestSend(self, timeout: int) -> None:
165
+ """Test if this channel can send a dummy msg to peer.
166
+
167
+ Uses fixed 0 seq_id as dummy msg's id to make this function reentrant.
168
+ ConnectToMesh will retry on this multiple times.
169
+
170
+ Args:
171
+ timeout: Timeout in milliseconds
172
+ """
173
+ # Send a handshake message to test connectivity
174
+ # Use fixed tag "__test__" to make this reentrant (idempotent)
175
+ test_data = b"\x00" # Minimal 1-byte message with seq_id=0
176
+ self.Send("__test__", test_data)
177
+
178
+ def TestRecv(self) -> None:
179
+ """Wait for dummy msg from peer.
180
+
181
+ Timeout is controlled by recv_timeout_ms in link descriptor.
182
+ """
183
+ # Receive the handshake message from peer
184
+ # This blocks until message arrives (timeout from desc.recv_timeout_ms)
185
+ test_data = self.Recv("__test__")
186
+ # Validate it's the expected handshake message
187
+ if test_data != b"\x00":
188
+ logging.warning(
189
+ f"TestRecv: unexpected handshake data from {self._peer_rank}, "
190
+ f"expected b'\\x00', got {test_data!r}"
191
+ )
192
+
193
+ def WaitLinkTaskFinish(self) -> None:
194
+ """Wait for all pending async tasks.
195
+
196
+ For MPLang communicators:
197
+ - ThreadCommunicator: No-op (instant memory transfer)
198
+ - HttpCommunicator: No explicit wait needed (httpx handles it)
199
+
200
+ This is a no-op in current implementation.
201
+ """
202
+
203
+ def Abort(self) -> None:
204
+ """Abort communication (cleanup resources).
205
+
206
+ This could be extended to notify the communicator to drop pending
207
+ messages for this channel, but currently is a no-op.
208
+ """
209
+ logging.warning(
210
+ f"BaseChannel.Abort called: {self._local_rank} <-> {self._peer_rank}"
211
+ )
212
+ # Future: Could call comm.abort_session() if implemented
213
+
214
+ def SetThrottleWindowSize(self, size: int) -> None:
215
+ """Set throttle window size.
216
+
217
+ Not applicable to MPLang communicators. No-op.
218
+
219
+ Args:
220
+ size: Window size (ignored)
221
+ """
222
+
223
+ def SetChunkParallelSendSize(self, size: int) -> None:
224
+ """Set chunk parallel send size.
225
+
226
+ Not applicable to MPLang communicators. No-op.
227
+
228
+ Args:
229
+ size: Chunk size (ignored)
230
+ """
@@ -57,7 +57,12 @@ class HttpCommunicator(CommunicatorBase):
57
57
  return str(res)
58
58
 
59
59
  def send(self, to: int, key: str, data: Any) -> None:
60
- """Sends data to a peer party by PUTing to its /comm/{key}/from/{from_rank} endpoint."""
60
+ """Sends data to a peer party by PUTing to its /comm/{key}/from/{from_rank} endpoint.
61
+
62
+ Supports two modes:
63
+ - SPU channel (key starts with "spu:"): sends raw bytes directly
64
+ - Normal channel: wraps data in Value envelope
65
+ """
61
66
  target_endpoint = self.endpoints[to]
62
67
  url = f"{target_endpoint}/sessions/{self.session_name}/comm/{key}/from/{self._rank}"
63
68
  logging.debug(
@@ -65,19 +70,20 @@ class HttpCommunicator(CommunicatorBase):
65
70
  )
66
71
 
67
72
  try:
68
- # Serialize data using Value envelope.
69
- if not isinstance(data, Value):
73
+ # SPU channel mode: send raw bytes directly
74
+ if key.startswith("spu:") and isinstance(data, bytes):
75
+ data_b64 = base64.b64encode(data).decode("utf-8")
76
+ request_data = {"data": data_b64, "is_raw_bytes": True}
77
+ # Normal mode: serialize using Value envelope
78
+ elif isinstance(data, Value):
79
+ data_bytes = encode_value(data)
80
+ data_b64 = base64.b64encode(data_bytes).decode("utf-8")
81
+ request_data = {"data": data_b64}
82
+ else:
70
83
  raise TypeError(
71
84
  f"Communicator requires Value instance, got {type(data).__name__}. "
72
85
  "Wrap data in TensorValue or custom Value subclass."
73
86
  )
74
- data_bytes = encode_value(data)
75
-
76
- data_b64 = base64.b64encode(data_bytes).decode("utf-8")
77
-
78
- request_data = {
79
- "data": data_b64,
80
- }
81
87
 
82
88
  response = httpx.put(url, json=request_data, timeout=60)
83
89
  logging.debug(f"Send response: status={response.status_code}")
@@ -91,14 +97,32 @@ class HttpCommunicator(CommunicatorBase):
91
97
  raise OSError(f"Failed to send data to rank {to}") from e
92
98
 
93
99
  def recv(self, frm: int, key: str) -> Any:
94
- """Wait until the key is set, returns the value. Override to add logging."""
100
+ """Wait until the key is set, returns the value.
101
+
102
+ Supports two modes:
103
+ - SPU channel (key starts with "spu:"): returns raw bytes
104
+ - Normal channel: returns deserialized Value
105
+ """
95
106
  logging.debug(
96
107
  f"Waiting to receive: from_rank={frm}, to_rank={self._rank}, key={key}"
97
108
  )
98
- data_b64 = super().recv(frm, key)
109
+ received_data = super().recv(frm, key)
99
110
 
111
+ # Check if this is raw bytes (SPU channel)
112
+ if isinstance(received_data, dict) and received_data.get("is_raw_bytes"):
113
+ data_bytes = base64.b64decode(received_data["data"])
114
+ logging.debug(
115
+ f"Received raw bytes: from_rank={frm}, to_rank={self._rank}, key={key}, size={len(data_bytes)}"
116
+ )
117
+ return data_bytes
118
+
119
+ # Normal mode: deserialize Value envelope
120
+ data_b64 = (
121
+ received_data
122
+ if isinstance(received_data, str)
123
+ else received_data.get("data")
124
+ )
100
125
  data_bytes = base64.b64decode(data_b64)
101
- # Deserialize using Value envelope
102
126
  result = decode_value(data_bytes)
103
127
 
104
128
  logging.debug(
@@ -0,0 +1,196 @@
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
+ from __future__ import annotations
16
+
17
+ import logging
18
+ from typing import TYPE_CHECKING
19
+
20
+ import spu.libspu as libspu
21
+
22
+ if TYPE_CHECKING:
23
+ from mplang.v1.core.comm import CommunicatorBase
24
+ from mplang.v1.core.mask import Mask
25
+
26
+
27
+ class LinkCommunicator:
28
+ """Minimal wrapper for libspu link context.
29
+
30
+ Supports three modes:
31
+ 1. BRPC: Production mode with separate BRPC ports (legacy)
32
+ 2. Mem: In-memory links for testing (legacy)
33
+ 3. Channels: Reuse MPLang communicator via IChannel bridge (NEW)
34
+
35
+ The mode is selected based on constructor arguments:
36
+ - If `comm` is provided: Channels mode (NEW)
37
+ - Elif `mem_link` is True: Mem mode
38
+ - Else: BRPC mode
39
+ """
40
+
41
+ def __init__(
42
+ self,
43
+ rank: int,
44
+ addrs: list[str] | None = None,
45
+ *,
46
+ mem_link: bool = False,
47
+ comm: CommunicatorBase | None = None,
48
+ spu_mask: Mask | None = None,
49
+ ):
50
+ """Initialize link communicator for SPU.
51
+
52
+ Args:
53
+ rank: Global rank of this party
54
+ addrs: List of addresses for all SPU parties (required for BRPC/Mem mode)
55
+ mem_link: If True, use in-memory link (Mem mode)
56
+ comm: MPLang communicator to reuse (Channels mode, NEW)
57
+ spu_mask: SPU parties mask (required for Channels mode)
58
+
59
+ Raises:
60
+ ValueError: If arguments are invalid for the selected mode
61
+ """
62
+ self._rank = rank
63
+
64
+ # Select initialization mode based on arguments
65
+ if comm is not None:
66
+ self._init_channels_mode(rank, comm, spu_mask)
67
+ elif mem_link:
68
+ self._init_mem_mode(rank, addrs)
69
+ else:
70
+ self._init_brpc_mode(rank, addrs)
71
+
72
+ def _init_channels_mode(
73
+ self, rank: int, comm: CommunicatorBase, spu_mask: Mask | None
74
+ ) -> None:
75
+ """Initialize Channels mode (reuse MPLang communicator).
76
+
77
+ Args:
78
+ rank: Global rank of this party
79
+ comm: MPLang communicator to reuse
80
+ spu_mask: SPU parties mask
81
+
82
+ Raises:
83
+ ValueError: If spu_mask is None or rank not in mask
84
+ """
85
+ if spu_mask is None:
86
+ raise ValueError("spu_mask required when using comm")
87
+ if rank not in spu_mask:
88
+ raise ValueError(f"rank {rank} not in spu_mask {spu_mask}")
89
+
90
+ # Lazy import to avoid circular dependency
91
+ from mplang.v1.runtime.channel import BaseChannel
92
+
93
+ # Create channels to ALL SPU parties (including self)
94
+ # libspu expects world_size channels, with self channel being None
95
+ channels = []
96
+ rel_rank = spu_mask.global_to_relative_rank(rank)
97
+
98
+ for _, peer_rank in enumerate(spu_mask):
99
+ if peer_rank == rank:
100
+ # For self, use None (won't be accessed by SPU)
101
+ channel = None
102
+ else:
103
+ channel = BaseChannel(comm, rank, peer_rank)
104
+ channels.append(channel)
105
+
106
+ # Create link context with custom channels
107
+ desc = libspu.link.Desc() # type: ignore
108
+ desc.recv_timeout_ms = 100 * 1000 # 100 seconds
109
+
110
+ # Add party info to desc (required for world_size inference)
111
+ for idx, peer_rank in enumerate(spu_mask):
112
+ desc.add_party(f"P{idx}", f"dummy_{peer_rank}")
113
+
114
+ self.lctx = libspu.link.create_with_channels(desc, rel_rank, channels)
115
+ self._world_size = spu_mask.num_parties()
116
+
117
+ logging.info(
118
+ f"LinkCommunicator initialized with BaseChannel: "
119
+ f"rank={rank}, rel_rank={rel_rank}, spu_mask={spu_mask}, "
120
+ f"world_size={self._world_size}"
121
+ )
122
+
123
+ def _init_mem_mode(self, rank: int, addrs: list[str] | None) -> None:
124
+ """Initialize Mem mode (in-memory links for testing).
125
+
126
+ Args:
127
+ rank: Global rank of this party
128
+ addrs: List of addresses for all SPU parties
129
+
130
+ Raises:
131
+ ValueError: If addrs is None
132
+ """
133
+ if addrs is None:
134
+ raise ValueError("addrs required for Mem mode")
135
+
136
+ self._world_size = len(addrs)
137
+
138
+ desc = libspu.link.Desc() # type: ignore
139
+ desc.recv_timeout_ms = 100 * 1000 # 100 seconds
140
+ desc.http_max_payload_size = 32 * 1024 * 1024 # 32M
141
+ for rank_idx, addr in enumerate(addrs):
142
+ desc.add_party(f"P{rank_idx}", addr)
143
+
144
+ self.lctx = libspu.link.create_mem(desc, self._rank)
145
+ logging.info(
146
+ f"LinkCommunicator initialized with Mem: "
147
+ f"rank={self._rank}, world_size={self._world_size}, addrs={addrs}"
148
+ )
149
+
150
+ def _init_brpc_mode(self, rank: int, addrs: list[str] | None) -> None:
151
+ """Initialize BRPC mode (production mode with separate BRPC ports).
152
+
153
+ Args:
154
+ rank: Global rank of this party
155
+ addrs: List of addresses for all SPU parties
156
+
157
+ Raises:
158
+ ValueError: If addrs is None
159
+ """
160
+ if addrs is None:
161
+ raise ValueError("addrs required for BRPC mode")
162
+
163
+ self._world_size = len(addrs)
164
+
165
+ desc = libspu.link.Desc() # type: ignore
166
+ desc.recv_timeout_ms = 100 * 1000 # 100 seconds
167
+ desc.http_max_payload_size = 32 * 1024 * 1024 # 32M
168
+ for rank_idx, addr in enumerate(addrs):
169
+ desc.add_party(f"P{rank_idx}", addr)
170
+
171
+ self.lctx = libspu.link.create_brpc(desc, self._rank)
172
+ logging.info(
173
+ f"LinkCommunicator initialized with BRPC: "
174
+ f"rank={self._rank}, world_size={self._world_size}, addrs={addrs}"
175
+ )
176
+
177
+ @property
178
+ def rank(self) -> int:
179
+ """Get rank from underlying link context."""
180
+ return self.lctx.rank # type: ignore[no-any-return]
181
+
182
+ @property
183
+ def world_size(self) -> int:
184
+ """Get world size from underlying link context."""
185
+ return self.lctx.world_size # type: ignore[no-any-return]
186
+
187
+ def get_lctx(self) -> libspu.link.Context:
188
+ """Get the underlying libspu link context.
189
+
190
+ This is the primary interface - SPU runtime uses this context directly.
191
+ All communication and serialization is handled by libspu internally.
192
+
193
+ Returns:
194
+ The underlying libspu.link.Context instance.
195
+ """
196
+ return self.lctx
@@ -219,6 +219,7 @@ class SymbolResponse(BaseModel):
219
219
 
220
220
  class CommSendRequest(BaseModel):
221
221
  data: str # Base64 encoded binary data
222
+ is_raw_bytes: bool = False # True for SPU channel raw bytes
222
223
 
223
224
 
224
225
  # Response Models for enhanced status
@@ -487,6 +488,14 @@ def comm_send(
487
488
  # The receiver rank should be the rank of the server hosting this endpoint
488
489
  # We don't need to validate to_rank since the request is coming to this server
489
490
 
491
+ # For raw bytes (SPU channel), pass through as dict with flag
492
+ # For normal data, pass the base64 string directly
493
+ data_payload: str | dict[str, object]
494
+ if request.is_raw_bytes:
495
+ data_payload = {"data": request.data, "is_raw_bytes": True}
496
+ else:
497
+ data_payload = request.data
498
+
490
499
  # Use the proper onSent mechanism from CommunicatorBase
491
- sess.communicator.onSent(from_rank, key, request.data)
500
+ sess.communicator.onSent(from_rank, key, data_payload)
492
501
  return {"status": "ok"}
@@ -25,12 +25,10 @@ Process-wide registries (sessions, global symbols) live in the server layer
25
25
 
26
26
  from __future__ import annotations
27
27
 
28
- import logging
29
28
  import time
30
29
  from dataclasses import dataclass, field
31
30
  from functools import cached_property
32
31
  from typing import TYPE_CHECKING, Any, cast
33
- from urllib.parse import urlparse
34
32
 
35
33
  import spu.libspu as libspu
36
34
 
@@ -51,27 +49,6 @@ if TYPE_CHECKING: # pragma: no cover - import only for type checking
51
49
  from mplang.v1.core.cluster import ClusterSpec, Node, RuntimeInfo
52
50
 
53
51
 
54
- class LinkCommFactory:
55
- """Factory for creating and caching link communicators."""
56
-
57
- def __init__(self) -> None:
58
- self._cache: dict[tuple[int, tuple[str, ...]], LinkCommunicator] = {}
59
-
60
- def create_link(self, rel_rank: int, addrs: list[str]) -> LinkCommunicator:
61
- key = (rel_rank, tuple(addrs))
62
- link = self._cache.get(key)
63
- if link is not None:
64
- return link
65
- logging.info(f"LinkCommunicator created: rel_rank={rel_rank} addrs={addrs}")
66
- link = LinkCommunicator(rel_rank, addrs)
67
- self._cache[key] = link
68
- return link
69
-
70
-
71
- # Shared link factory (module-local, not global registry of sessions)
72
- g_link_factory = LinkCommFactory()
73
-
74
-
75
52
  @dataclass
76
53
  class Symbol:
77
54
  name: str
@@ -184,23 +161,19 @@ class Session:
184
161
  return
185
162
 
186
163
  link_ctx = None
187
- # TODO(jint): reuse same port for mplang and spu.
188
- SPU_PORT_OFFSET = 100
189
164
 
190
165
  if self.is_spu_party:
191
- # Build SPU address list across all endpoints for ranks in mask
192
- spu_addrs: list[str] = []
193
- for r, addr in enumerate(self.cluster_spec.endpoints):
194
- if r in self.spu_mask:
195
- # TODO(oeqqwq): addr may contain other schema like grpc://
196
- if not addr.startswith(("http://", "https://")):
197
- addr = f"http://{addr}"
198
- parsed = urlparse(addr)
199
- assert isinstance(parsed.port, int)
200
- new_addr = f"{parsed.hostname}:{parsed.port + SPU_PORT_OFFSET}"
201
- spu_addrs.append(new_addr)
202
- rel_index = sum(1 for r in range(self.rank) if r in self.spu_mask)
203
- link_ctx = g_link_factory.create_link(rel_index, spu_addrs)
166
+ # Use Channels mode to reuse existing HttpCommunicator
167
+ # This eliminates the need for separate BRPC ports (SPU_PORT_OFFSET)
168
+ from mplang.v1.core.comm import CommunicatorBase
169
+
170
+ # Type assertion: ICommunicator is actually CommunicatorBase
171
+ comm = cast(CommunicatorBase, self.communicator)
172
+ link_ctx = LinkCommunicator(
173
+ rank=self.rank,
174
+ comm=comm,
175
+ spu_mask=self.spu_mask,
176
+ )
204
177
 
205
178
  spu_config = libspu.RuntimeConfig(
206
179
  protocol=parse_protocol(self.spu_protocol),