mplang-nightly 0.1.dev182__tar.gz → 0.1.dev184__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 (171) hide show
  1. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/PKG-INFO +1 -1
  2. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/cluster.py +11 -0
  3. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/comm.py +4 -0
  4. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/communicator.py +15 -2
  5. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/server.py +3 -4
  6. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/session.py +32 -27
  7. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_communicator.py +5 -3
  8. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/.gitignore +0 -0
  9. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/LICENSE +0 -0
  10. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/README.md +0 -0
  11. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/conf/3pc.yaml +0 -0
  12. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/README.md +0 -0
  13. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/models.py +0 -0
  14. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/stax_nn/stax_nn.py +0 -0
  15. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/hist_jax.py +0 -0
  16. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/hist_jax_test.py +0 -0
  17. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/naive_np.py +0 -0
  18. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/readme.md +0 -0
  19. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/sgb.py +0 -0
  20. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/examples/xgboost/sgb_test.py +0 -0
  21. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/hatch_build.py +0 -0
  22. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/__init__.py +0 -0
  23. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/analysis/__init__.py +0 -0
  24. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/analysis/diagram.py +0 -0
  25. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/__init__.py +0 -0
  26. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/context_mgr.py +0 -0
  27. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/dtypes.py +0 -0
  28. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/__init__.py +0 -0
  29. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/ast.py +0 -0
  30. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/evaluator.py +0 -0
  31. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/printer.py +0 -0
  32. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/transformer.py +0 -0
  33. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/utils.py +0 -0
  34. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/visitor.py +0 -0
  35. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/expr/walk.py +0 -0
  36. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/interp.py +0 -0
  37. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mask.py +0 -0
  38. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mpir.py +0 -0
  39. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mpobject.py +0 -0
  40. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/mptype.py +0 -0
  41. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/pfunc.py +0 -0
  42. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/primitive.py +0 -0
  43. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/table.py +0 -0
  44. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/tensor.py +0 -0
  45. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/core/tracer.py +0 -0
  46. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/device.py +0 -0
  47. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/host.py +0 -0
  48. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/__init__.py +0 -0
  49. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/base.py +0 -0
  50. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/basic.py +0 -0
  51. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/context.py +0 -0
  52. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/crypto.py +0 -0
  53. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/mock_tee.py +0 -0
  54. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/phe.py +0 -0
  55. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/spu.py +0 -0
  56. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/sql_duckdb.py +0 -0
  57. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/stablehlo.py +0 -0
  58. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/kernels/value.py +0 -0
  59. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/__init__.py +0 -0
  60. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/base.py +0 -0
  61. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/basic.py +0 -0
  62. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/crypto.py +0 -0
  63. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/ibis_cc.py +0 -0
  64. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/jax_cc.py +0 -0
  65. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/phe.py +0 -0
  66. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/spu.py +0 -0
  67. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/sql_cc.py +0 -0
  68. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/ops/tee.py +0 -0
  69. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/mpir_pb2.py +0 -0
  70. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/mpir_pb2.pyi +0 -0
  71. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/value_pb2.py +0 -0
  72. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/protos/v1alpha1/value_pb2.pyi +0 -0
  73. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/__init__.py +0 -0
  74. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/cli.py +0 -0
  75. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/client.py +0 -0
  76. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/data_providers.py +0 -0
  77. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/driver.py +0 -0
  78. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/exceptions.py +0 -0
  79. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/http_api.md +0 -0
  80. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/link_comm.py +0 -0
  81. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/runtime/simulation.py +0 -0
  82. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/__init__.py +0 -0
  83. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/api.py +0 -0
  84. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/mpi.py +0 -0
  85. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/party.py +0 -0
  86. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/random.py +0 -0
  87. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/simp/smpc.py +0 -0
  88. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/__init__.py +0 -0
  89. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/crypto.py +0 -0
  90. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/func_utils.py +0 -0
  91. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/spu_utils.py +0 -0
  92. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/mplang/utils/table_utils.py +0 -0
  93. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/pyproject.toml +0 -0
  94. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/analysis/test_diagram.py +0 -0
  96. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/conftest.py +0 -0
  97. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/__init__.py +0 -0
  98. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/__init__.py +0 -0
  99. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/conftest.py +0 -0
  100. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_ast.py +0 -0
  101. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_printer.py +0 -0
  102. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_utils.py +0 -0
  103. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/expr/test_walk.py +0 -0
  104. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_cluster.py +0 -0
  105. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_dtype.py +0 -0
  106. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mask.py +0 -0
  107. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mpir.py +0 -0
  108. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_mptype.py +0 -0
  109. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_primitive.py +0 -0
  110. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_table.py +0 -0
  111. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_tensor.py +0 -0
  112. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/core/test_tracer.py +0 -0
  113. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/device/__init__.py +0 -0
  114. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/device/test_device_basic.py +0 -0
  115. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/README.md +0 -0
  116. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_crypto_roundtrip.py +0 -0
  117. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_http_e2e.py +0 -0
  118. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_symbols_roundtrip.py +0 -0
  119. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_tee_workflow.py +0 -0
  120. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_tutorials.py +0 -0
  121. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/integration/test_unused_param_integration.py +0 -0
  122. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_basic.py +0 -0
  123. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_debug_print.py +0 -0
  124. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_kernel_binding.py +0 -0
  125. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_phe.py +0 -0
  126. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_spu.py +0 -0
  127. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_sql_duckdb.py +0 -0
  128. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_stablehlo.py +0 -0
  129. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_value.py +0 -0
  130. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/kernels/test_value_serde.py +0 -0
  131. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/__init__.py +0 -0
  132. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/dummy.py +0 -0
  133. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_basic_pack.py +0 -0
  134. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_feop_base.py +0 -0
  135. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_ibis.py +0 -0
  136. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_ibis_cc.py +0 -0
  137. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_jax_cc.py +0 -0
  138. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_phe.py +0 -0
  139. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_spu.py +0 -0
  140. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_spu_defensive.py +0 -0
  141. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_sql.py +0 -0
  142. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/ops/test_table_tensor_conversion.py +0 -0
  143. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/__init__.py +0 -0
  144. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_cli.py +0 -0
  145. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_driver.py +0 -0
  146. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_server.py +0 -0
  147. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/runtime/test_simulation.py +0 -0
  148. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_mpi.py +0 -0
  149. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_random.py +0 -0
  150. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_smpc.py +0 -0
  151. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/simp/test_sugar.py +0 -0
  152. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/__init__.py +0 -0
  153. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/server_fixtures.py +0 -0
  154. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_func_utils.py +0 -0
  155. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_spu_utils.py +0 -0
  156. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tests/utils/test_table_utils.py +0 -0
  157. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/0_basic.py +0 -0
  158. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/10_analysis.py +0 -0
  159. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/1_condition.py +0 -0
  160. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/2_whileloop.py +0 -0
  161. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/3_device.py +0 -0
  162. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/4_simulation.py +0 -0
  163. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/5_ir_dump.py +0 -0
  164. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/6_advanced.py +0 -0
  165. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/7_stdio.py +0 -0
  166. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/8_phe.py +0 -0
  167. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/9_tee.py +0 -0
  168. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/__init__.py +0 -0
  169. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/pitfalls/late_binding.py +0 -0
  170. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/pitfalls/rand.py +0 -0
  171. {mplang_nightly-0.1.dev182 → mplang_nightly-0.1.dev184}/tutorials/run.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev182
