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.
- htpolynet-2.4.0/.claude/skills/htpolynet/SKILL.md +1 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/docker.yml +2 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/CHANGELOG.md +54 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/PKG-INFO +1 -1
- {htpolynet-2.3.1 → htpolynet-2.4.0}/ROADMAP.md +58 -60
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/Dockerfile +8 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/container-usage.rst +32 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/usage.rst +26 -1
- {htpolynet-2.3.1 → htpolynet-2.4.0}/pyproject.toml +1 -1
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cli.py +40 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/software.py +11 -2
- htpolynet-2.4.0/src/htpolynet/resources/claude/SKILL.md +165 -0
- htpolynet-2.4.0/tests/unit/test_setup_claude.py +64 -0
- htpolynet-2.4.0/tests/unit/test_software_provenance.py +116 -0
- htpolynet-2.3.1/.claude/skills/htpolynet/SKILL.md +0 -71
- htpolynet-2.3.1/tests/unit/test_software_provenance.py +0 -61
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.claude/settings.json +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.envrc +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/conda-forge-sync.yml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/release.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.github/workflows/test.yml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.gitignore +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/.readthedocs.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/CITATION.cff +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/CLAUDE.md +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/LICENSE +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/MANIFEST.in +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/README.md +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/compose.yml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docker/docker-entrypoint.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/Makefile +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/README.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/make.bat +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/requirements.txt +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/_static/.gitkeep +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/changelog.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/conf.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
- {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
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
- {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
- {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
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/example-tutorials/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/htpolynetpackage.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/install.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references/mol2-reference.pdf +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/references.bib +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/release-history.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/CURE.odg +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/bond_filter.odg +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/building-a-system.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configs/configs-for-run.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/configuration-files.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/flow1.odg +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/flow1yaml.odg +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/hydrogenated.eps +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/hydrogenated.fig +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/index.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/STY.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/STYCC.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/postcure-repair.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/docs/source/user-guide/program-flow.rst +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/check-conda-sync.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/release.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-detail.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-detail.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/render-snapshot.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/scripts/run_all_examples.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/analyze.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/plot.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/postsim.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/analysis/utils.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/bondtemplate.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/configuration.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/coordinates.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/molecule.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/paramcache.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/projectfilesystem.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/runtime.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/topocoord.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/core/topology.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/chain.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/curecontroller.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/expandreactions.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/cure/reaction.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/ambertools.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/command.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/gromacs.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/slurm.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/external/smiles_input.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/bondlist.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/lattice.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/linkcell.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/matrix4.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/geometry/ring.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/gro.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/mol2.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/io/pdb.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/cyanate_cap.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/repair/topology_surgery.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/README.md +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/README.md +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/npt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/banner.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/checkpoint.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/dataframetools.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/inputcheck.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/logsetup.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/profiling.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/stringthings.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/src/htpolynet/utils/vmd_viz.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/conftest.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/__init__.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config1.gro +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config1.top +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config2.gro +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/config2.top +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items31.edr +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items43.edr +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/items45.edr +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/fixtures/short.mdp +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_bondtemplate.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_chain.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_configuration.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_dataframetools.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gpu_usability.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_inputcheck.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_linkcell_pierce.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_paramcache.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_paramcache_ambertools.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_parameterize_react.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_plot_smoke.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_projectfilesystem.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_resources.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_ring.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_ring_pierce_figs.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_slurm_script.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_smiles_input.py +0 -0
- {htpolynet-2.3.1 → htpolynet-2.4.0}/tests/unit/test_topology/test.top +0 -0
- {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
|
|
@@ -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
|
+
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
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
the
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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.
|
|
@@ -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
|
-
|
|
101
|
-
|
|
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.
|