dpdispatcher 0.6.3__tar.gz → 0.6.4__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 (234) hide show
  1. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/pyright.yml +1 -1
  2. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/release.yml +1 -1
  3. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/test-bohrium.yml +1 -1
  4. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/test.yml +1 -1
  5. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.pre-commit-config.yaml +1 -1
  6. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/PKG-INFO +1 -1
  7. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/batch.md +8 -1
  8. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/_version.py +2 -2
  9. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/local_context.py +8 -2
  10. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/ssh_context.py +1 -1
  11. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/dpdisp.py +6 -0
  12. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/submission.py +21 -1
  13. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/pbs.py +104 -0
  14. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/PKG-INFO +1 -1
  15. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_run_submission.py +33 -0
  16. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/dependabot.yml +0 -0
  17. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/ci-docker.yml +0 -0
  18. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/machines.yml +0 -0
  19. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/mirror_gitee.yml +0 -0
  20. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.github/workflows/publish_conda.yml +0 -0
  21. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.gitignore +0 -0
  22. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/.readthedocs.yaml +0 -0
  23. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/CONTRIBUTING.md +0 -0
  24. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/Dockerfile +0 -0
  25. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/LICENSE +0 -0
  26. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/README.md +0 -0
  27. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/LICENSE +0 -0
  28. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/README.md +0 -0
  29. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/pbs/docker-compose.yml +0 -0
  30. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/pbs/start-pbs.sh +0 -0
  31. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/pbs.sh +0 -0
  32. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/slurm/docker-compose.yml +0 -0
  33. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/slurm/register_cluster.sh +0 -0
  34. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/slurm/start-slurm.sh +0 -0
  35. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/slurm.sh +0 -0
  36. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/ssh/docker-compose.yml +0 -0
  37. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/ssh/start-ssh.sh +0 -0
  38. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/ssh.sh +0 -0
  39. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/ci/ssh_rsync.sh +0 -0
  40. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/codecov.yml +0 -0
  41. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/conda/conda_build_config.yaml +0 -0
  42. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/conda/meta.yaml +0 -0
  43. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/.gitignore +0 -0
  44. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/Makefile +0 -0
  45. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/cli.rst +0 -0
  46. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/conf.py +0 -0
  47. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/context.md +0 -0
  48. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/credits.rst +0 -0
  49. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/dpdispatcher_on_yarn.md +0 -0
  50. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/examples/expanse.md +0 -0
  51. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/examples/g16.md +0 -0
  52. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/examples/shell.md +0 -0
  53. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/examples/template.md +0 -0
  54. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/getting-started.md +0 -0
  55. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/index.rst +0 -0
  56. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/install.md +0 -0
  57. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/machine.rst +0 -0
  58. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/make.bat +0 -0
  59. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/requirements.txt +0 -0
  60. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/resources.rst +0 -0
  61. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/doc/task.rst +0 -0
  62. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/__init__.py +0 -0
  63. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/__main__.py +0 -0
  64. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/arginfo.py +0 -0
  65. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/base_context.py +0 -0
  66. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/__init__.py +0 -0
  67. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/dp_cloud_server_context.py +0 -0
  68. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/hdfs_context.py +0 -0
  69. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/lazy_local_context.py +0 -0
  70. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/contexts/openapi_context.py +0 -0
  71. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/dlog.py +0 -0
  72. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/__init__.py +0 -0
  73. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/client.py +0 -0
  74. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/__init__.py +0 -0
  75. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/gui.py +0 -0
  76. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machine.py +0 -0
  77. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/__init__.py +0 -0
  78. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/distributed_shell.py +0 -0
  79. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/dp_cloud_server.py +0 -0
  80. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/fugaku.py +0 -0
  81. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/lsf.py +0 -0
  82. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/openapi.py +0 -0
  83. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/shell.py +0 -0
  84. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/machines/slurm.py +0 -0
  85. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/submission.py +0 -0
  86. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/__init__.py +0 -0
  87. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/__init__.py +0 -0
  88. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/client.py +0 -0
  89. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/config.py +0 -0
  90. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/retcode.py +0 -0
  91. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/zip_file.py +0 -0
  92. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/hdfs_cli.py +0 -0
  93. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/job_status.py +0 -0
  94. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/record.py +0 -0
  95. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher/utils/utils.py +0 -0
  96. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/SOURCES.txt +0 -0
  97. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/dependency_links.txt +0 -0
  98. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/entry_points.txt +0 -0
  99. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/requires.txt +0 -0
  100. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/top_level.txt +0 -0
  101. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/machine/expanse.json +0 -0
  102. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/machine/lazy_local.json +0 -0
  103. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/machine/mandu.json +0 -0
  104. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/resources/expanse_cpu.json +0 -0
  105. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/resources/mandu.json +0 -0
  106. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/resources/template.slurm +0 -0
  107. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/resources/tiger.json +0 -0
  108. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/task/deepmd-kit.json +0 -0
  109. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/examples/task/g16.json +0 -0
  110. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/pyproject.toml +0 -0
  111. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_docs.py +0 -0
  112. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_json.py +0 -0
  113. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/setup.cfg +0 -0
  114. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/.gitignore +0 -0
  115. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/__init__.py +0 -0
  116. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/batch.json +0 -0
  117. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/context.py +0 -0
  118. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/debug_test_class_submission_init.py +0 -0
  119. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_ali_ehpc.py +0 -0
  120. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_dp_cloud_server.py +0 -0
  121. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_lazy_ali_ehpc.py +0 -0
  122. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_lsf.py +0 -0
  123. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_shell.py +0 -0
  124. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_slurm.py +0 -0
  125. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/devel_test_ssh_ali_ehpc.py +0 -0
  126. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/graph.pb +0 -0
  127. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/job.json +0 -0
  128. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine.json +0 -0
  129. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_ali_ehpc.json +0 -0
  130. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_center.json +0 -0
  131. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_diffenert.json +0 -0
  132. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_dp_cloud_server.json +0 -0
  133. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_fugaku.json +0 -0
  134. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_if_cuda_multi_devices.json +0 -0
  135. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_lsf.json +0 -0
  136. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_slurm.json +0 -0
  137. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_lazylocal_shell.json +0 -0
  138. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_local_fugaku.json +0 -0
  139. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_local_shell.json +0 -0
  140. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_lsf.json +0 -0
  141. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_openapi.json +0 -0
  142. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_slurm.json +0 -0
  143. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/machine_yarn.json +0 -0
  144. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/resources.json +0 -0
  145. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/submission.json +0 -0
  146. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/jsons/task.json +0 -0
  147. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/sample_class.py +0 -0
  148. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/script_gen_json.py +0 -0
  149. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/slurm_test.env +0 -0
  150. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_argcheck.py +0 -0
  151. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_job.py +0 -0
  152. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_machine.py +0 -0
  153. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_machine_dispatch.py +0 -0
  154. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_resources.py +0 -0
  155. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_submission.py +0 -0
  156. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_submission_init.py +0 -0
  157. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_class_task.py +0 -0
  158. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_cli.py +0 -0
  159. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/conf.lmp +0 -0
  160. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/input.lammps +0 -0
  161. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/some_dir/some_file +0 -0
  162. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/conf.lmp +0 -0
  163. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/input.lammps +0 -0
  164. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/conf.lmp +0 -0
  165. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/input.lammps +0 -0
  166. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/conf.lmp +0 -0
  167. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/input.lammps +0 -0
  168. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/dir with space/file with space +0 -0
  169. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/graph.pb +0 -0
  170. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/some_dir/some_file +0 -0
  171. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_examples.py +0 -0
  172. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_group_size.py +0 -0
  173. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_gui.py +0 -0
  174. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_context.py +0 -0
  175. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/conf.lmp +0 -0
  176. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/input.lammps +0 -0
  177. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/conf.lmp +0 -0
  178. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/input.lammps +0 -0
  179. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/conf.lmp +0 -0
  180. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/input.lammps +0 -0
  181. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/conf.lmp +0 -0
  182. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/input.lammps +0 -0
  183. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/graph.pb +0 -0
  184. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_if_cuda_multi_devices/test_dir/test.txt +0 -0
  185. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_import_classes.py +0 -0
  186. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lazy_local_context.py +0 -0
  187. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_local_context.py +0 -0
  188. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/conf.lmp +0 -0
  189. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/input.lammps +0 -0
  190. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/conf.lmp +0 -0
  191. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/input.lammps +0 -0
  192. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/conf.lmp +0 -0
  193. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/input.lammps +0 -0
  194. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/conf.lmp +0 -0
  195. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/input.lammps +0 -0
  196. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/graph.pb +0 -0
  197. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/submission.json +0 -0
  198. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_lsf_script_generation.py +0 -0
  199. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/conf.lmp +0 -0
  200. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/input.lammps +0 -0
  201. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/conf.lmp +0 -0
  202. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/input.lammps +0 -0
  203. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/conf.lmp +0 -0
  204. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/input.lammps +0 -0
  205. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/conf.lmp +0 -0
  206. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/input.lammps +0 -0
  207. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/graph.pb +0 -0
  208. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_retry.py +0 -0
  209. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_run_submission_bohrium.py +0 -0
  210. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_run_submission_ratio_unfinished.py +0 -0
  211. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_cuda_multi_devices.py +0 -0
  212. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival.py +0 -0
  213. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/fail_dir/mock_fail_task.txt +0 -0
  214. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir with space/example.txt +0 -0
  215. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir1/example.txt +0 -0
  216. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir2/example.txt +0 -0
  217. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir3/example.txt +0 -0
  218. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir4/example.txt +0 -0
  219. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/graph.pb +0 -0
  220. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/recover_dir/mock_recover_task.txt +0 -0
  221. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/conf.lmp +0 -0
  222. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/input.lammps +0 -0
  223. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/conf.lmp +0 -0
  224. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/input.lammps +0 -0
  225. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/conf.lmp +0 -0
  226. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/input.lammps +0 -0
  227. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/conf.lmp +0 -0
  228. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/input.lammps +0 -0
  229. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/d3c842c5b9476e48f7145b370cd330372b9293e1.json +0 -0
  230. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/graph.pb +0 -0
  231. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/submission.json +0 -0
  232. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_slurm_script_generation.py +0 -0
  233. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_ssh_context.py +0 -0
  234. {dpdispatcher-0.6.3 → dpdispatcher-0.6.4}/tests/test_work_path/.gitkeep +0 -0
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
  steps:
