mplang-nightly 0.1.dev180__tar.gz → 0.1.dev182__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.dev180 → mplang_nightly-0.1.dev182}/PKG-INFO +2 -2
  2. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/README.md +1 -1
  3. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/primitive.py +1 -1
  4. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/host.py +32 -0
  5. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/mpi.py +2 -2
  6. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/test_communicator.py +14 -4
  7. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/.gitignore +0 -0
  8. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/LICENSE +0 -0
  9. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/conf/3pc.yaml +0 -0
  10. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/stax_nn/README.md +0 -0
  11. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/stax_nn/models.py +0 -0
  12. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/stax_nn/stax_nn.py +0 -0
  13. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/hist_jax.py +0 -0
  14. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/hist_jax_test.py +0 -0
  15. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/naive_np.py +0 -0
  16. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/readme.md +0 -0
  17. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/sgb.py +0 -0
  18. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/examples/xgboost/sgb_test.py +0 -0
  19. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/hatch_build.py +0 -0
  20. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/__init__.py +0 -0
  21. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/analysis/__init__.py +0 -0
  22. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/analysis/diagram.py +0 -0
  23. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/__init__.py +0 -0
  24. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/cluster.py +0 -0
  25. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/comm.py +0 -0
  26. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/context_mgr.py +0 -0
  27. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/dtypes.py +0 -0
  28. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/__init__.py +0 -0
  29. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/ast.py +0 -0
  30. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/evaluator.py +0 -0
  31. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/printer.py +0 -0
  32. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/transformer.py +0 -0
  33. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/utils.py +0 -0
  34. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/visitor.py +0 -0
  35. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/expr/walk.py +0 -0
  36. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/interp.py +0 -0
  37. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/mask.py +0 -0
  38. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/mpir.py +0 -0
  39. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/mpobject.py +0 -0
  40. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/mptype.py +0 -0
  41. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/pfunc.py +0 -0
  42. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/table.py +0 -0
  43. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/tensor.py +0 -0
  44. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/core/tracer.py +0 -0
  45. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/device.py +0 -0
  46. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/__init__.py +0 -0
  47. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/base.py +0 -0
  48. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/basic.py +0 -0
  49. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/context.py +0 -0
  50. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/crypto.py +0 -0
  51. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/mock_tee.py +0 -0
  52. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/phe.py +0 -0
  53. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/spu.py +0 -0
  54. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/sql_duckdb.py +0 -0
  55. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/stablehlo.py +0 -0
  56. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/kernels/value.py +0 -0
  57. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/__init__.py +0 -0
  58. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/base.py +0 -0
  59. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/basic.py +0 -0
  60. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/crypto.py +0 -0
  61. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/ibis_cc.py +0 -0
  62. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/jax_cc.py +0 -0
  63. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/phe.py +0 -0
  64. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/spu.py +0 -0
  65. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/sql_cc.py +0 -0
  66. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/ops/tee.py +0 -0
  67. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/protos/v1alpha1/mpir_pb2.py +0 -0
  68. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/protos/v1alpha1/mpir_pb2.pyi +0 -0
  69. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/protos/v1alpha1/value_pb2.py +0 -0
  70. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/protos/v1alpha1/value_pb2.pyi +0 -0
  71. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/__init__.py +0 -0
  72. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/cli.py +0 -0
  73. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/client.py +0 -0
  74. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/communicator.py +0 -0
  75. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/data_providers.py +0 -0
  76. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/driver.py +0 -0
  77. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/exceptions.py +0 -0
  78. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/http_api.md +0 -0
  79. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/link_comm.py +0 -0
  80. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/server.py +0 -0
  81. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/session.py +0 -0
  82. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/runtime/simulation.py +0 -0
  83. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/__init__.py +0 -0
  84. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/api.py +0 -0
  85. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/party.py +0 -0
  86. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/random.py +0 -0
  87. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/simp/smpc.py +0 -0
  88. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/utils/__init__.py +0 -0
  89. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/utils/crypto.py +0 -0
  90. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/utils/func_utils.py +0 -0
  91. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/utils/spu_utils.py +0 -0
  92. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/mplang/utils/table_utils.py +0 -0
  93. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/pyproject.toml +0 -0
  94. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/analysis/test_diagram.py +0 -0
  96. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/conftest.py +0 -0
  97. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/__init__.py +0 -0
  98. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/__init__.py +0 -0
  99. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/conftest.py +0 -0
  100. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/test_ast.py +0 -0
  101. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/test_printer.py +0 -0
  102. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/test_utils.py +0 -0
  103. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/expr/test_walk.py +0 -0
  104. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_cluster.py +0 -0
  105. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_dtype.py +0 -0
  106. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_mask.py +0 -0
  107. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_mpir.py +0 -0
  108. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_mptype.py +0 -0
  109. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_primitive.py +0 -0
  110. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_table.py +0 -0
  111. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_tensor.py +0 -0
  112. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/core/test_tracer.py +0 -0
  113. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/device/__init__.py +0 -0
  114. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/device/test_device_basic.py +0 -0
  115. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/README.md +0 -0
  116. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_crypto_roundtrip.py +0 -0
  117. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_http_e2e.py +0 -0
  118. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_symbols_roundtrip.py +0 -0
  119. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_tee_workflow.py +0 -0
  120. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_tutorials.py +0 -0
  121. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/integration/test_unused_param_integration.py +0 -0
  122. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_basic.py +0 -0
  123. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_debug_print.py +0 -0
  124. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_kernel_binding.py +0 -0
  125. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_phe.py +0 -0
  126. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_spu.py +0 -0
  127. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_sql_duckdb.py +0 -0
  128. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_stablehlo.py +0 -0
  129. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_value.py +0 -0
  130. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/kernels/test_value_serde.py +0 -0
  131. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/__init__.py +0 -0
  132. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/dummy.py +0 -0
  133. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_basic_pack.py +0 -0
  134. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_feop_base.py +0 -0
  135. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_ibis.py +0 -0
  136. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_ibis_cc.py +0 -0
  137. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_jax_cc.py +0 -0
  138. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_phe.py +0 -0
  139. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_spu.py +0 -0
  140. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_spu_defensive.py +0 -0
  141. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_sql.py +0 -0
  142. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/ops/test_table_tensor_conversion.py +0 -0
  143. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/__init__.py +0 -0
  144. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/test_cli.py +0 -0
  145. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/test_driver.py +0 -0
  146. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/test_server.py +0 -0
  147. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/runtime/test_simulation.py +0 -0
  148. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/simp/test_mpi.py +0 -0
  149. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/simp/test_random.py +0 -0
  150. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/simp/test_smpc.py +0 -0
  151. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/simp/test_sugar.py +0 -0
  152. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/utils/__init__.py +0 -0
  153. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/utils/server_fixtures.py +0 -0
  154. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/utils/test_func_utils.py +0 -0
  155. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/utils/test_spu_utils.py +0 -0
  156. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tests/utils/test_table_utils.py +0 -0
  157. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/0_basic.py +0 -0
  158. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/10_analysis.py +0 -0
  159. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/1_condition.py +0 -0
  160. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/2_whileloop.py +0 -0
  161. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/3_device.py +0 -0
  162. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/4_simulation.py +0 -0
  163. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/5_ir_dump.py +0 -0
  164. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/6_advanced.py +0 -0
  165. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/7_stdio.py +0 -0
  166. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/8_phe.py +0 -0
  167. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/9_tee.py +0 -0
  168. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/__init__.py +0 -0
  169. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/pitfalls/late_binding.py +0 -0
  170. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/pitfalls/rand.py +0 -0
  171. {mplang_nightly-0.1.dev180 → mplang_nightly-0.1.dev182}/tutorials/run.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev180
