mplang-nightly 0.1.dev278__tar.gz → 0.1.dev280__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 (216) hide show
  1. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/PKG-INFO +1 -1
  2. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/__init__.py +32 -8
  3. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/channel.py +1 -1
  4. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/http.py +1 -1
  5. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_worker/http.py +8 -5
  6. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/spu_impl.py +1 -1
  7. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/table_impl.py +1 -1
  8. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/tensor_impl.py +1 -1
  9. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/cli.py +1 -1
  10. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/__init__.py +3 -0
  11. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/jit.py +1 -1
  12. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/primitive.py +1 -1
  13. mplang_nightly-0.1.dev280/mplang/edsl/program.py +134 -0
  14. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/tracer.py +1 -1
  15. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/device/api.py +1 -1
  16. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/runtime/interpreter.py +1 -1
  17. mplang_nightly-0.1.dev280/mplang/tool/__init__.py +46 -0
  18. mplang_nightly-0.1.dev280/mplang/tool/program.py +335 -0
  19. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/utils/__init__.py +4 -0
  20. mplang_nightly-0.1.dev278/mplang/logging_config.py → mplang_nightly-0.1.dev280/mplang/utils/logging.py +6 -19
  21. mplang_nightly-0.1.dev280/tests/edsl/test_compiled_program_artifact.py +191 -0
  22. {mplang_nightly-0.1.dev278/tests → mplang_nightly-0.1.dev280/tests/utils}/test_logging.py +3 -3
  23. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/04_ir_dump_and_analysis.py +37 -0
  24. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/.gitignore +0 -0
  25. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/LICENSE +0 -0
  26. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/README.md +0 -0
  27. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/examples/.gitkeep +0 -0
  28. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/hatch_build.py +0 -0
  29. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/__init__.py +0 -0
  30. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/bfv_impl.py +0 -0
  31. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/crypto_impl.py +0 -0
  32. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/field_impl.py +0 -0
  33. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/func_impl.py +0 -0
  34. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/phe_impl.py +0 -0
  35. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_design.md +0 -0
  36. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/__init__.py +0 -0
  37. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/mem.py +0 -0
  38. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/ops.py +0 -0
  39. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/state.py +0 -0
  40. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_driver/values.py +0 -0
  41. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_worker/__init__.py +0 -0
  42. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_worker/mem.py +0 -0
  43. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_worker/ops.py +0 -0
  44. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/simp_worker/state.py +0 -0
  45. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/spu_state.py +0 -0
  46. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/store_impl.py +0 -0
  47. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/backends/tee_impl.py +0 -0
  48. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/cli_guide.md +0 -0
  49. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/__init__.py +0 -0
  50. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/bfv.py +0 -0
  51. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/crypto.py +0 -0
  52. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/dtypes.py +0 -0
  53. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/field.py +0 -0
  54. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/func.py +0 -0
  55. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/phe.py +0 -0
  56. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/simp.py +0 -0
  57. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/spu.py +0 -0
  58. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/store.py +0 -0
  59. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/table.py +0 -0
  60. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/tee.py +0 -0
  61. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/dialects/tensor.py +0 -0
  62. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/README.md +0 -0
  63. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/context.py +0 -0
  64. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/graph.py +0 -0
  65. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/object.py +0 -0
  66. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/printer.py +0 -0
  67. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/registry.py +0 -0
  68. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/serde.py +0 -0
  69. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/edsl/typing.py +0 -0
  70. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/Makefile +0 -0
  71. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/__init__.py +0 -0
  72. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/gf128.cpp +0 -0
  73. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/ldpc.cpp +0 -0
  74. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/okvs.cpp +0 -0
  75. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/okvs_opt.cpp +0 -0
  76. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/kernels/py_kernels.py +0 -0
  77. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/collective.py +0 -0
  78. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/device/__init__.py +0 -0
  79. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/device/cluster.py +0 -0
  80. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/ml/__init__.py +0 -0
  81. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/ml/sgb.py +0 -0
  82. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/__init__.py +0 -0
  83. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/_utils.py +0 -0
  84. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/analytics/__init__.py +0 -0
  85. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/analytics/aggregation.py +0 -0
  86. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/analytics/groupby.md +0 -0
  87. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/analytics/groupby.py +0 -0
  88. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/analytics/permutation.py +0 -0
  89. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/common/constants.py +0 -0
  90. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/ot/__init__.py +0 -0
  91. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/ot/base.py +0 -0
  92. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/ot/extension.py +0 -0
  93. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/ot/silent.py +0 -0
  94. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/__init__.py +0 -0
  95. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/cuckoo.py +0 -0
  96. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/okvs.py +0 -0
  97. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/okvs_gct.py +0 -0
  98. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/oprf.py +0 -0
  99. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/rr22.py +0 -0
  100. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/psi/unbalanced.py +0 -0
  101. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/vole/__init__.py +0 -0
  102. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/vole/gilboa.py +0 -0
  103. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/vole/ldpc.py +0 -0
  104. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/libs/mpc/vole/silver.py +0 -0
  105. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/py.typed +0 -0
  106. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/runtime/__init__.py +0 -0
  107. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/runtime/dialect_state.py +0 -0
  108. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/runtime/object_store.py +0 -0
  109. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/runtime/value.py +0 -0
  110. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/mplang/utils/func_utils.py +0 -0
  111. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/pyproject.toml +0 -0
  112. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/__init__.py +0 -0
  113. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/__init__.py +0 -0
  114. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_driver/__init__.py +0 -0
  115. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_driver/test_http.py +0 -0
  116. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_worker/__init__.py +0 -0
  117. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_worker/test_http.py +0 -0
  118. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_worker/test_mem.py +0 -0
  119. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/simp_worker/test_shuffle_exec_id_key.py +0 -0
  120. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_bfv_impl.py +0 -0
  121. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_channel.py +0 -0
  122. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_crypto_impl.py +0 -0
  123. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_okvs_binding.py +0 -0
  124. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_simp_integration.py +0 -0
  125. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_simp_object_store.py +0 -0
  126. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_spu_impl.py +0 -0
  127. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_table_impl.py +0 -0
  128. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_tee_impl.py +0 -0
  129. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_tensor_impl.py +0 -0
  130. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/backends/test_verify_clean.py +0 -0
  131. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/conftest.py +0 -0
  132. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/__init__.py +0 -0
  133. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_bfv.py +0 -0
  134. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_crypto.py +0 -0
  135. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_dtypes.py +0 -0
  136. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_field.py +0 -0
  137. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_func.py +0 -0
  138. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_okvs.py +0 -0
  139. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_okvs_bench.py +0 -0
  140. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_phe.py +0 -0
  141. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_simp.py +0 -0
  142. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_simp_comm.py +0 -0
  143. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_spu.py +0 -0
  144. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_store.py +0 -0
  145. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_table.py +0 -0
  146. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_tee.py +0 -0
  147. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/dialects/test_tensor.py +0 -0
  148. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/__init__.py +0 -0
  149. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_context.py +0 -0
  150. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_graph.py +0 -0
  151. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_primitive.py +0 -0
  152. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_primitive_multi_output.py +0 -0
  153. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_printer.py +0 -0
  154. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_serde.py +0 -0
  155. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_tracer.py +0 -0
  156. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_typing.py +0 -0
  157. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/edsl/test_typing_graph_serde.py +0 -0
  158. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/__init__.py +0 -0
  159. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/conftest.py +0 -0
  160. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/test_device_api_errors.py +0 -0
  161. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/test_device_dialects.py +0 -0
  162. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/test_device_layouts.py +0 -0
  163. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/device/test_device_tee.py +0 -0
  164. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/ml/__init__.py +0 -0
  165. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/ml/test_sgb.py +0 -0
  166. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/ml/test_sgb_bench.py +0 -0
  167. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/__init__.py +0 -0
  168. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/analytics/__init__.py +0 -0
  169. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/analytics/test_aggregation.py +0 -0
  170. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/analytics/test_groupby.py +0 -0
  171. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/analytics/test_permutation.py +0 -0
  172. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/ot/__init__.py +0 -0
  173. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/ot/test_ot.py +0 -0
  174. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/ot/test_ot_extension.py +0 -0
  175. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/ot/test_silent_ot.py +0 -0
  176. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/__init__.py +0 -0
  177. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/test_okvs_gct.py +0 -0
  178. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/test_oprf.py +0 -0
  179. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/test_psi.py +0 -0
  180. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/test_psi_bench.py +0 -0
  181. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/test_rr22.py +0 -0
  182. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/psi/verify_psi_okvs_logic.py +0 -0
  183. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/test_field_gf128.py +0 -0
  184. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/test_utils.py +0 -0
  185. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/__init__.py +0 -0
  186. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/test_gilboa_manual.py +0 -0
  187. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/test_ldpc.py +0 -0
  188. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/test_silver_vole.py +0 -0
  189. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/test_vole.py +0 -0
  190. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/test_vole_bench.py +0 -0
  191. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/mpc/vole/verify_vole_logic.py +0 -0
  192. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/test_collective.py +0 -0
  193. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/libs/test_simple_guide.py +0 -0
  194. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/runtime/test_interpreter_async.py +0 -0
  195. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/runtime/test_object_store.py +0 -0
  196. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/runtime/test_object_store_fs.py +0 -0
  197. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/test_fetch_semantics.py +0 -0
  198. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/test_pytree_io.py +0 -0
  199. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/utils/__init__.py +0 -0
  200. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/utils/tensor_patch.py +0 -0
  201. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tests/utils/test_func_utils.py +0 -0
  202. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/00_device_basics.py +0 -0
  203. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/01_function_decorator.py +0 -0
  204. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/02_simulation_and_driver.py +0 -0
  205. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/03_run_jax.py +0 -0
  206. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/05_run_sql.py +0 -0
  207. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/06_pipeline.py +0 -0
  208. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/07_stax_nn.py +0 -0
  209. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/08_logging.py +0 -0
  210. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/MIGRATION.md +0 -0
  211. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/README.md +0 -0
  212. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/__init__.py +0 -0
  213. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/data/alice.csv +0 -0
  214. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/data/bob.csv +0 -0
  215. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/data/prepare_vertical_iris.py +0 -0
  216. {mplang_nightly-0.1.dev278 → mplang_nightly-0.1.dev280}/tutorials/run.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev278