10
10
  - uses: actions/checkout@v4
11
- - uses: actions/setup-python@v4
11
+ - uses: actions/setup-python@v5
12
12
  with:
13
13
  python-version: '3.11'
14
14
  - run: pip install -e .[cloudserver,gui]
@@ -10,7 +10,7 @@ jobs:
10
10
  steps:
11
11
  - uses: actions/checkout@v4
12
12
  - name: Setup python
13
- uses: actions/setup-python@v4
13
+ uses: actions/setup-python@v5
14
14
  with:
15
15
  python-version: 3.x
16
16
  architecture: x64
@@ -16,7 +16,7 @@ jobs:
16
16
  with:
17
17
  ref: "${{ github.event.pull_request.merge_commit_sha }}"
18
18
  - name: Set up Python 3.12
19
- uses: actions/setup-python@v4
19
+ uses: actions/setup-python@v5
20
20
  with:
21
21
  python-version: '3.12'
22
22
  cache: 'pip'
@@ -22,7 +22,7 @@ jobs:
22
22
  steps:
23
23
  - uses: actions/checkout@v4
24
24
  - name: Set up Python ${{ matrix.python-version }}
25
- uses: actions/setup-python@v4
25
+ uses: actions/setup-python@v5
26
26
  with:
27
27
  python-version: ${{ matrix.python-version }}