3
+ Version: 0.1.dev184
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -20,6 +20,7 @@ MPLang cluster configuration.
20
20
  from __future__ import annotations
21
21
 
22
22
  from dataclasses import dataclass, field
23
+ from functools import cached_property
23
24
  from typing import Any
24
25
 
25
26
 
@@ -169,6 +170,16 @@ class ClusterSpec:
169
170
  },
170
171
  }
171
172
 
173
+ @cached_property
174
+ def endpoints(self) -> list[str]:
175
+ eps: list[str] = []
176
+ for n in sorted(
177
+ self.nodes.values(),
178
+ key=lambda x: x.rank, # type: ignore[attr-defined]
179
+ ):
180
+ eps.append(n.endpoint)
181
+ return eps
182
+
172
183
  @classmethod
173
184
  def from_dict(cls, config: dict[str, Any]) -> ClusterSpec:
174
185
  """Parses a raw config dictionary and returns a validated ClusterSpec."""
@@ -48,6 +48,10 @@ class ICommunicator(ABC):
48
48
  def recv(self, frm: int, key: str) -> Any:
49
49
  """Receive data from peer with the given key"""
50
50
 
51
+ @abstractmethod
52
+ def onSent(self, frm: int, key: str, data: Any) -> None:
53
+ """Called when a key is sent to self"""
54
+
51
55
 
52
56
  class ICollective(ABC):
53
57
  """Interface for collective communication"""
@@ -29,12 +29,25 @@ from mplang.kernels.value import Value, decode_value, encode_value
29
29
 
30
30
  class HttpCommunicator(CommunicatorBase):
31
31
  def __init__(self, session_name: str, rank: int, endpoints: list[str]):
32
+ # Validate endpoints
33
+ if not endpoints:
34
+ raise ValueError("endpoints cannot be empty")
35
+
36
+ if not all(endpoint for endpoint in endpoints):
37
+ raise ValueError("endpoints cannot contain empty elements")
38
+
32
39
  super().__init__(rank, len(endpoints))
33
40
  self.session_name = session_name
34
- self.endpoints = endpoints
41
+ # Ensure all endpoints have protocol prefix
42
+ self.endpoints = [
43
+ endpoint
44
+ if endpoint.startswith(("http://", "https://"))
45
+ else f"http://{endpoint}"
46
+ for endpoint in endpoints
47
+ ]
35
48
  self._counter = 0
36
49
  logging.info(
37
- f"HttpCommunicator initialized: session={session_name}, rank={rank}, endpoints={endpoints}"
50
+ f"HttpCommunicator initialized: session={session_name}, rank={rank}, endpoints={self.endpoints}"
38
51
  )
39
52
 
40
53
  # override
@@ -31,6 +31,7 @@ from fastapi.responses import JSONResponse
31
31
  from pydantic import BaseModel
32
32
 
33
33
  from mplang.core import IrReader, TableType, TensorType
34
+ from mplang.core.cluster import ClusterSpec
34
35
  from mplang.kernels.base import KernelContext
35
36
  from mplang.kernels.value import Value, decode_value, encode_value
36
37
  from mplang.protos.v1alpha1 import mpir_pb2
@@ -40,6 +41,7 @@ from mplang.runtime.session import (
40
41
  Computation,
41
42
  Session,
42
43
  Symbol,
44
+ create_session_from_spec,
43
45
  )
44
46
 
45
47
  logger = logging.getLogger(__name__)
@@ -260,15 +262,12 @@ def list_session_computations(session_name: str) -> ComputationListResponse:
260
262
  def create_session(session_name: str, request: CreateSessionRequest) -> SessionResponse:
261
263
  validate_name(session_name, "session")
262
264
  # Delegate cluster spec parsing & session construction to resource layer
263
- from mplang.core.cluster import ClusterSpec # local import to avoid cycles
264
265
 
265
266
  if session_name in _sessions:
266
267
  sess = _sessions[session_name]
267
268
  else:
268
269
  spec = ClusterSpec.from_dict(request.cluster_spec)
269
- if len(spec.get_devices_by_kind("SPU")) == 0:
270
- raise InvalidRequestError("No SPU device found in cluster_spec for session")
271
- sess = Session(name=session_name, rank=request.rank, cluster_spec=spec)
270
+ sess = create_session_from_spec(name=session_name, rank=request.rank, spec=spec)
272
271
  _sessions[session_name] = sess
273
272
  return SessionResponse(name=sess.name)
274
273
 
@@ -34,6 +34,8 @@ from urllib.parse import urlparse
34
34
 
35
35
  import spu.libspu as libspu
36
36
 
37
+ from mplang.core.cluster import ClusterSpec
38
+ from mplang.core.comm import ICommunicator
37
39
  from mplang.core.expr.ast import Expr
38
40
  from mplang.core.expr.evaluator import IEvaluator, create_evaluator
39
41
  from mplang.core.mask import Mask
@@ -96,19 +98,25 @@ class SessionState:
96
98
  class Session:
97
99
  """Represents the per-rank execution context.
98
100
 
99
- Immutable config: name, rank, cluster_spec.
101
+ Immutable config: name, rank, cluster_spec, communicator.
100
102
  Derived: node, runtime_info, endpoints, spu_device, spu_mask, protocol/field, is_spu_party.
101
103
  Mutable: state (runtime object, symbols, computations, seeded flag).
104
+
105
+ Note: communicator is assumed to be initialized with cluster spec info (e.g. endpoints).
102
106
  """
103
107
 
104
- def __init__(self, name: str, rank: int, cluster_spec: ClusterSpec):
108
+ def __init__(
109
+ self,
110
+ name: str,
111
+ rank: int,
112
+ cluster_spec: ClusterSpec,
113
+ communicator: ICommunicator,
114
+ ):
105
115
  self.name = name
