htpolynet 2.3.1__tar.gz → 2.4.0__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 (337) hide show
  1. htpolynet-2.4.0/.claude/skills/htpolynet/SKILL.md +1 -0
  2. {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/docker.yml +2 -0
  3. {htpolynet-2.3.1 → htpolynet-2.4.0}/CHANGELOG.md +54 -0
  4. {htpolynet-2.3.1 → htpolynet-2.4.0}/PKG-INFO +1 -1
  5. {htpolynet-2.3.1 → htpolynet-2.4.0}/ROADMAP.md +58 -60
  6. {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/Dockerfile +8 -0
  7. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/container-usage.rst +32 -0
  8. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/usage.rst +26 -1
  9. {htpolynet-2.3.1 → htpolynet-2.4.0}/pyproject.toml +1 -1
  10. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cli.py +40 -0
  11. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/software.py +11 -2
  12. htpolynet-2.4.0/src/htpolynet/resources/claude/SKILL.md +165 -0
  13. htpolynet-2.4.0/tests/unit/test_setup_claude.py +64 -0
  14. htpolynet-2.4.0/tests/unit/test_software_provenance.py +116 -0
  15. htpolynet-2.3.1/.claude/skills/htpolynet/SKILL.md +0 -71
  16. htpolynet-2.3.1/tests/unit/test_software_provenance.py +0 -61
  17. {htpolynet-2.3.1 → htpolynet-2.4.0}/.claude/settings.json +0 -0
  18. {htpolynet-2.3.1 → htpolynet-2.4.0}/.envrc +0 -0
  19. {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/conda-forge-sync.yml +0 -0
  20. {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/release.yaml +0 -0
  21. {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/test.yml +0 -0
  22. {htpolynet-2.3.1 → htpolynet-2.4.0}/.gitignore +0 -0
  23. {htpolynet-2.3.1 → htpolynet-2.4.0}/.readthedocs.yaml +0 -0
  24. {htpolynet-2.3.1 → htpolynet-2.4.0}/CITATION.cff +0 -0
  25. {htpolynet-2.3.1 → htpolynet-2.4.0}/CLAUDE.md +0 -0
  26. {htpolynet-2.3.1 → htpolynet-2.4.0}/LICENSE +0 -0
  27. {htpolynet-2.3.1 → htpolynet-2.4.0}/MANIFEST.in +0 -0
  28. {htpolynet-2.3.1 → htpolynet-2.4.0}/README.md +0 -0
  29. {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/compose.yml +0 -0
  30. {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/docker-entrypoint.sh +0 -0
  31. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/Makefile +0 -0
  32. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/README.rst +0 -0
  33. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/make.bat +0 -0
  34. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/requirements.txt +0 -0
  35. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/_static/.gitkeep +0 -0
  36. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/changelog.rst +0 -0
  37. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/conf.py +0 -0
  38. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
  39. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
  40. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
  41. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
  42. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
  43. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
  44. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
  45. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
  46. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
  47. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
  48. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
  49. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
  50. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
  51. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
  52. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
  53. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
  54. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
  55. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
  56. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
  57. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
  58. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
  59. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
  60. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
  61. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
  62. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
  63. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
  64. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
  65. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
  66. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
  67. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
  68. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
  69. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
  70. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
  71. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
  72. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
  73. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
  74. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
  75. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
  76. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
  77. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
  78. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
  79. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
  80. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
  81. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
  82. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
  83. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
  84. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
  85. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
  86. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
  87. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
  88. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
  89. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
  90. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
  91. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
  92. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
  93. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
  94. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
  95. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
  96. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
  97. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
  98. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
  99. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
  100. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
  101. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
  102. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
  103. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
  104. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
  105. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
  106. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
  107. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
  108. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/equil-rho_v_ns.png +0 -0
  109. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
  110. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
  111. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-equil-rho_v_ns.png +0 -0
  112. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-rho_v_ns.png +0 -0
  113. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
  114. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
  115. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
  116. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
  117. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
  118. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
  119. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
  120. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
  121. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
  122. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
  123. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
  124. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
  125. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
  126. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
  127. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
  128. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
  129. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
  130. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
  131. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
  132. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
  133. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
  134. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
  135. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
  136. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
  137. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
  138. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
  139. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
  140. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
  141. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
  142. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
  143. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
  144. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
  145. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
  146. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
  147. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
  148. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
  149. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
  150. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
  151. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
  152. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
  153. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
  154. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
  155. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
  156. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
  157. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
  158. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
  159. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
  160. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
  161. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
  162. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
  163. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
  164. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
  165. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
  166. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
  167. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
  168. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
  169. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
  170. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
  171. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
  172. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
  173. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/index.rst +0 -0
  174. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/htpolynetpackage.rst +0 -0
  175. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/index.rst +0 -0
  176. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/install.rst +0 -0
  177. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references/index.rst +0 -0
  178. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references/mol2-reference.pdf +0 -0
  179. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references.bib +0 -0
  180. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/release-history.rst +0 -0
  181. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/CURE.odg +0 -0
  182. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/bond_filter.odg +0 -0
  183. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/building-a-system.rst +0 -0
  184. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
  185. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
  186. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-run.rst +0 -0
  187. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configuration-files.rst +0 -0
  188. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/flow1.odg +0 -0
  189. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/flow1yaml.odg +0 -0
  190. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/hydrogenated.eps +0 -0
  191. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/hydrogenated.fig +0 -0
  192. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/index.rst +0 -0
  193. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
  194. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/STY.png +0 -0
  195. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/STYCC.png +0 -0
  196. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
  197. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
  198. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
  199. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
  200. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
  201. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
  202. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
  203. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/postcure-repair.rst +0 -0
  204. {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/program-flow.rst +0 -0
  205. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/check-conda-sync.py +0 -0
  206. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/release.sh +0 -0
  207. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-detail.sh +0 -0
  208. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-detail.tcl +0 -0
  209. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-snapshot.sh +0 -0
  210. {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/run_all_examples.sh +0 -0
  211. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/__init__.py +0 -0
  212. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/__init__.py +0 -0
  213. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/analyze.py +0 -0
  214. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/plot.py +0 -0
  215. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/postsim.py +0 -0
  216. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/utils.py +0 -0
  217. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/__init__.py +0 -0
  218. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/bondtemplate.py +0 -0
  219. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/configuration.py +0 -0
  220. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/coordinates.py +0 -0
  221. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/molecule.py +0 -0
  222. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/paramcache.py +0 -0
  223. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/projectfilesystem.py +0 -0
  224. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/runtime.py +0 -0
  225. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/topocoord.py +0 -0
  226. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/topology.py +0 -0
  227. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/__init__.py +0 -0
  228. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/chain.py +0 -0
  229. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/curecontroller.py +0 -0
  230. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/expandreactions.py +0 -0
  231. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/reaction.py +0 -0
  232. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/__init__.py +0 -0
  233. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/ambertools.py +0 -0
  234. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/command.py +0 -0
  235. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/gromacs.py +0 -0
  236. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/slurm.py +0 -0
  237. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/smiles_input.py +0 -0
  238. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/__init__.py +0 -0
  239. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/bondlist.py +0 -0
  240. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/lattice.py +0 -0
  241. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/linkcell.py +0 -0
  242. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/matrix4.py +0 -0
  243. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/ring.py +0 -0
  244. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/__init__.py +0 -0
  245. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/gro.py +0 -0
  246. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/mol2.py +0 -0
  247. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/pdb.py +0 -0
  248. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/__init__.py +0 -0
  249. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/cyanate_cap.py +0 -0
  250. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/topology_surgery.py +0 -0
  251. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/README.md +0 -0
  252. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/__init__.py +0 -0
  253. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
  254. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
  255. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
  256. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
  257. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
  258. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
  259. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
  260. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/README.md +0 -0
  261. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
  262. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
  263. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
  264. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
  265. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/npt.mdp +0 -0
  266. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
  267. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
  268. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
  269. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
  270. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
  271. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
  272. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
  273. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
  274. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
  275. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
  276. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
  277. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
  278. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
  279. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
  280. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
  281. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
  282. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
  283. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
  284. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
  285. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
  286. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
  287. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
  288. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
  289. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
  290. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
  291. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
  292. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
  293. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
  294. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
  295. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
  296. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
  297. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/__init__.py +0 -0
  298. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/banner.py +0 -0
  299. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/checkpoint.py +0 -0
  300. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/dataframetools.py +0 -0
  301. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/inputcheck.py +0 -0
  302. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/logsetup.py +0 -0
  303. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/profiling.py +0 -0
  304. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/stringthings.py +0 -0
  305. {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/vmd_viz.py +0 -0
  306. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/__init__.py +0 -0
  307. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/conftest.py +0 -0
  308. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/__init__.py +0 -0
  309. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config1.gro +0 -0
  310. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config1.top +0 -0
  311. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config2.gro +0 -0
  312. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config2.top +0 -0
  313. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items31.edr +0 -0
  314. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items43.edr +0 -0
  315. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items45.edr +0 -0
  316. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/short.mdp +0 -0
  317. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_bondtemplate.py +0 -0
  318. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_chain.py +0 -0
  319. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_configuration.py +0 -0
  320. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_dataframetools.py +0 -0
  321. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gpu_usability.py +0 -0
  322. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
  323. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
  324. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_inputcheck.py +0 -0
  325. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_linkcell_pierce.py +0 -0
  326. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_paramcache.py +0 -0
  327. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_paramcache_ambertools.py +0 -0
  328. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_parameterize_react.py +0 -0
  329. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_plot_smoke.py +0 -0
  330. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_projectfilesystem.py +0 -0
  331. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_resources.py +0 -0
  332. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_ring.py +0 -0
  333. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_ring_pierce_figs.py +0 -0
  334. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_slurm_script.py +0 -0
  335. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_smiles_input.py +0 -0
  336. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_topology/test.top +0 -0
  337. {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_topology.py +0 -0
@@ -0,0 +1 @@
1
+ ../../../src/htpolynet/resources/claude/SKILL.md
@@ -31,6 +31,8 @@ jobs:
31
31
  context: .
32
32
  file: docker/Dockerfile
33
33
  push: true
34
+ build-args: |
35
+ HTPOLYNET_COMMIT=${{ github.sha }}
34
36
  tags: |
35
37
  ghcr.io/cameronabrams/htpolynet:latest
36
38
  ghcr.io/cameronabrams/htpolynet:${{ github.sha }}
@@ -7,6 +7,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.0] - 2026-08-25
11
+
12
+ ### Added
13
+
14
+ - **`htpolynet setup-claude` installs the bundled Claude Code skill**, so it
15
+ reaches users who `pip install` or `conda install` htpolynet rather than
16
+ only those working inside a clone. The skill previously lived at
17
+ `.claude/skills/htpolynet/`, which the tool finds only when the working
18
+ directory is the repository -- that is contributors, and not most users.
19
+ It now ships as package data and is copied to
20
+ `~/.claude/skills/htpolynet/SKILL.md` on request; `--skills-dir
21
+ ./.claude/skills` scopes it to one project instead, and `--force`
22
+ overwrites an existing copy after an upgrade.
23
+
24
+ Nothing happens at install time: installing the package never writes to
25
+ `~/.claude/`. The repository's `.claude/skills/htpolynet/SKILL.md` is now
26
+ a symbolic link to the packaged file, so a clone and an install get the
27
+ same skill and the two cannot drift apart.
28
+
29
+ The skill itself was rewritten to stand alone. It used to be a router --
30
+ its first instruction was to read
31
+ `docs/source/user-guide/building-a-system.rst`, a path that does not exist
32
+ for an installed user -- so it now carries the procedure inline and cites
33
+ Read the Docs once as the full reference.
34
+
35
+ ### Fixed
36
+
37
+ - **The container image now reports the commit it was built from.** A
38
+ published image had no way to say what code it contained: there is no git
39
+ in the image and no `.git` beside the installed package, so
40
+ `htpolynet info` fell back to the installed version -- which is right for
41
+ pip and conda and *misleading for the container*, because the weekly
42
+ scheduled rebuild builds from `main` HEAD and reports whatever
43
+ `pyproject.toml` last said. An image built four commits past a release
44
+ claimed to be that release, and `:latest` is the default thing people
45
+ pull. A user could pull `:latest`, trust the version string, and record
46
+ the wrong version in a methods section.
47
+
48
+ The build now passes the commit as a `HTPOLYNET_COMMIT` build argument,
49
+ the image carries it in its environment, and `htpolynet info` reports it
50
+ in preference to the version fallback. A real git checkout still wins
51
+ over both, since it reflects the working tree including uncommitted
52
+ changes. The container-usage guide explains why `:latest` moves and how
53
+ to pull by digest or per-commit tag when provenance has to be stateable
54
+ later.
55
+
56
+ - The container-usage guide now distinguishes two habits that are easy to
57
+ conflate: **pulling once** gives a campaign a constant tool chain, while
58
+ **recording the digest** is what lets you state afterwards what that tool
59
+ chain was. The image pins more than the htpolynet code -- Gromacs and
60
+ AmberTools come unpinned from conda-forge at build time, so two images
61
+ built days apart can carry different versions of either while running
62
+ identical htpolynet code.
63
+
10
64
  ## [2.3.1] - 2026-08-25
11
65
 
12
66
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: htpolynet
3
- Version: 2.3.1
3
+ Version: 2.4.0
4
4
  Summary: Automated MD System Builder for Amorphous Network Polymers
5
5
  Project-URL: Source, https://github.com/cameronabrams/htpolynet
6
6
  Project-URL: Documentation, https://htpolynet.readthedocs.io/
@@ -28,35 +28,33 @@ Rough ordering within each section is by value, not by effort.
28
28
  the container" is not reproducible. Per-commit tags already exist;
29
29
  what's missing is documenting that users should pin one.
30
30
 
31
- - **The container cannot report which commit built it, and its version
32
- string is actively misleading between releases.** `htpolynet info` used to
33
- print `git commit: unknown` inside the image, because `_get_git_commit()`
34
- runs `git rev-parse` against the installed package directory and no
35
- installed copy has a `.git` beside it. That now falls back to the
36
- installed distribution version, which is right for a pip or conda install
37
- and *precisely wrong for the container*: the scheduled rebuild builds from
38
- `main` HEAD, which can be many commits past the last tag, so the image
39
- reports its `pyproject.toml` version honestly while running code that is
40
- not that version.
41
-
42
- This is live, not hypothetical. The 2026-08-24 03:54 scheduled build moved
43
- `:latest` to an image built from `948c301` -- four commits past `v2.3.0`
44
- -- and that image reports `installed version 2.3.0`. `:latest` is the
45
- default thing a user pulls and the weekly cron is what keeps moving it, so
46
- the wrong answer is the common case, and it is wrong silently. A user
47
- could pull `:latest`, trust the version string, and write "htpolynet
48
- 2.3.0" in a methods section while having run untagged `main`.
49
-
50
- The fix is to bake the real commit in at image build time -- the build
51
- context has `.git`, so `docker.yml` or the Dockerfile can capture
52
- `git rev-parse HEAD` and write it where the package can read it. That
53
- touches the Dockerfile and the release story together, which is why it was
54
- kept out of the bugfix that added the version fallback. It belongs with
55
- the build-manifest entry below: both answer "what produced this build",
56
- and a manifest that recorded an unreliable version string would launder
57
- the problem rather than solve it. Raised by the calibration study, which
58
- has correct provenance only because it pins the image by full sha
59
- externally -- which remains the right practice either way.
31
+ - **The image's Gromacs and AmberTools are unpinned, so two images with
32
+ identical htpolynet code can compute different numbers.** `docker/Dockerfile`
33
+ installs `ambertools`, `gromacs`, `parmed` and `rdkit` from conda-forge with
34
+ no version constraints, and the weekly rebuild exists precisely to pick up
35
+ whatever is newest. So the commit stamp now tells you which htpolynet
36
+ produced a build, and still does not tell you which force-field tool chain
37
+ did. Observed live: the image built 2026-08-25 carries AmberTools 26.0 and
38
+ Gromacs 2026.3, while panacea's native environment is on Gromacs
39
+ 2025.4 -- a different major version against the same htpolynet.
40
+
41
+ Unpinning is deliberate and mostly right: pinning would freeze the image on
42
+ old Gromacs and defeat the point of a weekly rebuild. The gap is that
43
+ nothing *records* what a given image resolved to, so the versions are
44
+ discoverable only by running `htpolynet info` inside it and writing the
45
+ answer down by hand. The better of two candidates is an image
46
+ **label** carrying a `conda list` export, written at build time: `docker
47
+ inspect` then answers the question without running the image, so the record
48
+ survives reaching someone who cannot run the container at all -- a reviewer,
49
+ an archive, a future reader holding only the digest. The alternative, making
50
+ `htpolynet info` machine-readable so a build can capture it, requires the
51
+ image to still be runnable, which is the weaker guarantee. This is the same
52
+ requirement as the build manifest below, one layer further down -- what
53
+ produced this build, all the way to the compilers.
54
+
55
+ Raised by the calibration study, which found the 2025.4/2026.3 split only
56
+ because it went looking after an unrelated prompt.
57
+
60
58
  - **Retire `ghcr.io/abramsgroup/htpolynet`.** Superseded by the
61
59
  `cameronabrams` package; still public and still serving a June image to
62
60
  anyone with an old link.
@@ -152,33 +150,6 @@ Coverage as of the last measurement: **38.8%** overall.
152
150
  cyanate-ester bridge series meant doing (a) and (b) by hand in a throwaway
153
151
  RDKit script, which is exactly the work a user should not have to
154
152
  reinvent.
155
- - **The bundled Claude skill only reaches people working in a clone.**
156
- `.claude/skills/htpolynet/` is picked up when the working directory is the
157
- repository, which covers contributors and anyone who cloned to run the
158
- examples -- but not the ordinary user who `pip install`s or
159
- `conda install`s htpolynet and works in their own project directory, which
160
- is most of them. Whether to ship it inside the package is undecided.
161
-
162
- Two things to settle before doing so, neither obvious:
163
-
164
- 1. **The skill would be broken as written.** Its central move is "read
165
- `docs/source/user-guide/building-a-system.rst`", a repo path that does
166
- not exist for an installed user. A shipped version would have to point
167
- at the Read the Docs URL instead, or the guide would have to ship as
168
- package data. The first is simpler and goes stale differently -- an RTD
169
- link tracks `latest`, so an installed 2.3.0 would send its reader to
170
- documentation for whatever is current.
171
- 2. **Delivery.** A skill file inside a wheel does nothing on its own;
172
- something has to place it where the tool looks. An `htpolynet skill
173
- --install` subcommand copying it into the user's `~/.claude/skills/`
174
- is the obvious mechanism, and is also the point at which a scientific
175
- package starts carrying vendor-specific tooling and an install-time
176
- side effect on a directory it does not own.
177
-
178
- Worth weighing against simply doing nothing: the procedural guide the skill
179
- points at is on Read the Docs already, and an agent that reads
180
- documentation gets the same content without any of this.
181
-
182
153
  - **Generated topologies cannot be compared byte-wise, because ParmEd
183
154
  stamps them.** Every `.top` htpolynet writes opens with a ParmEd header
184
155
  recording the invoking user, the host, and the date:
@@ -326,10 +297,37 @@ Coverage as of the last measurement: **38.8%** overall.
326
297
  example anneals at a 500 K peak, and the measured *T*:sub:`g` for this
327
298
  system is 487.9 K. That is 12.1 K above the glass transition, for 80 ps.
328
299
  The Tg ladder that produced the relaxed value spent 15,785 ps above
329
- *T*:sub:`g`, peaking 112 K above it -- 197x the time, in the only regime
330
- where a crosslinked network moves at all. Lengthening an anneal that sits
331
- 12 K above *T*:sub:`g` extends a process that barely moves anything, so
332
- the lever is the peak temperature, not the duration.
300
+ *T*:sub:`g`, peaking 112 K above it -- 197x the time, in the regime where
301
+ a crosslinked network actually moves. Lengthening an anneal that sits 12 K
302
+ above *T*:sub:`g` extends a process that barely moves anything, so the
303
+ lever is the peak temperature, not the duration.
304
+
305
+ **But raising the peak is unlikely to close the gap entirely.** Two
306
+ structures of the same network were held for 5 ns at a 480 K setpoint
307
+ that thermostatted to 477.1 K -- about 11 K *below* the measured
308
+ *T*:sub:`g`, and far longer than the 80 ps the example spends near it.
309
+ Relaxation there is fast at first and then stops: about 87% of an
310
+ initial 34.8 kg/m³ density gap -- the gap measured over the first 200 ps
311
+ -- closes within 3 ns, and the remaining 4.25 kg/m³ persists at
312
+ 7.2 sigma, with a last-half trend of +0.030 kg/m³/ns, i.e. not decaying.
313
+ (State the baseline and the window whenever this number is quoted: the
314
+ same data give 83.5-87.8% across the defensible choices of each, so a
315
+ bare percentage is not a fact.) So heat and time buy most of the
316
+ relaxation quickly and then buy nothing, and a residual difference
317
+ survives that a longer anneal at this scale does not appear able to
318
+ remove. Whatever replaces the current anneal should
319
+ therefore be argued as a large improvement, not as a fix; an entry
320
+ promising equilibration would oversell what was measured.
321
+
322
+ Note what that hold also says about *T*:sub:`g` itself: **relaxation does
323
+ not switch off at the glass transition**, it slows continuously through
324
+ it. A transition 20-34 K wide by experiment means 11 K below
325
+ *T*:sub:`g` is inside the transition, not deep in the glass, so fast
326
+ early relaxation there is expected rather than anomalous. This does not
327
+ soften the argument above -- the 197x figure is unchanged and a peak well
328
+ clear of the transition is still the lever -- but it does mean *T*:sub:`g`
329
+ is a soft kinetic boundary for this material, which any protocol
330
+ expressed relative to it has to accommodate.
333
331
 
334
332
  **Untested.** Nobody has yet built with a hotter anneal and compared it
335
333
  against the melt-and-recool value, which is the experiment that would
@@ -51,6 +51,14 @@ COPY . /htpolynet
51
51
  WORKDIR /htpolynet
52
52
  RUN pip install --no-cache-dir .
53
53
 
54
+ # The commit this image was built from. There is no git in the image and no
55
+ # .git beside the installed package, so without this an image cannot say what
56
+ # code it contains -- and its version string is actively misleading between
57
+ # releases, since the weekly rebuild builds from main HEAD. Declared after the
58
+ # expensive layers so that a changed sha does not invalidate the mamba cache.
59
+ ARG HTPOLYNET_COMMIT=unknown
60
+ ENV HTPOLYNET_COMMIT=${HTPOLYNET_COMMIT}
61
+
54
62
  # Pre-create HOME for the unprivileged user the entrypoint drops to. When
55
63
  # compose.yml mounts a named volume here, Docker initializes the fresh volume
56
64
  # from this directory and preserves the 0777 mode.
@@ -99,6 +99,38 @@ The ``compose.yml`` file mounts the current directory into the container as
99
99
  ``/work`` and runs the process as your host user, so all output files are
100
100
  written with your own ownership.
101
101
 
102
+ .. admonition:: Which code is in your image?
103
+ :class: note
104
+
105
+ ``htpolynet info`` reports the exact commit the image was built from, which
106
+ is baked in at build time. This matters because ``:latest`` moves: besides
107
+ moving on every release, it is rebuilt weekly from ``main`` to pick up new
108
+ Gromacs and AmberTools builds, so an image tagged ``:latest`` is frequently
109
+ built from a commit *after* the last release and its version number alone
110
+ will not tell you that.
111
+
112
+ For anything whose provenance you need to be able to state later -- a
113
+ published result, a long campaign you want to keep consistent -- pull by
114
+ digest or by the per-commit tag rather than ``:latest``, and record what
115
+ you pulled::
116
+
117
+ $ docker pull ghcr.io/cameronabrams/htpolynet@sha256:<digest>
118
+
119
+ Every build is also pushed as ``ghcr.io/cameronabrams/htpolynet:<commit-sha>``.
120
+
121
+ Note that the image pins more than the ``htpolynet`` code. Gromacs and
122
+ AmberTools are installed unpinned from conda-forge at build time, so two
123
+ images built days apart can carry different versions of either while
124
+ running identical ``htpolynet`` code -- and a charge method or an
125
+ integrator is not something you want silently varying across a campaign.
126
+ Two distinct habits protect against this and are worth keeping apart:
127
+ **pulling once** and reusing that image gives a campaign a constant tool
128
+ chain, while **recording the digest** is what lets you say afterwards what
129
+ that tool chain was. Doing only the first leaves you consistent but unable
130
+ to state what you did; doing only the second leaves every fresh pull free
131
+ to move under you. ``htpolynet info`` prints the AmberTools and Gromacs
132
+ versions actually present, so record its output alongside the digest.
133
+
102
134
  Running example shell scripts
103
135
  """""""""""""""""""""""""""""
104
136
 
@@ -21,6 +21,7 @@ Subcommand Description
21
21
  ``analyze`` Perform ``gmx``-style analyses of trajectories generated by post-build MD simulations
22
22
  ``gen-slurm-script`` Emit a SLURM batch script that runs ``htpolynet run`` for a given config
23
23
  ``make-viz`` Regenerate VMD visualization files (``.viz.psf`` + ``.viz.tcl``) from an existing ``top`` + ``gro`` pair
24
+ ``setup-claude`` Install htpolynet's Claude Code skill so an agent can drive htpolynet
24
25
  ==================== ========================
25
26
 
26
27
  ``htpolynet <subcommand> -h`` provides subcommand-level help.
@@ -511,4 +512,28 @@ The main ``.viz.tcl`` sources this file when it exists, so the macros are availa
511
512
  # composable with the rest of VMD's selection language
512
513
  mol modselect 0 top "THT and not hydrogen"
513
514
 
514
- The residue-level view is untouched — selections like ``resname TBO`` or ``resname IPD`` still work — the constituent macros are an *additive* layer.
515
+ The residue-level view is untouched — selections like ``resname TBO`` or ``resname IPD`` still work — the constituent macros are an *additive* layer.
516
+
517
+ ``htpolynet setup-claude``
518
+ !!!!!!!!!!!!!!!!!!!!!!!!!!
519
+
520
+ ``setup-claude`` installs the skill bundled with the package, which teaches Claude Code how to drive ``htpolynet``: start from the nearest example, describe monomers in their active form, check a config before spending compute, and recognize the failure modes that are known rather than mysterious.
521
+
522
+ .. code-block:: console
523
+
524
+ $ htpolynet setup-claude -h
525
+
526
+ usage: htpolynet setup-claude [-h] [--skills-dir SKILLS_DIR] [--force]
527
+
528
+ options:
529
+ -h, --help show this help message and exit
530
+ --skills-dir SKILLS_DIR
531
+ skills directory to install into (default: ~/.claude/skills);
532
+ use ./.claude/skills to scope the skill to one project
533
+ --force overwrite an existing installed skill
534
+
535
+ By default the skill goes to ``~/.claude/skills/htpolynet/SKILL.md``, where Claude Code finds it from any working directory. Pass ``--skills-dir ./.claude/skills`` to scope it to a single project instead.
536
+
537
+ Nothing is installed automatically: installing ``htpolynet`` never writes to ``~/.claude/``. Re-run ``setup-claude --force`` after upgrading to pick up the current version of the skill, which otherwise stays as it was when you first installed it.
538
+
539
+ Working inside a clone of the repository needs none of this --- ``.claude/skills/`` there is a symbolic link to the same file, so the skill is already in scope.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "htpolynet"
7
- version = "2.3.1"
7
+ version = "2.4.0"
8
8
  authors = [
9
9
  { name="Cameron F Abrams", email="cfa22@drexel.edu" },
10
10
  ]
@@ -5,11 +5,15 @@ Author: Cameron F. Abrams <cfa22@drexel.edu>
5
5
 
6
6
  import logging
7
7
  import os
8
+ import shutil
8
9
  import textwrap
9
10
 
10
11
  import argparse as ap
11
12
  import yaml
12
13
 
14
+ from importlib.resources import files as pkg_files
15
+ from pathlib import Path
16
+
13
17
  from .analysis.analyze import analyze
14
18
  from .analysis.plot import plots
15
19
  from .analysis.postsim import postsim
@@ -119,6 +123,37 @@ def fetch_example(args):
119
123
  _fetch_one(depot, fullname)
120
124
 
121
125
 
126
+ def setup_claude(args: ap.Namespace):
127
+ """Handles the setup-claude subcommand.
128
+
129
+ Copies the bundled skill into the user's skills directory. This runs only
130
+ when the user asks for it; installing the package never touches
131
+ ``~/.claude/``.
132
+
133
+ Args:
134
+ args (argparse.Namespace): parsed arguments
135
+ """
136
+ # Resolve through htpolynet.resources, which is a real package; the claude/
137
+ # subdirectory carries no __init__.py, matching every other resource
138
+ # subdirectory.
139
+ source = pkg_files('htpolynet.resources').joinpath('claude', 'SKILL.md')
140
+ if not source.is_file():
141
+ raise FileNotFoundError(f'Bundled skill not found at {source}')
142
+
143
+ skill_dir = Path(args.skills_dir).expanduser() / 'htpolynet'
144
+ target = skill_dir / 'SKILL.md'
145
+
146
+ if target.exists() and not args.force:
147
+ print(f'{target} already exists; re-run with --force to overwrite it')
148
+ return
149
+
150
+ skill_dir.mkdir(parents=True, exist_ok=True)
151
+ with source.open('rb') as fh, open(target, 'wb') as out:
152
+ shutil.copyfileobj(fh, out)
153
+ print(f'Written: {target}')
154
+ print('Claude Code picks the skill up on its next session in any directory.')
155
+
156
+
122
157
  def _add_run_options(p, loglevel='debug'):
123
158
  """Adds run options (no positional config) shared by run and gen-slurm-script."""
124
159
  p.add_argument('-lib',type=str,default='lib',help='local user library of molecular structures and parameterizations')
@@ -257,6 +292,7 @@ def cli():
257
292
  ('analyze', analyze, "perform 'gmx <command>' style analyses specified in the config file"),
258
293
  ('gen-slurm-script', gen_slurm_script, 'generate a SLURM submission script for running htpolynet on a cluster'),
259
294
  ('make-viz', make_viz, 'regenerate VMD viz files (.viz.psf + .viz.tcl) from an existing gromacs top + gro pair'),
295
+ ('setup-claude', setup_claude, "install htpolynet's Claude Code skill so an agent can drive htpolynet"),
260
296
  ]
261
297
 
262
298
  parser = ap.ArgumentParser(description=textwrap.dedent(banner_message),formatter_class=ap.RawDescriptionHelpFormatter)
@@ -291,6 +327,10 @@ def cli():
291
327
  cp['make-viz'].add_argument('-grx', type=str, default=None, help='input htpolynet .grx (default: auto-detect <gro-stem>.grx; needed for the constituent-selection macros)')
292
328
  cp['make-viz'].add_argument('-prefix', type=str, default=None, help='output basename; the .viz.psf, .viz.tcl, and .viz.macros.tcl are written next to the input gro (default: stem of -gro)')
293
329
 
330
+ cp['setup-claude'].add_argument('--skills-dir', type=str, default='~/.claude/skills',
331
+ help='skills directory to install into (default: %(default)s); use ./.claude/skills to scope the skill to one project')
332
+ cp['setup-claude'].add_argument('--force', default=False, action='store_true', help='overwrite an existing installed skill')
333
+
294
334
  _add_analysis_args(cp['postsim'])
295
335
  _add_analysis_args(cp['analyze'])
296
336
 
@@ -97,8 +97,13 @@ def _get_git_commit():
97
97
  report. Reporting 'unknown' there leaves a build with no way to answer
98
98
  "what code produced this" from inside itself, which is exactly the
99
99
  question the parameterization records exist to answer for molecules.
100
- Fall back to the installed distribution version, which for a released
101
- install maps to a tag and is the honest answer.
100
+ The published container bakes the commit it was built from into
101
+ ``HTPOLYNET_COMMIT``, which is consulted next: the image's version string
102
+ alone is misleading between releases, since the scheduled rebuild builds
103
+ from ``main`` HEAD and reports whatever ``pyproject.toml`` last said.
104
+
105
+ Failing both, fall back to the installed distribution version, which for a
106
+ released install maps to a tag and is the honest answer.
102
107
  """
103
108
  global git_commit
104
109
  src = os.path.dirname(__file__)
@@ -118,6 +123,10 @@ def _get_git_commit():
118
123
  return
119
124
  except Exception:
120
125
  pass
126
+ baked = os.environ.get('HTPOLYNET_COMMIT', '').strip()
127
+ if baked and baked != 'unknown':
128
+ git_commit = f'{baked[:7]} (baked in at image build)'
129
+ return
121
130
  try:
122
131
  from importlib.metadata import version, PackageNotFoundError
123
132
  try:
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: htpolynet
3
+ description: Build crosslinked polymer systems with htpolynet — authoring a run configuration, parameterizing monomers, running a cure, and reading the results. Use when the task involves an htpolynet YAML config, the `htpolynet` command (run, input-check, gen-slurm-script, plots, postsim, analyze, make-viz), a monomer's active form or sacrificial hydrogens, a cure that stalls below its target conversion, or sizing an htpolynet build for a cluster.
4
+ ---
5
+
6
+ # Working with htpolynet
7
+
8
+ htpolynet builds crosslinked polymer systems: it parameterizes monomers with
9
+ GAFF, packs them, and then *cures* the system by repeatedly forming bonds
10
+ between reactive atoms until it reaches a target conversion. The output is a
11
+ Gromacs topology and coordinate pair plus the analysis to characterize it.
12
+
13
+ ## The working loop
14
+
15
+ 1. Fetch the bundled example closest in **reaction topology** and run it
16
+ unmodified once.
17
+ 2. Edit it into your system. Describe monomers in their **active form**.
18
+ 3. `htpolynet input-check <cfg>` — fast, touches nothing, reports the atom
19
+ count you size a core request against.
20
+ 4. `htpolynet run <cfg>`, in the background, or via a batch script.
21
+ 5. `htpolynet plots build --proj proj-0` to see what you got.
22
+
23
+ ## Start from an example, never from an empty file
24
+
25
+ A working configuration is a few hundred lines and most of it is not
26
+ chemistry-specific. Writing one from scratch is the slowest route and the one
27
+ that produces silent errors.
28
+
29
+ ```bash
30
+ htpolynet fetch-example 1 # linear chain growth (polystyrene)
31
+ htpolynet fetch-example 2 # A2 + B4 thermoset (bisGMA/styrene)
32
+ htpolynet fetch-example 3 # amine + epoxy (PACM/DGEBA)
33
+ htpolynet fetch-example 6 # cyclotrimerization (cyanate ester)
34
+ ```
35
+
36
+ Pick by **reaction topology**, not by chemistry. Building a step-growth
37
+ thermoset from a difunctional and a tetrafunctional monomer? Example 2 beats
38
+ an example that shares a functional group but polymerizes by chain growth.
39
+
40
+ Run it unmodified first. That confirms the toolchain and gives you a
41
+ known-good log to diff against when your own config misbehaves.
42
+
43
+ ## Monomers are described in their active form
44
+
45
+ The most common conceptual error, and it produces a build that completes and
46
+ is wrong rather than one that fails.
47
+
48
+ htpolynet conserves valence: when two atoms bond, each gives up a
49
+ **sacrificial hydrogen**. So you do not describe the textbook monomer — you
50
+ describe the monomer with its reactive sites already saturated. Styrene is
51
+ described as ethylbenzene.
52
+
53
+ Prefer SMILES written directly into `constituents` with RDKit atom-map
54
+ labels, which name reactive atoms by chemical identity rather than by file
55
+ index:
56
+
57
+ ```yaml
58
+ constituents:
59
+ STY:
60
+ smiles: "c1ccccc1[CH2:1][CH3:2]"
61
+ reactive_atoms: {1: C1, 2: C2}
62
+ ```
63
+
64
+ In SMILES bracket atoms the hydrogen count is explicit: `[C:1]` means *zero*
65
+ implicit hydrogens. For an sp³ carbon you almost always want `[CH2:1]` or
66
+ `[CH3:1]`. A wrong count usually surfaces much later as a missing GAFF angle
67
+ parameter in `tleap`, a long way from its cause.
68
+
69
+ ## Check before spending compute
70
+
71
+ `htpolynet input-check <cfg>` reports the initial atom count in about a
72
+ second. Run it every time you change monomer counts.
73
+
74
+ Know what it does **not** check. It does not verify that
75
+ `symmetry_equivalent_atoms` groups really are topologically equivalent, that
76
+ A2 + B3 site counts balance, or that `desired_conversion` is reachable given
77
+ the monomer counts. Those are silent failure modes: a wrong symmetry group
78
+ generates reaction templates the cure stage never matches, and the build
79
+ spends its full wall-clock reaching a conversion it could never have reached.
80
+
81
+ ## Running
82
+
83
+ Builds are slow — production systems are hours to a day. Run them in the
84
+ background, or generate a batch script rather than writing one:
85
+
86
+ ```bash
87
+ htpolynet gen-slurm-script <cfg>
88
+ ```
89
+
90
+ Size the core request from the `input-check` atom count.
91
+
92
+ **If you are using the container image, target CPU partitions.** Its Gromacs
93
+ comes from conda-forge, built against OpenCL, which Gromacs no longer uses to
94
+ drive NVIDIA devices. The image cannot use a GPU: `--gres=gpu` and `--nv` buy
95
+ nothing and may cost queue time.
96
+
97
+ Parameterization runs first and is cached across projects and directories.
98
+ The first run of a new chemistry pays several minutes per species; later runs
99
+ reuse it. Editing a monomer's structure **without renaming it** silently
100
+ reuses the old parameterization — `--force-parameterization` rebuilds.
101
+
102
+ ## Builds are not reproducible run to run
103
+
104
+ There is no seed control. Conformer selection, the per-bond probability test,
105
+ and Gromacs velocity generation are all unseeded, so two runs of one config
106
+ diverge. Convenient in one direction — independent replicas of a
107
+ quenched-disorder ensemble come free, and each `htpolynet run` in the same
108
+ base directory makes its own project directory — but an exact rebuild is not
109
+ available. Record the commit (`htpolynet info`) when the result matters.
110
+
111
+ ## Reading the results
112
+
113
+ ```bash
114
+ htpolynet plots build --proj proj-0 # traces, reaction graph, cluster sizes
115
+ htpolynet make-viz -top final.top -gro final.gro
116
+ htpolynet postsim postsim.yaml --proj proj-0
117
+ htpolynet plots post --proj proj-0 # E and Tg
118
+ htpolynet analyze analyze.yaml --proj proj-0
119
+ ```
120
+
121
+ **The postcure NPT plateau is not an equilibrated density.** It is an
122
+ under-relaxed structure, and on the bundled cyanate-ester example it sits
123
+ about 2.3% below what the same system gives after a melt and slow re-cool.
124
+ Do not report a plateau density as a force-field result.
125
+
126
+ ## Subcommand routing
127
+
128
+ | Intent | Command |
129
+ |---|---|
130
+ | Build a system | `htpolynet run <cfg>` |
131
+ | Size it before queueing | `htpolynet input-check <cfg>` |
132
+ | Stop after parameterization | `htpolynet run --param-only <cfg>` |
133
+ | Submit to a cluster | `htpolynet gen-slurm-script <cfg>` |
134
+ | Plot a finished build | `htpolynet plots build --proj <dir>` |
135
+ | Post-build MD / analysis | `htpolynet postsim`, `htpolynet analyze` |
136
+ | Rebuild VMD viz files | `htpolynet make-viz` |
137
+ | Report the environment | `htpolynet info` |
138
+
139
+ ## When something goes wrong
140
+
141
+ - **The cure stalls below the target conversion.** Usually a reaction
142
+ template that never matches: suspect `symmetry_equivalent_atoms` and
143
+ reactive-atom names before suspecting the chemistry.
144
+ - **A `tleap` error about a missing parameter.** Usually an atom typed
145
+ wrongly from a hydrogen-count error in a SMILES bracket atom.
146
+ - **Results that do not match the config you are reading.** Suspect a stale
147
+ cache entry: a structure edit without a rename.
148
+ - **A build that dies during cure.** `-restart` is experimental and currently
149
+ broken at the cure stage, which is the worst place to lose work. Treat a
150
+ dead cure as a restart from the beginning.
151
+ - **Anything else.** `htpolynet info` reports the versions of every external
152
+ tool the build depends on; include its output in any bug report.
153
+
154
+ ## Do not
155
+
156
+ Do not write workarounds into this file. If the tool surprises a user in a
157
+ way that requires a ritual to avoid, that is a bug: fix it in code, or file
158
+ it with enough context to act on later. A skill that teaches people to route
159
+ around a defect keeps the defect.
160
+
161
+ ## Full reference
162
+
163
+ <https://htpolynet.readthedocs.io/> — in particular the user guide's
164
+ *Building a System, Start to Finish*, which this file condenses, and
165
+ *Molecular Structure Inputs*, which explains the active form with pictures.