3
+ Version: 0.1.dev280
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -34,6 +34,7 @@ except Exception:
34
34
  # Fallback for development/editable installs when package is not installed
35
35
  __version__ = "0.0.0-dev"
36
36
 
37
+ import mplang.tool as tool
37
38
  from mplang import dialects
38
39
  from mplang.backends.simp_driver.ops import DRIVER_HANDLERS
39
40
  from mplang.backends.simp_worker import SimpWorker
@@ -41,6 +42,8 @@ from mplang.backends.simp_worker.mem import LocalMesh
41
42
  from mplang.backends.simp_worker.ops import WORKER_HANDLERS
42
43
  from mplang.dialects.simp import make_driver, make_simulator
43
44
  from mplang.edsl import (
45
+ CompiledProgram,
46
+ FlatIOSignature,
44
47
  Graph,
45
48
  GraphPrinter,
46
49
  Object,
@@ -91,10 +94,10 @@ from mplang.libs.device import (
91
94
  set_dev_attr,
92
95
  )
93
96
  from mplang.libs.device import fetch as device_fetch
97
+ from mplang.runtime.interpreter import Interpreter
94
98
 
95
99
  # Logging configuration
96
- from mplang.logging_config import disable_logging, get_logger, setup_logging
97
- from mplang.runtime.interpreter import Interpreter
100
+ from mplang.utils.logging import disable_logging, get_logger, setup_logging
98
101
 
99
102
  # =============================================================================
100
103
  # Context Management API (JAX-like pattern)
@@ -125,7 +128,7 @@ def _get_context(context: Interpreter | None) -> Interpreter:
125
128
 
126
129
 
127
130
  def evaluate(
128
- fn: Callable[..., Any] | TracedFunction,
131
+ fn: Callable[..., Any] | TracedFunction | CompiledProgram,
129
132
  *args: Any,
130
133
  context: Interpreter | None = None,
131
134
  **kwargs: Any,
@@ -158,15 +161,33 @@ def evaluate(
158
161
  return val.runtime_obj
159
162
  return val
160
163
 
164
+ def eval_graph(graph: Graph, inputs: list[Any]) -> list[InterpObject]:
165
+ runtime_inputs = [unwrap_if_interp(v) for v in inputs]
166
+ raw_result = interp.evaluate_graph(graph, runtime_inputs)
167
+ return [
168
+ InterpObject(v, graph.outputs[i].type, interp)
169
+ for i, v in enumerate(raw_result)
170
+ ]
171
+
161
172
  with interp:
173
+ if isinstance(fn, CompiledProgram):
174
+ if kwargs:
175
+ raise TypeError(
176
+ "mp.evaluate(CompiledProgram, ...) does not accept keyword arguments; "
177
+ "pass flat positional inputs only."
178
+ )
179
+ if len(args) != fn.signature.input_arity:
180
+ raise ValueError(
181
+ "CompiledProgram requires flat positional inputs matching its signature; "
182
+ f"expected {fn.signature.input_arity}, got {len(args)}."
183
+ )
184
+
185
+ return eval_graph(fn.graph, list(args))
186
+
162
187
  if isinstance(fn, TracedFunction):
163
188
  inputs = fn.prepare_inputs(*args, **kwargs)
164
189
  inputs = [unwrap_if_interp(v) for v in inputs]
165
- raw_result = interp.evaluate_graph(fn.graph, inputs)
166
- wrapped = [
167
- InterpObject(v, fn.graph.outputs[i].type, interp)
168
- for i, v in enumerate(raw_result)
169
- ]
190
+ wrapped = eval_graph(fn.graph, inputs)
170
191
  return fn.reconstruct_outputs(wrapped)
171
192
 
172
193
  return fn(*args, **kwargs)
@@ -417,6 +438,9 @@ __all__ = [ # noqa: RUF022
417
438
  "WORKER_HANDLERS",
418
439
  "make_driver",
419
440
  "make_simulator",
441
+ "tool",
442
+ "CompiledProgram",
443
+ "FlatIOSignature",
420
444
  # Dialects
421
445
  "dialects",
422
446
  "register_default_context_factory",
@@ -25,7 +25,7 @@ from typing import Protocol
25
25
 
26
26
  import spu.libspu as libspu
27
27
 
28
- from mplang.logging_config import get_logger
28
+ from mplang.utils.logging import get_logger
29
29
 
30
30
  logger = get_logger(__name__)
31
31
 
@@ -25,9 +25,9 @@ import httpx
25
25
 
26
26
  from mplang.backends.simp_driver.state import SimpDriver
27
27
  from mplang.edsl import serde
28
- from mplang.logging_config import get_logger
29
28
  from mplang.runtime.interpreter import Interpreter
30
29
  from mplang.runtime.object_store import ObjectStore
30
+ from mplang.utils.logging import get_logger
31
31
 
32
32
  logger = get_logger(__name__)
33
33
 
@@ -54,9 +54,9 @@ from mplang.backends.simp_worker import SimpWorker
54
54
  from mplang.backends.simp_worker import ops as _simp_worker_ops # noqa: F401
55
55
  from mplang.edsl import serde
56
56
  from mplang.edsl.graph import Graph
57
- from mplang.logging_config import get_logger
58
57
  from mplang.runtime.interpreter import ExecutionTracer, Interpreter
59
58
  from mplang.runtime.object_store import ObjectStore
59
+ from mplang.utils.logging import get_logger
60
60
 
61
61
  logger = get_logger(__name__)
62
62
 
@@ -212,6 +212,7 @@ def create_worker_app(
212
212
  world_size: int,
213
213
  endpoints: list[str],
214
214
  spu_endpoints: dict[int, str] | None = None,
215
+ enable_tracing: bool = False,
215
216
  ) -> FastAPI:
216
217
  """Create a FastAPI app for the worker.
217
218
 
@@ -224,6 +225,7 @@ def create_worker_app(
224
225
  world_size: Total number of workers.
225
226
  endpoints: HTTP endpoints for all workers (for shuffle communication).
226
227
  spu_endpoints: Optional dict mapping global_rank -> BRPC endpoint for SPU.
228
+ enable_tracing: Whether to enable execution tracing for profiler.
227
229
 
228
230
  Returns:
229
231
  FastAPI application instance
@@ -236,11 +238,12 @@ def create_worker_app(
236
238
  data_root = pathlib.Path(os.environ.get("MPLANG_DATA_ROOT", ".mpl"))
237
239
  cluster_id = os.environ.get("MPLANG_CLUSTER_ID", f"__http_{world_size}")
238
240
  root_dir = data_root / cluster_id / f"node{rank}"
239
- trace_dir = root_dir / "trace"
240
241
 
241
- # Enable tracing by default for now (or make it configurable via env)
242
- tracer = ExecutionTracer(enabled=True, trace_dir=trace_dir)
243
- tracer.start()
242
+ tracer = None
243
+ if enable_tracing:
244
+ trace_dir = root_dir / "trace"
245
+ tracer = ExecutionTracer(enabled=True, trace_dir=trace_dir)
246
+ tracer.start()
244
247
 
245
248
  comm = HttpCommunicator(rank, world_size, endpoints, tracer=tracer)
246
249
  store = ObjectStore(fs_root=str(root_dir))
@@ -31,9 +31,9 @@ from mplang.backends.tensor_impl import TensorValue
31
31
  from mplang.dialects import spu
32
32
  from mplang.edsl import serde
33
33
  from mplang.edsl.graph import Operation
34
- from mplang.logging_config import get_logger
35
34
  from mplang.runtime.interpreter import Interpreter
36
35
  from mplang.runtime.value import WrapValue
36
+ from mplang.utils.logging import get_logger
37
37
 
38
38
  logger = get_logger(__name__)
39
39
 
@@ -33,9 +33,9 @@ from mplang.backends.tensor_impl import TensorValue
33
33
  from mplang.dialects import table
34
34
  from mplang.edsl import serde
35
35
  from mplang.edsl.graph import Operation
36
- from mplang.logging_config import get_logger
37
36
  from mplang.runtime.interpreter import Interpreter
38
37
  from mplang.runtime.value import WrapValue
38
+ from mplang.utils.logging import get_logger
39
39
 
40
40
  logger = get_logger(__name__)
41
41
 
@@ -36,9 +36,9 @@ import mplang.edsl.typing as elt
36
36
  from mplang.dialects import dtypes, tensor
37
37
  from mplang.edsl import serde
38
38
  from mplang.edsl.graph import Operation
39
- from mplang.logging_config import get_logger
40
39
  from mplang.runtime.interpreter import Interpreter
41
40
  from mplang.runtime.value import Value, WrapValue
41
+ from mplang.utils.logging import get_logger
42
42
 
43
43
  logger = get_logger(__name__)
44
44
 
@@ -49,7 +49,7 @@ from typing import Any, cast
49
49
  import uvicorn
50
50
  import yaml
51
51
 
52
- from mplang.logging_config import get_logger
52
+ from mplang.utils.logging import get_logger
53
53
 
54
54
  logger = get_logger(__name__)
55
55
 
@@ -53,6 +53,7 @@ from .jit import jit
53
53
  from .object import Object
54
54
  from .primitive import Primitive, primitive
55
55
  from .printer import GraphPrinter, format_graph
56
+ from .program import CompiledProgram, FlatIOSignature
56
57
  from .tracer import TracedFunction, TraceObject, Tracer, trace
57
58
  from .typing import MPType, ScalarType, SSType, TableType, TensorType, VectorType
58
59
 
@@ -65,7 +66,9 @@ TensorObject = Object[TensorType]
65
66
  VectorObject = Object[VectorType]
66
67
 
67
68
  __all__ = [
69
+ "CompiledProgram",
68
70
  "Context",
71
+ "FlatIOSignature",
69
72
  "Graph",
70
73
  "GraphPrinter",
71
74
  "MPObject",
@@ -25,7 +25,7 @@ from mplang.edsl.context import (
25
25
  get_default_context,
26
26
  )
27
27
  from mplang.edsl.tracer import Tracer
28
- from mplang.logging_config import get_logger
28
+ from mplang.utils.logging import get_logger
29
29
 
30
30
  logger = get_logger(__name__)
31
31
 
@@ -29,7 +29,7 @@ from jax.tree_util import tree_map
29
29
 
30
30
  from mplang.edsl.context import get_current_context, get_default_context
31
31
  from mplang.edsl.object import Object
32
- from mplang.logging_config import get_logger
32
+ from mplang.utils.logging import get_logger
33
33
 
34
34
  if TYPE_CHECKING:
35
35
  from mplang.edsl.typing import BaseType
@@ -0,0 +1,134 @@
1
+ # Copyright 2026 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 hashlib
18
+ import json
19
+ from dataclasses import dataclass
20
+ from typing import Any, ClassVar
21
+
22
+ from mplang.edsl import serde
23
+ from mplang.edsl.graph import Graph
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class FlatIOSignature:
28
+ """Portable I/O signature for source-free execution.
29
+
30
+ Only supports flat positional inputs/outputs corresponding to
31
+ `graph.inputs` / `graph.outputs`.
32
+ """
33
+
34
+ kind: ClassVar[str] = "flat_list_v0"
35
+ input_arity: int
36
+ output_arity: int
37
+
38
+ def to_json(self) -> dict[str, Any]:
39
+ return {
40
+ "kind": self.kind,
41
+ "input_arity": self.input_arity,
42
+ "output_arity": self.output_arity,
43
+ }
44
+
45
+ @classmethod
46
+ def from_json(cls, data: dict[str, Any]) -> FlatIOSignature:
47
+ if data.get("kind") != cls.kind:
48
+ raise ValueError(f"Unsupported signature kind: {data.get('kind')}")
49
+ return cls(
50
+ input_arity=int(data["input_arity"]),
51
+ output_arity=int(data["output_arity"]),
52
+ )
53
+
54
+
55
+ @serde.register_class
56
+ @dataclass
57
+ class CompiledProgram:
58
+ """Executable program decoupled from user source.
59
+
60
+ This is a *logical model*; packaging (file/zip/etc.) is handled by tool layer.
61
+
62
+ Current constraints:
63
+ - signature is flat positional list I/O.
64
+ - no closure captures.
65
+ - no constant outputs (out_imms) unless future signature captures them.
66
+ """
67
+
68
+ _serde_kind: ClassVar[str] = "mplang.CompiledProgram"
69
+
70
+ graph: Graph
71
+ signature: FlatIOSignature
72
+ required_opcodes: list[str]
73
+ graph_digest: str
74
+ required_world_size: int | None = None
75
+ created_at: str | None = None
76
+ mplang_version: str | None = None
77
+ schema_version: int = 1
78
+ name: str | None = None
79
+
80
+ def to_json(self) -> dict[str, Any]:
81
+ return {
82
+ "schema_version": self.schema_version,
83
+ "name": self.name,
84
+ "graph": serde.to_json(self.graph),
85
+ "signature": self.signature.to_json(),
86
+ "required_opcodes": list(self.required_opcodes),
87
+ "graph_digest": self.graph_digest,
88
+ "required_world_size": self.required_world_size,
89
+ "created_at": self.created_at,
90
+ "mplang_version": self.mplang_version,
91
+ }
92
+
93
+ @classmethod
94
+ def from_json(cls, data: dict[str, Any]) -> CompiledProgram:
95
+ if "schema_version" not in data:
96
+ raise KeyError("Missing required field: schema_version")
97
+ schema_version = int(data["schema_version"])
98
+ if schema_version != 1:
99
+ raise ValueError(
100
+ f"Unsupported CompiledProgram schema_version: {schema_version}"
101
+ )
102
+
103
+ graph = serde.from_json(data["graph"])
104
+ if not isinstance(graph, Graph):
105
+ raise TypeError(
106
+ f"Expected graph to deserialize to Graph, got {type(graph).__name__}"
107
+ )
108
+
109
+ signature = FlatIOSignature.from_json(data["signature"])
110
+
111
+ required_world_size = data.get("required_world_size")
112
+ if required_world_size is not None:
113
+ required_world_size = int(required_world_size)
114
+ return cls(
115
+ graph=graph,
116
+ signature=signature,
117
+ required_opcodes=list(data.get("required_opcodes", [])),
118
+ graph_digest=str(data["graph_digest"]),
119
+ required_world_size=required_world_size,
120
+ created_at=data.get("created_at"),
121
+ mplang_version=data.get("mplang_version"),
122
+ schema_version=schema_version,
123
+ name=data.get("name"),
124
+ )
125
+
126
+
127
+ def compute_graph_digest(graph: Graph) -> str:
128
+ """Compute a deterministic digest for a Graph.
129
+
130
+ We intentionally avoid `serde.dumps()` because it doesn't sort keys.
131
+ """
132
+
133
+ canonical = json.dumps(serde.to_json(graph), sort_keys=True, separators=(",", ":"))
134
+ return hashlib.sha256(canonical.encode("utf-8")).hexdigest()
@@ -36,7 +36,7 @@ from mplang.edsl.graph import Graph
36
36
  from mplang.edsl.graph import Value as GraphValue
37
37
  from mplang.edsl.object import Object
38
38
  from mplang.edsl.typing import BaseType
39
- from mplang.logging_config import get_logger
39
+ from mplang.utils.logging import get_logger
40
40
 
41
41
  if TYPE_CHECKING:
42
42
  from mplang.edsl.primitive import Primitive
@@ -32,7 +32,7 @@ from mplang.backends import load_builtins
32
32
  from mplang.dialects import crypto, simp, spu, tee
33
33
  from mplang.edsl.object import Object
34
34
  from mplang.libs.device.cluster import Device
35
- from mplang.logging_config import get_logger
35
+ from mplang.utils.logging import get_logger
36
36
 
37
37
  load_builtins()
38
38
 
@@ -40,9 +40,9 @@ from mplang.edsl.graph import Graph, Value
40
40
  from mplang.edsl.object import Object
41
41
  from mplang.edsl.registry import get_impl
42
42
  from mplang.edsl.typing import BaseType
43
- from mplang.logging_config import get_logger
44
43
  from mplang.runtime.dialect_state import DialectState
45
44
  from mplang.runtime.object_store import ObjectStore
45
+ from mplang.utils.logging import get_logger
46
46
 
47
47
  if TYPE_CHECKING:
48
48
  from mplang.edsl.primitive import Primitive
@@ -0,0 +1,46 @@
1
+ # Copyright 2026 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
+ """Tool-layer APIs for MPLang.
16
+
17
+ This package contains utilities that are intentionally *not* part of the core
18
+ EDSL execution surface. In particular, compile/execute decoupling lives here:
19
+ - build a portable `CompiledProgram`
20
+ - pack/unpack to a container format
21
+
22
+ These helpers must not depend on user source code being available at execution.
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ from mplang.edsl.program import CompiledProgram, FlatIOSignature
28
+ from mplang.tool.program import (
29
+ compile_program,
30
+ inspect_artifact,
31
+ pack,
32
+ pack_to_path,
33
+ unpack,
34
+ unpack_path,
35
+ )
36
+
37
+ __all__ = [
38
+ "CompiledProgram",
39
+ "FlatIOSignature",
40
+ "compile_program",
41
+ "inspect_artifact",
42
+ "pack",
43
+ "pack_to_path",
44
+ "unpack",
45
+ "unpack_path",
46
+ ]