106
116
  self.rank = rank
107
117
  self.cluster_spec = cluster_spec
108
118
  self.state = SessionState()
109
- self.communicator = HttpCommunicator(
110
- session_name=name, rank=rank, endpoints=self.endpoints
111
- )
119
+ self.communicator = communicator
112
120
 
113
121
  # --- Derived topology ---
114
122
  @cached_property
@@ -119,18 +127,9 @@ class Session:
119
127
  def runtime_info(self) -> RuntimeInfo:
120
128
  return self.node.runtime_info
121
129
 
122
- @cached_property
130
+ @property
123
131
  def endpoints(self) -> list[str]:
124
- eps: list[str] = []
125
- for n in sorted(
126
- self.cluster_spec.nodes.values(),
127
- key=lambda x: x.rank, # type: ignore[attr-defined]
128
- ):
129
- ep = n.endpoint
130
- if not ep.startswith(("http://", "https://")):
131
- ep = f"http://{ep}"
132
- eps.append(ep)
133
- return eps
132
+ return self.cluster_spec.endpoints
134
133
 
135
134
  @cached_property
136
135
  def spu_device(self): # type: ignore
@@ -191,10 +190,11 @@ class Session:
191
190
  if self.is_spu_party:
192
191
  # Build SPU address list across all endpoints for ranks in mask
193
192
  spu_addrs: list[str] = []
194
- for r, addr in enumerate(self.communicator.endpoints):
193
+ for r, addr in enumerate(self.cluster_spec.endpoints):
195
194
  if r in self.spu_mask:
196
- if "//" not in addr:
197
- addr = f"//{addr}"
195
+ # TODO(oeqqwq): addr may contain other schema like grpc://
196
+ if not addr.startswith(("http://", "https://")):
197
+ addr = f"http://{addr}"
198
198
  parsed = urlparse(addr)
199
199
  assert isinstance(parsed.port, int)
200
200
  new_addr = f"{parsed.hostname}:{parsed.port + SPU_PORT_OFFSET}"
@@ -281,12 +281,17 @@ class Session:
281
281
  )
282
282
  self.add_symbol(Symbol(name=name, mptype={}, data=val))
283
283
 
284
- # --- Convenience constructor ---
285
- @classmethod
286
- def from_cluster_spec_dict(cls, name: str, rank: int, spec_dict: dict) -> Session:
287
- from mplang.core.cluster import ClusterSpec # local import to avoid cycles
288
284
 
289
- spec = ClusterSpec.from_dict(spec_dict)
290
- if len(spec.get_devices_by_kind("SPU")) == 0:
291
- raise RuntimeError("No SPU device found in cluster_spec")
292
- return cls(name=name, rank=rank, cluster_spec=spec)
285
+ # --- Convenience constructor use HttpCommunicator---
286
+ def create_session_from_spec(name: str, rank: int, spec: ClusterSpec) -> Session:
287
+ if len(spec.get_devices_by_kind("SPU")) == 0:
288
+ raise RuntimeError("No SPU device found in cluster_spec")
289
+
290
+ # Create HttpCommunicator for the session
291
+ communicator = HttpCommunicator(
292
+ session_name=name,
293
+ rank=rank,
294
+ endpoints=spec.endpoints,
295
+ )
296
+
297
+ return Session(name=name, rank=rank, cluster_spec=spec, communicator=communicator)
@@ -24,7 +24,7 @@ import uvicorn
24
24
  from mplang.core.cluster import ClusterSpec
25
25
  from mplang.runtime.communicator import HttpCommunicator
26
26
  from mplang.runtime.server import app, register_session
27
- from mplang.runtime.session import Session
27
+ from mplang.runtime.session import create_session_from_spec
28
28
  from tests.utils.server_fixtures import http_servers # noqa: F401 (fixture)
29
29
 
30
30
 
@@ -194,10 +194,12 @@ def run_party_e2e_process(
194
194
  runtime_version="test",
195
195
  runtime_platform="test",
196
196
  ).to_dict()
197
- sess = Session.from_cluster_spec_dict(
197
+ # Create ClusterSpec from dict, then create session
198
+ cluster_spec = ClusterSpec.from_dict(cluster_spec_dict)
199
+ sess = create_session_from_spec(
198
200
  name=session_name,
199
201
  rank=rank,
200
- spec_dict=cluster_spec_dict,
202
+ spec=cluster_spec,
201
203
  )
202
204
  register_session(sess)
203
205