3
+ Version: 0.1.dev182
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -277,7 +277,7 @@ sim = mplang.Simulator.simple(2)
277
277
  result = mplang.evaluate(sim, millionaire)
278
278
 
279
279
  # Securely fetch the result (reveals SPU value)
280
- print("Is Alice poorer than Bob?", mpd.fetch(sim, result))
280
+ print("Is Alice poorer than Bob?", mplang.fetch(sim, result))
281
281
  ```
282
282
 
283
283
  ## Learn More
@@ -57,7 +57,7 @@ sim = mplang.Simulator.simple(2)
57
57
  result = mplang.evaluate(sim, millionaire)
58
58
 
59
59
  # Securely fetch the result (reveals SPU value)
60
- print("Is Alice poorer than Bob?", mpd.fetch(sim, result))
60
+ print("Is Alice poorer than Bob?", mplang.fetch(sim, result))
61
61
  ```
62
62
 
63
63
  ## Learn More
@@ -718,7 +718,7 @@ def pshfl(src: MPObject, index: MPObject) -> MPObject:
718
718
 
719
719
  Raises:
720
720
  ValueError: If the index tensor is not a scalar.
721
- RuntimeError: If src[index[i]] is None for any valid index[i] (i.e/,
721
+ RuntimeError: If src[index[i]] is None for any valid index[i] (i.e.,
722
722
  trying to fetch from a party that doesn't hold the data).
723
723
 
724
724
  Examples:
@@ -38,6 +38,16 @@ def evaluate(
38
38
 
39
39
  This function accepts arbitrary types as it's designed to handle
40
40
  any multi-party computation function and arguments.
41
+
42
+ Args:
43
+ interp: The interpreter context for evaluating the multi-party function.
44
+ mpfn: The multi-party function to evaluate.
45
+ *args: Positional arguments to pass to the function.
46
+ **kwargs: Keyword arguments to pass to the function.
47
+
48
+ Returns:
49
+ Any: The result of evaluating the multi-party function, which can be
50
+ any type depending on the function's return type.
41
51
  """
42
52
  assert isinstance(interp, InterpContext), f"Expect InterpContext, got {interp}"
43
53
  with with_ctx(interp):
@@ -49,6 +59,16 @@ def fetch(interp: InterpContext | None, objs: Any) -> Any: # type: ignore[misc]
49
59
 
50
60
  This function uses tree_map to handle arbitrary nested structures,
51
61
  so it needs to accept and return Any type.
62
+
63
+ Args:
64
+ interp: The interpreter context for fetching results. If None, uses the
65
+ current context from cur_ctx().
66
+ objs: The objects containing MPObject instances to fetch. Can be any
67
+ nested structure.
68
+
69
+ Returns:
70
+ Any: The fetched results with the same structure as the input objects,
71
+ but with MPObject instances replaced by their computed values.
52
72
  """
53
73
  ctx = interp or cur_ctx()
54
74
  assert isinstance(ctx, InterpContext), f"Expect MPExecutor, got {ctx}"
@@ -94,5 +114,17 @@ class CompileOptions(MPContext):
94
114
  def compile(
95
115
  mctx: MPContext, fn: Callable[..., Any], *args: Any, **kwargs: Any
96
116
  ) -> TracedFunction:
117
+ """Compile a multi-party function into a TracedFunction.
118
+
119
+ Args:
120
+ mctx: The multi-party context for compilation.
121
+ fn: The function to compile.
122
+ *args: Positional arguments to pass during compilation.
123
+ **kwargs: Keyword arguments to pass during compilation.
124
+
125
+ Returns:
126
+ TracedFunction: The compiled function representation that can be
127
+ evaluated in multi-party contexts.
128
+ """
97
129
  trace_ctx = TraceContext(mctx.cluster_spec)
98
130
  return trace(trace_ctx, fn, *args, **kwargs)
@@ -57,9 +57,9 @@ def gather_m(src_mask: Mask, root: Rank, arg: MPObject) -> list[MPObject]:
57
57
  """Gather the object from pmask'ed parties to the root party.
58
58
 
59
59
  Args:
60
- src_pmask: The mask of the parties that will gather the object.
60
+ src_mask: The mask of the parties that will gather the object.
61
61
  root: The rank of the root party.
62
- arg: The object to be gathered, which must be the subset of pmask.
62
+ arg: The object to be gathered. It must be held by all parties specified in `src_mask`.
63
63
 
64
64
  Returns:
65
65
  A list of objects, with length equal to the number of parties in pmask.
@@ -150,7 +150,9 @@ def test_communicator_properties(http_servers): # noqa: F811
150
150
  assert id1 != id2 # Should generate unique IDs
151
151
 
152
152
 
153
- def run_party_e2e_process(rank: int, return_dict: dict, assigned_ports: dict):
153
+ def run_party_e2e_process(
154
+ rank: int, return_dict: dict, assigned_ports: dict, barrier: multiprocessing.Barrier
155
+ ):
154
156
  """
155
157
  Run a complete party process with server and communication logic.
156
158
  This is the proper single-process-per-party architecture.
@@ -247,6 +249,8 @@ def run_party_e2e_process(rank: int, return_dict: dict, assigned_ports: dict):
247
249
  if not server_ready:
248
250
  raise RuntimeError("Server failed to start within timeout")
249
251
 
252
+ barrier.wait(timeout=30) # Synchronize with other parties
253
+
250
254
  # Run party-specific communication logic
251
255
  if rank == 0:
252
256
  # Party 0: Send message to Party 1
@@ -309,15 +313,21 @@ def test_end_to_end_communication():
309
313
  assigned_ports[0] = p0
310
314
  assigned_ports[1] = p1
311
315
 
316
+ worlds = [0, 1]
317
+ barrier = mp_ctx.Barrier(len(worlds) + 1) # size(parties) + main process
318
+
312
319
  # Start both party processes
313
320
  processes = []
314
- for rank in [0, 1]:
321
+ for rank in worlds:
315
322
  process = mp_ctx.Process(
316
- target=run_party_e2e_process, args=(rank, return_dict, assigned_ports)
323
+ target=run_party_e2e_process,
324
+ args=(rank, return_dict, assigned_ports, barrier),
317
325
  )
318
326
  process.start()
319
327
  processes.append(process)
320
328
 
329
+ barrier.wait(timeout=30) # Wait for both parties to be ready
330
+
321
331
  # Wait for both processes to complete
322
332
  for process in processes:
323
333
  process.join(timeout=30)
@@ -328,7 +338,7 @@ def test_end_to_end_communication():
328
338
  process.kill()
329
339
 
330
340
  # Validate results
331
- for rank in [0, 1]:
341
+ for rank in worlds:
332
342
  assert rank in return_dict, f"Party {rank} did not complete"
333
343
  result = return_dict[rank]
334
344
  assert result.get("status") == "success", f"Party {rank} failed: {result}"