28
28
  - run: pip install .[test] coverage
@@ -18,7 +18,7 @@ repos:
18
18
  # Python
19
19
  - repo: https://github.com/astral-sh/ruff-pre-commit
20
20
  # Ruff version.
21
- rev: v0.1.6
21
+ rev: v0.1.13
22
22
  hooks:
23
23
  - id: ruff
24
24
  args: ["--fix"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dpdispatcher
3
- Version: 0.6.3
3
+ Version: 0.6.4
4
4
  Summary: Generate HPC scheduler systems jobs input scripts, submit these scripts to HPC systems, and poke until they finish
5
5
  Author: DeepModeling
6
6
  License: GNU LESSER GENERAL PUBLIC LICENSE
@@ -75,4 +75,11 @@ Read Fujitsu cloud service documentation for details.
75
75
  ## OpenAPI
76
76
 
77
77
  {dargs:argument}`batcy_type <resources/batch_type>`: `OpenAPI`
78
- OpenAPI is a new way to submit jobs to Bohrium. It using [AccessKey](https://bohrium.dp.tech/personal/setting) instead of username and password. Read Bohrium documentation for details.
78
+ OpenAPI is a new way to submit jobs to Bohrium. It using [AccessKey](https://bohrium.dp.tech/personal/setting) instead of username and password. Read Bohrium documentation for details.
79
+
80
+
81
+ ## SGE
82
+
83
+ {dargs:argument}`batch_type <resources/batch_type>`: `SGE`
84
+
85
+ The [Sun Grid Engine (SGE) scheduler](https://gridscheduler.sourceforge.net) is a batch-queueing system distributed resource management. The commands and flags of SGE share a lot similarity with PBS except when checking job status. Use this argument if one is submitting job to SGE based batch system.
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.6.3'
16
- __version_tuple__ = version_tuple = (0, 6, 3)
15
+ __version__ = version = '0.6.4'
16
+ __version_tuple__ = version_tuple = (0, 6, 4)
@@ -208,7 +208,10 @@ class LocalContext(BaseContext):
208
208
  shutil.rmtree(lfile, ignore_errors=True)
209
209
  elif os.path.isfile(lfile) or os.path.islink(lfile):
210
210
  os.remove(lfile)
211
- shutil.copyfile(rfile, lfile)
211
+ if not os.path.islink(rfile):
212
+ shutil.move(rfile, lfile)
213
+ else:
214
+ shutil.copyfile(rfile, lfile)
212
215
  else:
213
216
  raise RuntimeError("should not reach here!")
214
217
  else:
@@ -275,7 +278,10 @@ class LocalContext(BaseContext):
275
278
  shutil.rmtree(lfile, ignore_errors=True)
276
279
  elif os.path.isfile(lfile) or os.path.islink(lfile):
277
280
  os.remove(lfile)
278
- shutil.copyfile(rfile, lfile)
281
+ if not os.path.islink(rfile):
282
+ shutil.move(rfile, lfile)
283
+ else:
284
+ shutil.copyfile(rfile, lfile)
279
285
  else:
280
286
  raise RuntimeError("should not reach here!")
281
287
  else:
@@ -295,7 +295,7 @@ class SSHSession:
295
295
  assert self.ssh is not None
296
296
  try:
297
297
  return self.ssh.exec_command(cmd)
298
- except (paramiko.ssh_exception.SSHException, socket.timeout) as e:
298
+ except (paramiko.ssh_exception.SSHException, socket.timeout, EOFError) as e:
299
299
  # SSH session not active
300
300
  # retry for up to 3 times
301
301
  # ensure alive
@@ -54,6 +54,11 @@ def main_parser() -> argparse.ArgumentParser:
54
54
  action="store_true",
55
55
  help="Clean submission.",
56
56
  )
57
+ parser_submission_action.add_argument(
58
+ "--reset-fail-count",
59
+ action="store_true",
60
+ help="Reset fail count of all jobs to zero.",
61
+ )
57
62
  ##########################################
58
63
  # gui
59
64
  parser_gui = subparsers.add_parser(
@@ -105,6 +110,7 @@ def main():
105
110
  download_terminated_log=args.download_terminated_log,
106
111
  download_finished_task=args.download_finished_task,
107
112
  clean=args.clean,
113
+ reset_fail_count=args.reset_fail_count,
108
114
  )
109
115
  elif args.command == "gui":
110
116
  start_dpgui(
@@ -12,6 +12,7 @@ def handle_submission(
12
12
  download_terminated_log: bool = False,
13
13
  download_finished_task: bool = False,
14
14
  clean: bool = False,
15
+ reset_fail_count: bool = False,
15
16
  ):
16
17
  """Handle terminated submission.
17
18
 
@@ -25,13 +26,21 @@ def handle_submission(
25
26
  Download finished tasks.
26
27
  clean : bool, optional
27
28
  Clean submission.
29
+ reset_fail_count : bool, optional
30
+ Reset fail count of all jobs to zero.
28
31
 
29
32
  Raises
30
33
  ------
31
34
  ValueError
32
35
  At least one action should be specified.
33
36
  """
34
- if int(download_terminated_log) + int(download_finished_task) + int(clean) == 0:
37
+ if (
38
+ int(download_terminated_log)
39
+ + int(download_finished_task)
40
+ + int(clean)
41
+ + int(reset_fail_count)
42
+ == 0
43
+ ):
35
44
  raise ValueError("At least one action should be specified.")
36
45
 
37
46
  submission_file = record.get_submission(submission_hash)
@@ -42,7 +51,18 @@ def handle_submission(
42
51
  # TODO: for unclear reason, the submission_hash may be changed
43
52
  submission.submission_hash = submission_hash
44
53
  submission.machine.context.bind_submission(submission)
54
+ if reset_fail_count:
55
+ for job in submission.belonging_jobs:
56
+ job.fail_count = 0
57
+ # save to remote and local
58
+ submission.submission_to_json()
59
+ record.write(submission)
60
+ if int(download_terminated_log) + int(download_finished_task) + int(clean) == 0:
61
+ # if only reset_fail_count, no need to update submission state (expensive)
62
+ return
45
63
  submission.update_submission_state()
64
+ submission.submission_to_json()
65
+ record.write(submission)
46
66
 
47
67
  terminated_tasks = []
48
68
  finished_tasks = []
@@ -177,3 +177,107 @@ class Torque(PBS):
177
177
  **pbs_script_header_dict
178
178
  )
179
179
  return pbs_script_header
180
+
181
+
182
+ sge_script_header_template = """
183
+ #!/bin/bash
184
+ #$ -N dpdispatcher_submit
185
+ {select_node_line}
186
+ #$ -cwd
187
+
188
+ """
189
+
190
+
191
+ class SGE(PBS):
192
+ def __init__(
193
+ self,
194
+ batch_type=None,
195
+ context_type=None,
196
+ local_root=None,
197
+ remote_root=None,
198
+ remote_profile={},
199
+ *,
200
+ context=None,
201
+ ):
202
+ super(PBS, self).__init__(
203
+ batch_type,
204
+ context_type,
205
+ local_root,
206
+ remote_root,
207
+ remote_profile,
208
+ context=context,
209
+ )
210
+
211
+ def gen_script_header(self, job):
212
+ resources = job.resources
213
+ sge_script_header_dict = {}
214
+ # resources.number_node is not used
215
+ sge_script_header_dict[
216
+ "select_node_line"
217
+ ] = f"#$ -pe mpi {resources.cpu_per_node} "
218
+ # resources.queue_name is not necessary
219
+ sge_script_header = sge_script_header_template.format(**sge_script_header_dict)
220
+ return sge_script_header
221
+
222
+ def do_submit(self, job):
223
+ script_file_name = job.script_file_name
224
+ script_str = self.gen_script(job)
225
+ job_id_name = job.job_hash + "_job_id"
226
+ self.context.write_file(fname=script_file_name, write_str=script_str)
227
+ script_file_dir = self.context.remote_root
228
+ stdin, stdout, stderr = self.context.block_checkcall(
229
+ "cd {} && {} {}".format(script_file_dir, "qsub", script_file_name)
230
+ )
231
+ subret = stdout.readlines()
232
+ job_id = subret[0].split()[2]
233
+ self.context.write_file(job_id_name, job_id)
234
+ return job_id
235
+
236
+ def default_resources(self, resources):
237
+ pass
238
+
239
+ def check_status(self, job):
240
+ job_id = job.job_id
241
+ status_line = None
242
+ if job_id == "":
243
+ return JobStatus.unsubmitted
244
+ ret, stdin, stdout, stderr = self.context.block_call("qstat")
245
+ err_str = stderr.read().decode("utf-8")
246
+ if ret != 0:
247
+ raise RuntimeError(
248
+ "status command qstat fails to execute. erro info: %s return code %d"
249
+ % (err_str, ret)
250
+ )
251
+ status_text_list = stdout.read().decode("utf-8").split("\n")
252
+ for txt in status_text_list:
253
+ if job_id in txt:
254
+ status_line = txt
255
+
256
+ if status_line is None:
257
+ count = 0
258
+ while count <= 6:
259
+ if self.check_finish_tag(job=job):
260
+ return JobStatus.finished
261
+ dlog.info(
262
+ "not tag_finished detected, execute sync command and wait. count "
263
+ + str(count)
264
+ )
265
+ self.context.block_call("sync")
266
+ import time
267
+
268
+ time.sleep(10)
269
+ count += 1
270
+ return JobStatus.terminated
271
+ else:
272
+ status_word = status_line.split()[4]
273
+ # dlog.info (status_word)
274
+ if status_word in ["qw"]:
275
+ return JobStatus.waiting
276
+ elif status_word in ["r"]:
277
+ return JobStatus.running
278
+ else:
279
+ return JobStatus.unknown
280
+
281
+ def check_finish_tag(self, job):
282
+ job_tag_finished = job.job_hash + "_job_tag_finished"
283
+ return self.context.check_file_exists(job_tag_finished)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dpdispatcher
3
- Version: 0.6.3
3
+ Version: 0.6.4
4
4
  Summary: Generate HPC scheduler systems jobs input scripts, submit these scripts to HPC systems, and poke until they finish
5
5
  Author: DeepModeling
6
6
  License: GNU LESSER GENERAL PUBLIC LICENSE
@@ -3,6 +3,7 @@ import os
3
3
  import random
4
4
  import shutil
5
5
  import sys
6
+ import tempfile
6
7
  import traceback
7
8
 
8
9
  sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
@@ -72,6 +73,16 @@ class RunSubmission:
72
73
  )
73
74
  task_list.append(task)
74
75
 
76
+ for ii in range(2):
77
+ task = Task(
78
+ command=f"mkdir -p out_dir{ii} && touch out_dir{ii}/out{ii}",
79
+ task_work_path="./",
80
+ forward_files=[],
81
+ backward_files=[f"out_dir{ii}"],
82
+ outlog=f"out_dir{ii}.txt",
83
+ )
84
+ task_list.append(task)
85
+
75
86
  # test space in file name
76
87
  task_list.append(
77
88
  Task(
@@ -90,6 +101,11 @@ class RunSubmission:
90
101
  backward_common_files=[],
91
102
  task_list=task_list,
92
103
  )
104
+ # test override directory
105
+ os.makedirs(
106
+ os.path.join(self.machine_dict["local_root"], "test_dir", "out_dir1"),
107
+ exist_ok=True,
108
+ )
93
109
  submission.run_submission(check_interval=2)
94
110
 
95
111
  for ii in range(4):
@@ -251,6 +267,23 @@ class TestPBSRun(RunSubmission, unittest.TestCase):
251
267
  return super().test_async_run_submission()
252
268
 
253
269
 
270
+ @unittest.skipIf(sys.platform == "win32", "Shell is not supported on Windows")
271
+ class TestLocalContext(RunSubmission, unittest.TestCase):
272
+ def setUp(self):
273
+ super().setUp()
274
+ self.temp_dir = tempfile.TemporaryDirectory()
275
+ self.machine_dict["context_type"] = "LocalContext"
276
+ self.machine_dict["remote_root"] = self.temp_dir.name
277
+
278
+ def tearDown(self):
279
+ super().tearDown()
280
+ self.temp_dir.cleanup()
281
+
282
+ @unittest.skip("It seems the remote file may be deleted")
283
+ def test_async_run_submission(self):
284
+ return super().test_async_run_submission()
285
+
286
+
254
287
  @unittest.skipIf(sys.platform == "win32", "Shell is not supported on Windows")
255
288
  class TestLazyLocalContext(RunSubmission, unittest.TestCase):
256
289
  def setUp(self):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes