htpolynet 2.6.1__tar.gz → 2.6.2__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.6.1 → htpolynet-2.6.2}/CHANGELOG.md +100 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/PKG-INFO +1 -1
- {htpolynet-2.6.1 → htpolynet-2.6.2}/ROADMAP.md +192 -22
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/results.rst +4 -1
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/postcure-repair.rst +139 -48
- {htpolynet-2.6.1 → htpolynet-2.6.2}/pyproject.toml +1 -1
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/curecontroller.py +53 -23
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_completion_bias.py +58 -7
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.claude/settings.json +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.claude/skills/htpolynet/SKILL.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.envrc +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/conda-forge-sync.yml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/docker.yml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/release.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/test.yml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.gitignore +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/.readthedocs.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/CITATION.cff +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/CLAUDE.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/LICENSE +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/MANIFEST.in +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/README.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/Dockerfile +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/compose.yml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/docker-entrypoint.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/Makefile +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/README.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/make.bat +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/requirements.txt +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/_static/.gitkeep +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/changelog.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/conf.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/equil-rho_v_ns.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-equil-rho_v_ns.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-rho_v_ns.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/htpolynetpackage.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/install.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references/mol2-reference.pdf +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references.bib +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/release-history.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/CURE.odg +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/bond_filter.odg +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/building-a-system.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-run.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configuration-files.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/container-usage.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/flow1.odg +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/flow1yaml.odg +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/hydrogenated.eps +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/hydrogenated.fig +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/index.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/STY.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/STYCC.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/bond_filter.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/hydrogenated.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/program-flow.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/usage.rst +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/check-conda-sync.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/release.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-detail.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-detail.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-snapshot.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/run_all_examples.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/analyze.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/plot.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/postsim.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/utils.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cli.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/bondtemplate.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/configuration.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/coordinates.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/molecule.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/paramcache.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/projectfilesystem.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/runtime.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/topocoord.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/topology.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/chain.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/expandreactions.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/reaction.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/ambertools.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/command.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/gromacs.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/slurm.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/smiles_input.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/software.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/bondlist.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/lattice.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/linkcell.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/matrix4.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/ring.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/gro.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/mol2.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/pdb.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/cyanate_cap.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/topology_surgery.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/README.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/claude/SKILL.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/README.md +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/min.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/npt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/render.tcl +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/banner.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/checkpoint.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/dataframetools.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/inputcheck.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/logsetup.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/profiling.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/stringthings.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/vmd_viz.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/conftest.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/__init__.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config1.gro +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config1.top +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config2.gro +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config2.top +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items31.edr +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items43.edr +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items45.edr +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/short.mdp +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_bondtemplate.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_cap_placement.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_chain.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_configuration.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_dataframetools.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gpu_usability.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_inputcheck.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_linkcell_pierce.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_paramcache.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_paramcache_ambertools.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_parameterize_react.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_plot_smoke.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_projectfilesystem.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_repair_conversion.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_resources.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_ring.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_ring_pierce_figs.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_setup_claude.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_slurm_script.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_smiles_input.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_software_provenance.py +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_topology/test.top +0 -0
- {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_topology.py +0 -0
|
@@ -7,6 +7,106 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.6.2] - 2026-08-31
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **The too-few-iterations warning was silent on the failure it exists to
|
|
15
|
+
catch.** `check_iterations_vs_functionality` returned early whenever the
|
|
16
|
+
cure ran at least `f` iterations, so it fired only for the counting
|
|
17
|
+
impossibility `n < f`. But `n >= f` only makes completion *possible*. The
|
|
18
|
+
bonds a cure forms are not spread evenly across its iterations -- the
|
|
19
|
+
per-iteration count decays steeply, and it is the last iteration that has to
|
|
20
|
+
supply each crosslinker its final bond -- so a cure that runs exactly `f`
|
|
21
|
+
iterations and spends its last one on almost nothing arrives at the same
|
|
22
|
+
place as one that ran too few. A build did exactly that: three iterations
|
|
23
|
+
against a functionality of three, target bond conversion reached, last
|
|
24
|
+
iteration spent on 9 bonds, and **one complete crosslinker out of 240**,
|
|
25
|
+
with nothing in the log about it. The system it wrote is a monomer melt
|
|
26
|
+
that equilibrates and reports a sensible density.
|
|
27
|
+
|
|
28
|
+
The check now tests the outcome rather than the precondition, which needs no
|
|
29
|
+
new measurement: by the time it runs, how many crosslinkers reacted at all
|
|
30
|
+
of their sites is exactly known. It logs that count on every cure and warns
|
|
31
|
+
when the fraction falls below the crosslinker conversion an ideal randomly
|
|
32
|
+
branching network of the same functionality would show at its gel point --
|
|
33
|
+
12.5 % for a trifunctional crosslinker. That figure is an idealization and
|
|
34
|
+
is used only to decide when to raise the volume; the count itself is exact
|
|
35
|
+
and is reported either way. The `n < f` case keeps its own message, because
|
|
36
|
+
there the cause is known exactly and worth naming.
|
|
37
|
+
|
|
38
|
+
The regression test suite had the bug written into it: a test asserted that
|
|
39
|
+
a run at exactly `f` iterations with no complete crosslinkers stays silent.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- **`min_clearance_nm` is documented as a placement outcome, not a tail
|
|
44
|
+
statistic.** 2.6.1's docs said `min_clearance_nm` and `n_below_target` were
|
|
45
|
+
the tail and were what `cap_min_clearance` should be calibrated against.
|
|
46
|
+
The first half is wrong for the same reason the median was: the direction
|
|
47
|
+
search exits at the first direction reaching the target, so whenever it
|
|
48
|
+
succeeds for every cap the worst-placed cap is one that only just cleared,
|
|
49
|
+
and the reported minimum is pinned to the threshold by construction. Across
|
|
50
|
+
14 independent real boxes it came in at 0.1503 +/- 0.0006 nm against a
|
|
51
|
+
0.150 nm target, and the single box that fell below it was the single box
|
|
52
|
+
with a non-zero `n_below_target`. The minimum therefore carries nothing
|
|
53
|
+
`n_below_target` does not already say. `blind_min_clearance_nm`, which
|
|
54
|
+
ranged 0.006-0.048 nm over the same boxes, is the real tail statistic, and
|
|
55
|
+
the `blind_*` fields are what to calibrate the target against.
|
|
56
|
+
|
|
57
|
+
- **The cube law is documented as an estimate over a measured band, not as a
|
|
58
|
+
floor.** The docs said crosslinker conversion sits at or above the cube of
|
|
59
|
+
bond conversion in the many-iteration limit. It does not, and the band over
|
|
60
|
+
which the cube is even a good estimate is narrower than that claim implied.
|
|
61
|
+
|
|
62
|
+
*Where it holds*: across 14 trifunctional runs at 1.7-2.7 `f` iterations and
|
|
63
|
+
bond conversions of 0.74-0.90, the crosslinker conversion sits +2.0 % from
|
|
64
|
+
the cube with a standard deviation of 2.9 %, and 3 of the 14 land *below*
|
|
65
|
+
it, to -3.7 %, against a replicate scatter of 0.8-1.8 % -- so the excursions
|
|
66
|
+
below are real and it is a two-sided estimate, good to about 3 %.
|
|
67
|
+
|
|
68
|
+
*Below that band*: on 12 further builds at bond conversions of 0.40-0.73 it
|
|
69
|
+
is neither mild nor two-sided. 11 of the 12 fall below the cube, by -19.9 %
|
|
70
|
+
on average, worsening monotonically as the bond conversion falls and
|
|
71
|
+
reaching -93.6 % at 0.40. Carrying +/- 3 % down to a bond conversion of 0.5
|
|
72
|
+
understates the error by an order of magnitude, in a predictable direction.
|
|
73
|
+
|
|
74
|
+
*Above it*: the four runs of the nine-iteration cohort all landed +0.6 % to
|
|
75
|
+
+3.5 % above the cube, which reads like a bound but cannot establish one --
|
|
76
|
+
four points cannot separate a bound from the upper tail of a two-sided
|
|
77
|
+
distribution, and the scatter measured at 1.7-2.7 `f` cannot be carried to
|
|
78
|
+
3 `f` when regime dependence is exactly what is at issue. The docs say 3 `f`
|
|
79
|
+
is untested rather than either way.
|
|
80
|
+
|
|
81
|
+
*What sets the shortfall*: not the iteration count. Four runs that each took
|
|
82
|
+
exactly three iterations span 15x in ratio-to-cube (0.06, 0.63, 0.80, 0.94).
|
|
83
|
+
It is how the bonds were distributed across those iterations, and
|
|
84
|
+
specifically how many the last one formed, since that is the iteration which
|
|
85
|
+
has to supply each crosslinker its final bond -- per-iteration bond counts
|
|
86
|
+
decay steeply, so the average is not the operative number. The run at 0.06
|
|
87
|
+
spent its last iteration on 9 bonds against an average of 96; a run at the
|
|
88
|
+
same bond conversion five months earlier, under an older htpolynet, spent its
|
|
89
|
+
own last iteration on 10 and reached the same ratio to three digits.
|
|
90
|
+
|
|
91
|
+
*Which variable to read it against*: bond conversion, because that is what
|
|
92
|
+
the shortfall tracks -- r = +0.81, against +0.57 for the iteration count,
|
|
93
|
+
over 26 runs. The docs are explicit that this is not the mechanism. Within
|
|
94
|
+
a fixed iteration count the *average* bonds formed per iteration is exactly
|
|
95
|
+
proportional to the bond conversion, so no set of runs sharing an iteration
|
|
96
|
+
count can distinguish those two, and none here does.
|
|
97
|
+
|
|
98
|
+
- **The placement documentation now quotes real-box numbers instead of
|
|
99
|
+
synthetic ones.** `cap_min_clearance`'s "demanding default" was described
|
|
100
|
+
from a synthetic sweep that put the blind median at 0.143 nm and had about
|
|
101
|
+
half of caps needing a search. On real cured boxes at the same heavy-atom
|
|
102
|
+
density the blind median is 0.120 nm -- ~16 % tighter, in the direction the
|
|
103
|
+
sweep's own caveat predicted -- so the search runs for well over half of all
|
|
104
|
+
caps and 37 % of them would have been placed inside 0.10 nm blind. It
|
|
105
|
+
nonetheless reaches the target for all but 1 cap in 1955, so the default is
|
|
106
|
+
demanding and reachable at once. `n_preferred_out_of_angle` came in at 6 %,
|
|
107
|
+
which the docs now give as the scale for reading that field: the 90-150
|
|
108
|
+
degree window is not what is sending caps to the search.
|
|
109
|
+
|
|
10
110
|
## [2.6.1] - 2026-08-27
|
|
11
111
|
|
|
12
112
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: htpolynet
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.2
|
|
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/
|
|
@@ -186,13 +186,15 @@ Coverage as of the last measurement: **38.8%** overall.
|
|
|
186
186
|
degree placement at 0.236 nm -- but the aryl carbon has since been excluded
|
|
187
187
|
from the metric precisely so it does not saturate, so that bound no longer
|
|
188
188
|
applies and there is no analytic ceiling to reason from at all. What is
|
|
189
|
-
unknown
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
189
|
+
unknown was the fire rate in a box at polymer density, and that has now been
|
|
190
|
+
measured (see the real-box block at the end of this entry). What is left is
|
|
191
|
+
the recalibration itself: set the default so it flags the tail rather than
|
|
192
|
+
the bulk, using `blind_min_clearance_nm`, `blind_median_clearance_nm` and
|
|
193
|
+
`n_below_target`. Do **not** calibrate against `min_clearance_nm` -- it
|
|
194
|
+
saturates at whatever target is set. A threshold that fires on everything is
|
|
195
|
+
not a threshold. The `n_preferred_out_of_angle` escape hatch is closed: it
|
|
196
|
+
came back at 6 %, so the 90--150 degree window is not biting real O-H
|
|
197
|
+
vectors and is not the thing to change.
|
|
196
198
|
|
|
197
199
|
One thing the synthetic sweep did settle, so nobody re-derives it: the
|
|
198
200
|
clipping the aryl-carbon exclusion removes is density-dependent, and at melt
|
|
@@ -273,6 +275,49 @@ Coverage as of the last measurement: **38.8%** overall.
|
|
|
273
275
|
accordingly rather than assuming the high-conversion points are as tight as
|
|
274
276
|
the low ones.
|
|
275
277
|
|
|
278
|
+
**Measured on real boxes, 2026-08-27** (study session, job 22107390): 14
|
|
279
|
+
independent cured BPA-cyanate-ester boxes at v2.6.1, chi_bond 0.740--0.901,
|
|
280
|
+
1955 caps, ~53 heavy atoms/nm^3 -- the first placement numbers taken without
|
|
281
|
+
the clearance bug present. `blind_median_clearance_nm` 0.1198 +/- 0.0061
|
|
282
|
+
against the synthetic sweep's 0.143: real boxes are ~16 % *tighter*, in the
|
|
283
|
+
direction the sweep's own caveat predicted, so the sweep's absolute values
|
|
284
|
+
should not be used to set the default. `blind_min_clearance_nm` 0.006--0.048.
|
|
285
|
+
722 of 1955 caps (37 %) would have been placed inside 0.10 nm blind.
|
|
286
|
+
`n_preferred_out_of_angle` 109 (6 %). `n_below_target` 1 of 1955, against
|
|
287
|
+
the sweep's 0 that was flagged "certainly optimistic".
|
|
288
|
+
|
|
289
|
+
And a correction to this entry's own advice, which the numbers force:
|
|
290
|
+
`min_clearance_nm` is **not** a tail statistic and must not be calibrated
|
|
291
|
+
against. Across all 14 boxes it came in at 0.1503 +/- 0.0006 against a 0.150
|
|
292
|
+
target -- the target seen from above, not a measurement. The search exits at
|
|
293
|
+
the first direction reaching target, so whenever it succeeds for every cap
|
|
294
|
+
the worst-placed cap is one that only just cleared, and the minimum is
|
|
295
|
+
pinned to the threshold by construction. The one box below it (cb0773,
|
|
296
|
+
0.1488) is the one box with `n_below_target` = 1. This is the searched-median
|
|
297
|
+
defect one statistic further along; it was missed because the median's
|
|
298
|
+
version of it was the one being written up. Docs corrected.
|
|
299
|
+
|
|
300
|
+
So the recalibration is unblocked and wants the `blind_*` columns. Note that
|
|
301
|
+
0.150 sits well above the measured blind median of 0.120, not marginally
|
|
302
|
+
above 0.143 as the sweep suggested -- so the search runs for well over half
|
|
303
|
+
of all caps -- yet it succeeds for 1954 of 1955. Demanding and reachable at
|
|
304
|
+
once, which is a different situation from the one this entry was written
|
|
305
|
+
against, and it weakens the earlier guess that recalibration would move the
|
|
306
|
+
default down.
|
|
307
|
+
|
|
308
|
+
**The placement change is density-neutral at high conversion, 2026-08-28**
|
|
309
|
+
(study session; picotte 22107390 complete, 14/14, exit 0:0). v2.6.1 anchors
|
|
310
|
+
at chi_OCN 0.7438 give 1197.59 kg/m^3 (n = 2) against v2.3.0's 1197.94 +/-
|
|
311
|
+
3.25 at 0.7458 (n = 8): offset -0.34 on a combined SE of 2.38, i.e. 0.1
|
|
312
|
+
sigma, bounding |offset| < 4.7 kg/m^3 at 2 sigma. So the net of 5a58d3d and
|
|
313
|
+
82ddd3e does not move bulk density where it has been checked. Two limits.
|
|
314
|
+
The bound is small against the 21 kg/m^3 rise across the series, so the two
|
|
315
|
+
versions pool for curve shape -- but it is *not* small against the 3.0 kg/m^3
|
|
316
|
+
basin depth, so it licenses nothing about the basin. And it does not
|
|
317
|
+
calibrate `cap_min_clearance`: a placement change being invisible in bulk
|
|
318
|
+
density is a much weaker statement than the threshold being right, and this
|
|
319
|
+
item stays open exactly as written above.
|
|
320
|
+
|
|
276
321
|
- **The cap direction search stops at the first adequate direction, not the
|
|
277
322
|
best one.** `_choose_cap_placement` breaks out as soon as a direction
|
|
278
323
|
reaches `cap_min_clearance`, so a cap that could have had 0.25 nm of room
|
|
@@ -281,32 +326,157 @@ Coverage as of the last measurement: **38.8%** overall.
|
|
|
281
326
|
admits about 43 % of a 48-direction Fibonacci spiral, so a full scan is
|
|
282
327
|
~21 vectorized distance evaluations against a neighbour list of order 100.
|
|
283
328
|
And `median_clearance_nm` is partly a readout of the threshold rather than
|
|
284
|
-
of the box, since the distribution is truncated from below at the target
|
|
329
|
+
of the box, since the distribution is truncated from below at the target --
|
|
330
|
+
as is `min_clearance_nm`, which is pinned *at* the target rather than merely
|
|
331
|
+
pulled toward it, measured at 0.1503 +/- 0.0006 across 14 real boxes.
|
|
332
|
+
Removing the early exit would give both fields their meaning back.
|
|
285
333
|
|
|
286
334
|
Deliberately not changed for 2.6.1: taking the best direction moves every
|
|
287
335
|
cap that needed a search, and doing that on the same release as the
|
|
288
336
|
clearance fix means the next real build cannot attribute a change in the
|
|
289
|
-
numbers to either one.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
337
|
+
numbers to either one. That precondition is now satisfied -- the 14-box
|
|
338
|
+
measurement of 2026-08-27 recorded above is the clean pre-change baseline,
|
|
339
|
+
so this is ready to do. Note that changing it invalidates the achieved
|
|
340
|
+
columns of anything built before it while leaving the `blind_*` columns
|
|
341
|
+
comparable, which is another reason those are the ones to correlate on.
|
|
294
342
|
|
|
295
343
|
- **The shortfall from the cube law between `f` and many iterations is
|
|
296
|
-
unexplained.** Below `f` iterations
|
|
297
|
-
a counting constraint;
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
344
|
+
unexplained, and is now known to be narrow.** Below `f` iterations
|
|
345
|
+
crosslinker conversion is exactly zero, a counting constraint; the four runs
|
|
346
|
+
of the nine-iteration cohort land +0.6 to +3.5 % above the cube (attested at
|
|
347
|
+
nine for two of the four; the other two are the same cohort at the same
|
|
348
|
+
target with the count unrecorded). In between, measured ratios
|
|
349
|
+
to the cube law are 0.06 and 0.46--0.50 at three iterations and 0.86 at
|
|
350
|
+
four -- an eightfold spread at an *identical* iteration count, so the
|
|
351
|
+
iteration count does not determine it. The band above that is now measured
|
|
352
|
+
and shows no shortfall at all: 14 runs at `n`/`f` 1.67--2.67 sit at
|
|
353
|
+
1.020 +/- 0.029 of the cube, with 3 of the 14 *below* it to -3.7 % against
|
|
354
|
+
replicate scatter of 0.8--1.8 %. So the unexplained region is only
|
|
355
|
+
`f` to about 1.7`f`, and across 1.7--2.7`f` the cube is a two-sided estimate
|
|
356
|
+
rather than the floor the docs used to call it -- corrected there.
|
|
357
|
+
|
|
358
|
+
What that does **not** settle is 3`f`, and the temptation to settle it by
|
|
359
|
+
arithmetic should be resisted: applying the 1.7--2.7`f` scatter to the
|
|
360
|
+
nine-iteration cohort gives P(below cube) = 0.245 and makes four-of-four
|
|
361
|
+
above a one-in-three outcome, but that presupposes the deviation is
|
|
362
|
+
regime-independent, which is the claim in question. The cohort on its own is
|
|
363
|
+
+2.64 % sd 1.39 % (n = 4), giving P = 0.03 -- an order of magnitude apart --
|
|
364
|
+
and at n = 4 the sd's 95 % CI is [0.79, 5.18], so the two cannot be
|
|
365
|
+
distinguished. 3`f` is untested, not disproved. Settling it wants more runs
|
|
366
|
+
at 3`f`, not a wider distribution borrowed from a lower one. Whatever
|
|
367
|
+
mechanism explains the shortfall has to switch off within a factor of two
|
|
368
|
+
of `f`.
|
|
369
|
+
|
|
370
|
+
The one-bond-per-residue-per-iteration rule was simulated against this and
|
|
371
|
+
moves the n=3 prediction only from 30.0 to 25.9 against 15 observed: a fifth
|
|
303
372
|
of the gap. The leading untested guess is spatial anti-correlation --
|
|
304
373
|
bonds forming preferentially on crosslinkers that already have room, leaving
|
|
305
374
|
the rest to compete. This matters because it is the regime where a user's
|
|
306
375
|
reported conversion is most wrong, and because a warning better than the
|
|
307
376
|
current `iterations < f` one needs a mechanism to threshold on. Widening
|
|
308
|
-
that warning to `n < 2f` was considered and rejected:
|
|
309
|
-
|
|
377
|
+
that warning to `n < 2f` was considered and rejected: no threshold on `n`
|
|
378
|
+
alone can work.
|
|
379
|
+
|
|
380
|
+
That conclusion survives a correction to its own evidence, and comes out
|
|
381
|
+
stronger. The 8x pair was **confounded**: conv40 r3 and conv50 r1 are both
|
|
382
|
+
n = 3 but sit at chi_bond 0.40 and 0.50, so they never isolated `n` either.
|
|
383
|
+
The new low-conversion builds split it -- at fixed chi_bond the residual
|
|
384
|
+
spread is 1.36x, not 8x, and the chi_bond 0.40 ratio-to-cube reproduces to
|
|
385
|
+
three digits across v2.3.0 and v2.6.1 five months apart. So at fixed `n` the
|
|
386
|
+
ratio moves 7--10x purely with chi_bond, which is a sharper refutation of an
|
|
387
|
+
`n` threshold than the confounded pair was. What does *not* survive is the
|
|
388
|
+
explanation: the "product of per-iteration bond fractions" account is
|
|
389
|
+
superseded by plain chi_bond, which is simpler and reproduces across
|
|
390
|
+
versions. Docs corrected.
|
|
391
|
+
|
|
392
|
+
**Reinstated 2026-08-29**, and worth recording because it was withdrawn and
|
|
393
|
+
reinstated inside two days. The "product of per-iteration bond fractions"
|
|
394
|
+
account was not superseded -- it was under-evidenced, and the iteration logs
|
|
395
|
+
now make it the best-evidenced thing in this entry. Bonds per iteration decay
|
|
396
|
+
steeply (bpa-fl0500: 156, 145, 59; bpa-cb0900: 162, 148, 128, 92, 46, 29, 17,
|
|
397
|
+
26), so `720 x chi_bond / n` is an average no build actually realises. What
|
|
398
|
+
matters is the LAST iteration, the one that has to supply a triazine's third
|
|
399
|
+
bond: bpa-fl0400 spent 9 bonds there against an average of 96 and came in at
|
|
400
|
+
ratio 0.064, and conv40 r3 -- same conversion, v2.3.0, five months earlier --
|
|
401
|
+
spent 10 on its own last iteration and also came in at 0.064.
|
|
402
|
+
|
|
403
|
+
So chi_bond is a **proxy for the distribution, not a replacement for it**.
|
|
404
|
+
The algebra above still holds for *average* bonds-per-iteration, which is
|
|
405
|
+
exactly collinear with chi_bond at fixed n (r = 1.0000). The *last-iteration*
|
|
406
|
+
count is a third variable at r = 0.980 with chi_bond -- separable in
|
|
407
|
+
principle, not on four points. The withdrawal on 08-28 was made on the
|
|
408
|
+
strength of a correlation, which is the move this entry already warns about
|
|
409
|
+
one paragraph earlier.
|
|
410
|
+
|
|
411
|
+
**Measured below the band, 2026-08-28** (study session; picotte 22132281,
|
|
412
|
+
12 BPA builds at v2.6.1, cures final, ladders still running): at bond
|
|
413
|
+
conversions of 0.40--0.73 the deviation from the cube is one-sided and
|
|
414
|
+
large -- 11 of 12 below, mean -19.9 %, worsening monotonically as bond
|
|
415
|
+
conversion falls, -93.6 % at 0.40. The single build inside the documented
|
|
416
|
+
band (0.7306, +1.5 %) agrees with it, so nothing here disturbs the
|
|
417
|
+
1.7--2.7`f` scoping.
|
|
418
|
+
|
|
419
|
+
The open question this creates is which variable is doing the work. The
|
|
420
|
+
documented band is *both* 1.7--2.7`f` and bond conversion 0.74--0.90; this
|
|
421
|
+
array varies bond conversion and its iteration counts are not yet in hand
|
|
422
|
+
(they live in `diagnostics.log`, returned only when a task ends -- expected
|
|
423
|
+
early 2026-08-29). So the docs state the degradation against bond
|
|
424
|
+
conversion, which is what was measured, and do not attribute it to `n`/`f`.
|
|
425
|
+
**Resolved 2026-08-29**, counts returned with the array. Four builds sit at
|
|
426
|
+
exactly n = 3 spanning 15x in ratio-to-cube (0.064 / 0.633 / 0.795 / 0.937 at
|
|
427
|
+
chi_bond 0.40 / 0.50 / 0.55 / 0.58), monotone in chi_bond. So "iteration
|
|
428
|
+
count does not determine the shortfall" is established directly, on four
|
|
429
|
+
same-n runs, rather than inferred from the confounded pair. Over all 26
|
|
430
|
+
builds r(ratio, chi_bond) = +0.813 against r(ratio, n/f) = +0.567, with
|
|
431
|
+
r(chi_bond, n/f) = +0.905; counts run 3 to 8, n/f 1.00 to 2.67. Docs cite
|
|
432
|
+
the four-run evidence now.
|
|
433
|
+
|
|
434
|
+
- **A config-time version of that warning, before any compute is spent.**
|
|
435
|
+
Largely superseded by the completed-crosslinker check that shipped -- nothing
|
|
436
|
+
needs a proxy for a quantity that is exactly known by the time the cure
|
|
437
|
+
ends -- and worth keeping only for
|
|
438
|
+
what the post-hoc check cannot do: warn *before* a multi-hour build rather
|
|
439
|
+
than after it. That is a weaker claim on much worse evidence, so it is a
|
|
440
|
+
separate feature and not a substitute. The reasoning that motivated it:
|
|
441
|
+
chi_bond predicts the ratio-to-cube to within 1.36x, and unlike a bond
|
|
442
|
+
distribution -- which does not exist until the cure runs -- it is knowable
|
|
443
|
+
before the cure starts. So
|
|
444
|
+
htpolynet could warn at config time that a run will yield far less
|
|
445
|
+
crosslinker conversion than the cube law implies, which is the number a user
|
|
446
|
+
is actually reasoning with. The existing `iterations < f` warning fires only
|
|
447
|
+
after the fact and only in the exactly zero regime.
|
|
448
|
+
|
|
449
|
+
**Do not key it on `desired_conversion`, and do not key it on chi_bond
|
|
450
|
+
either.** chi_bond is a config-time proxy, not the governing quantity, and
|
|
451
|
+
the collinearity is not an accident of sampling that more builds would fix.
|
|
452
|
+
Within a fixed iteration count `bonds = 720 x chi_bond` for this system, so
|
|
453
|
+
bonds-per-iteration `= 720 x chi_bond / n` is *exactly* proportional to
|
|
454
|
+
chi_bond. No dataset at fixed `n` can separate them, however large. Breaking
|
|
455
|
+
the proportionality needs `max_conversion_per_iteration` or
|
|
456
|
+
`min_bonds_per_iteration` varied AT FIXED `desired_conversion` -- which is
|
|
457
|
+
a deliberate experiment nobody has run, not something a wider sweep of
|
|
458
|
+
conversions will deliver.
|
|
459
|
+
|
|
460
|
+
There is a further reason to keep it qualitative: the quantity that appears
|
|
461
|
+
to govern the shortfall is the number of bonds formed in the *last*
|
|
462
|
+
iteration, and that is not knowable at config time at all -- it is an
|
|
463
|
+
outcome of the cure, not a setting. Any config-time warning is necessarily
|
|
464
|
+
keyed on a proxy for it.
|
|
465
|
+
|
|
466
|
+
Those same two directives are also why `desired_conversion` is the wrong
|
|
467
|
+
key in ordinary use: they set bonds-per-iteration independently of it, which
|
|
468
|
+
is exactly what the warning at `cure/curecontroller.py:674` already tells a
|
|
469
|
+
user to do to spend more iterations at the same conversion, and what this
|
|
470
|
+
project plans in order to reach 9+ iterations. A threshold keyed on
|
|
471
|
+
`desired_conversion` alone would misfire on precisely the runs that took
|
|
472
|
+
htpolynet's own advice.
|
|
473
|
+
|
|
474
|
+
So keep it qualitative until something separates the two. A warning saying
|
|
475
|
+
"below about 0.7 the cube law overstates badly, and worsens as you go lower"
|
|
476
|
+
needs no attribution and could ship soon. One that quotes a number needs both
|
|
477
|
+
the separation and a sense of how much of the curve is BADCy-specific -- it
|
|
478
|
+
is one chemistry, one force field, one cure protocol, n = 1 per target apart
|
|
479
|
+
from a single duplicate.
|
|
310
480
|
|
|
311
481
|
- **`completion_bias` biases the `B` side only, and that is a convention,
|
|
312
482
|
not a law.** The new `CURE.controls.completion_bias` ranks bond candidates
|
{htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/results.rst
RENAMED
|
@@ -51,7 +51,10 @@ Diagnostic-log plots:
|
|
|
51
51
|
0.90 leaves a cyanate conversion near 0.73 -- a little above it
|
|
52
52
|
here, since this cure takes nine iterations and the distance-ranked
|
|
53
53
|
search keeps re-finding crosslinkers that are partly bonded. The
|
|
54
|
-
cube is
|
|
54
|
+
cube is an estimate rather than a bound, and only near this run's
|
|
55
|
+
own bond conversion: at 0.74–0.90 real runs scatter a few percent
|
|
56
|
+
either side of it, but by 0.5 they fall short of it by tens of
|
|
57
|
+
percent, always on the same side. A cure that
|
|
55
58
|
reaches its target in two or three iterations lands far below it,
|
|
56
59
|
and in fewer than three it lands at exactly zero, because at most
|
|
57
60
|
one bond per residue forms per iteration. htpolynet reports
|
|
@@ -176,13 +176,22 @@ Spec fields
|
|
|
176
176
|
the driver searches for the clearest direction, holding both bond
|
|
177
177
|
lengths fixed so only the orientation moves, and stops as soon as it
|
|
178
178
|
reaches this clearance. Default 0.15 nm, which is about what a
|
|
179
|
-
steepest-descent minimization absorbs. It is a demanding default
|
|
180
|
-
at the heavy-atom density of a cured thermoset
|
|
181
|
-
above the room a typical site has along the O-H vector,
|
|
182
|
-
direction search runs for
|
|
183
|
-
rubber-stamping them.
|
|
184
|
-
|
|
185
|
-
|
|
179
|
+
steepest-descent minimization absorbs. It is a demanding default,
|
|
180
|
+
and deliberately so: at the heavy-atom density of a cured thermoset
|
|
181
|
+
it sits well above the room a typical site has along the O-H vector,
|
|
182
|
+
so the direction search runs for most caps rather than
|
|
183
|
+
rubber-stamping them. Measured on 14 independent cured
|
|
184
|
+
bisphenol-A-cyanate-ester boxes at about 53 heavy atoms per
|
|
185
|
+
nm\ :sup:`3` (1955 caps in total), the median clearance along the
|
|
186
|
+
O-H vector was 0.120 nm — below the target — and 37 % of caps would
|
|
187
|
+
have been placed within 0.10 nm of a neighbour had that direction
|
|
188
|
+
been taken blind. That is the intent, and it is not a symptom: a
|
|
189
|
+
run reporting that most caps needed a search is the default working.
|
|
190
|
+
|
|
191
|
+
Demanding is not the same as unreachable. In those same 14 boxes
|
|
192
|
+
the search found the target for all but 1 cap of 1955, so a run
|
|
193
|
+
reporting more than an occasional ``n_below_target`` is saying
|
|
194
|
+
something about the box, not about the threshold.
|
|
186
195
|
|
|
187
196
|
The clearance is measured only against atoms the cap is *not* bonded
|
|
188
197
|
through — the bridge oxygen itself and its aryl carbon are excluded,
|
|
@@ -334,9 +343,9 @@ bond conversion: a run at a bond conversion of 0.90 lands near 0.73.
|
|
|
334
343
|
A run reported as "90 % cured" on the strength of the cure log is, as
|
|
335
344
|
a cured structure, closer to three-quarters converted.
|
|
336
345
|
|
|
337
|
-
**The cube law holds only
|
|
338
|
-
that it overstates the result, and there are two regimes with a
|
|
339
|
-
boundary between them.
|
|
346
|
+
**The cube law holds only once the cure has taken enough iterations.**
|
|
347
|
+
Below that it overstates the result, and there are two regimes with a
|
|
348
|
+
hard boundary between them.
|
|
340
349
|
|
|
341
350
|
* **Fewer than** ``f`` **iterations: the crosslinker conversion is
|
|
342
351
|
exactly zero.** The bond downselection admits at most one bond per
|
|
@@ -345,28 +354,97 @@ boundary between them.
|
|
|
345
354
|
constraint rather than a tendency: it holds whatever the bond
|
|
346
355
|
conversion reached. A cure that hits its target in two iterations
|
|
347
356
|
builds a monomer melt with no junctions at all, however healthy its
|
|
348
|
-
reported bond conversion looks
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
357
|
+
reported bond conversion looks.
|
|
358
|
+
* **At or above** ``f`` **iterations: the iteration count does not
|
|
359
|
+
determine the shortfall.** Four trifunctional runs that each took
|
|
360
|
+
exactly three iterations came out at 0.06, 0.63, 0.80 and 0.94 of
|
|
361
|
+
the cube-law figure — a fifteenfold spread at an identical iteration
|
|
362
|
+
count, ordered by their bond conversions of 0.40, 0.50, 0.55 and
|
|
363
|
+
0.58. Measured ratios to the cube law across a series of runs: 0.00
|
|
364
|
+
at two iterations, 0.06–0.94 at three, 0.86 at four, 1.02 ± 0.03
|
|
365
|
+
over 14 runs at five to eight, 1.01–1.04 across the four-run
|
|
366
|
+
nine-iteration cohort — where the spread at three iterations is the
|
|
367
|
+
bond-conversion spread just described, not an iteration effect.
|
|
368
|
+
What sets the *size* of the shortfall looks like the distribution of
|
|
369
|
+
the bonds across those iterations, and specifically how many the
|
|
370
|
+
last iteration formed — it is the one that has to supply a
|
|
371
|
+
crosslinker's final bond, and the per-iteration bond count decays
|
|
372
|
+
steeply, so the average is not what matters. The run at 0.06 above
|
|
373
|
+
spent its last iteration on 9 bonds against an average of 96, so
|
|
374
|
+
almost no crosslinker could complete; a run at the same bond
|
|
375
|
+
conversion built five months earlier under an older htpolynet spent
|
|
376
|
+
its own last iteration on 10 and landed at the same ratio to three
|
|
377
|
+
digits. That is the best account available and it rests on few
|
|
378
|
+
runs. The one-bond-per-residue rule alone accounts for about a
|
|
379
|
+
fifth of the shortfall.
|
|
380
|
+
|
|
381
|
+
htpolynet warns about both of these at the end of the cure, because
|
|
382
|
+
nothing else in the output would tell you. Below ``f`` iterations it
|
|
383
|
+
says so by name, since the cause is then known exactly. At or above
|
|
384
|
+
``f`` it counts how many crosslinkers actually ended up reacted at all
|
|
385
|
+
of their sites — an exact number by that point, not an estimate — and
|
|
386
|
+
warns when that is a small enough fraction that a percolating network
|
|
387
|
+
should not be assumed. The count is logged either way. The second
|
|
388
|
+
case is the one that matters in practice: a cure can run exactly ``f``
|
|
389
|
+
iterations, reach its target bond conversion, and still finish with
|
|
390
|
+
almost no complete crosslinkers if its last iteration formed few
|
|
391
|
+
bonds.
|
|
392
|
+
|
|
393
|
+
Proximity works the other way, and it is what closes the gap. The
|
|
394
|
+
search is distance-ranked and a partly-bonded crosslinker already sits
|
|
395
|
+
in a bridge-rich neighbourhood, so it keeps getting re-found: a weak
|
|
396
|
+
version of ``completion_bias`` for free. That is a bias of a couple
|
|
397
|
+
of percent, not a bound, and runs land on both sides of the cube.
|
|
398
|
+
|
|
399
|
+
The recovery is complete well before the many-iteration limit, but it
|
|
400
|
+
arrives as a two-sided estimate rather than as a floor. Across 14
|
|
401
|
+
independent trifunctional runs at 1.7–2.7 ``f`` iterations and bond
|
|
402
|
+
conversions of 0.74–0.90, the crosslinker conversion sat **+2.0 %**
|
|
403
|
+
from the cube on average, with a standard deviation of 2.9 % and a
|
|
404
|
+
range of −3.7 % to +6.3 %; 3 of the 14 landed *below* the cube,
|
|
405
|
+
against a replicate scatter of 0.8–1.8 %, so those excursions are real
|
|
406
|
+
and not measurement noise.
|
|
407
|
+
|
|
408
|
+
That band is bounded from below, and the bound is sharp. A separate
|
|
409
|
+
array of 12 runs at bond conversions of 0.40–0.73 does not behave like
|
|
410
|
+
a two-sided estimate at all: 11 of the 12 landed *below* the cube, by
|
|
411
|
+
−19.9 % on average, worsening monotonically as the bond conversion
|
|
412
|
+
falls and reaching −93.6 % at a bond conversion of 0.40 — an
|
|
413
|
+
overstatement by a factor of 15. So ± 3 % is not the cube law's
|
|
414
|
+
general accuracy. Carried down to a bond conversion of 0.5 it
|
|
415
|
+
understates the error by an order of magnitude, and in a predictable
|
|
416
|
+
direction: the cube is always the optimistic side down there.
|
|
417
|
+
|
|
418
|
+
The accuracy is stated against bond conversion because that is what it
|
|
419
|
+
tracks — over 26 runs the correlation with bond conversion is +0.81
|
|
420
|
+
against +0.57 for the iteration count, and the fifteenfold spread at a
|
|
421
|
+
fixed iteration count above rules the iteration count out as the sole
|
|
422
|
+
determinant. It does not follow that the bond conversion is the
|
|
423
|
+
governing quantity. Within a fixed iteration count the *average*
|
|
424
|
+
number of bonds formed per iteration is exactly proportional to the
|
|
425
|
+
bond conversion, so no set of runs sharing an iteration count can tell
|
|
426
|
+
those two apart, and every run here shares one with several others.
|
|
427
|
+
Treat the bond conversion as the variable to *read* the accuracy
|
|
428
|
+
against; the mechanism, as far as it is understood, is the one
|
|
429
|
+
described above, and the bond conversion stands in for how the bonds
|
|
430
|
+
were distributed rather than replacing it.
|
|
431
|
+
|
|
432
|
+
Further out than that it is not settled. The four runs of the
|
|
433
|
+
nine-iteration cohort all landed above the cube, by +0.6 % to +3.5 %,
|
|
434
|
+
which reads like a bound — but four points cannot separate a bound
|
|
435
|
+
from the upper tail of a two-sided distribution, and the scatter
|
|
436
|
+
measured at 1.7–2.7 ``f`` cannot simply be carried to 3 ``f``, since
|
|
437
|
+
whether the deviation depends on the regime is the very thing at issue
|
|
438
|
+
here. So the correction below applies where it was measured: at
|
|
439
|
+
1.7–2.7 ``f`` the cube is demonstrably not a floor. At 3 ``f`` it is
|
|
440
|
+
untested, not disproved.
|
|
441
|
+
|
|
442
|
+
So the cube is a useful estimate over a specific band — good to about
|
|
443
|
+
3 % at bond conversions of 0.74–0.90 and 1.7–2.7 ``f`` iterations, and
|
|
444
|
+
across that band not a floor. Outside it, in either direction, it
|
|
445
|
+
overstates the result: by an amount the iteration count will not tell
|
|
446
|
+
you below ``f``, and by up to a factor of 15 at low bond conversion.
|
|
447
|
+
The only trustworthy number anywhere is the measured one that repair
|
|
370
448
|
reports.
|
|
371
449
|
|
|
372
450
|
``completion_bias`` does not lift the iteration floor — it changes
|
|
@@ -418,26 +496,39 @@ with the full placement record in the same YAML file:
|
|
|
418
496
|
These do not all mean the same kind of thing, and reading them as if
|
|
419
497
|
they did is the mistake to avoid:
|
|
420
498
|
|
|
421
|
-
* ``
|
|
422
|
-
which is where a placement failure actually lives
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
499
|
+
* ``n_below_target`` is the one **achieved** number that describes the
|
|
500
|
+
tail, which is where a placement failure actually lives.
|
|
501
|
+
* ``min_clearance_nm`` and ``median_clearance_nm`` are **placement
|
|
502
|
+
outcomes, not measurements of the site**. The search stops at the
|
|
503
|
+
first direction that reaches the target, so both are pulled toward
|
|
504
|
+
``cap_min_clearance`` by construction and partly report the
|
|
505
|
+
threshold you set rather than how crowded the box is. The median is
|
|
506
|
+
pulled; the minimum is pinned. Whenever the search succeeds for
|
|
507
|
+
every cap, the worst-placed cap is by construction one that only
|
|
508
|
+
just cleared the target, so ``min_clearance_nm`` lands just above it
|
|
509
|
+
— measured at 0.1503 ± 0.0006 nm against a 0.150 nm target across 14
|
|
510
|
+
independent boxes, and the single box that came in below (0.1488)
|
|
511
|
+
was the single box with a non-zero ``n_below_target``. So
|
|
512
|
+
``min_clearance_nm`` carries nothing that ``n_below_target`` has not
|
|
513
|
+
already said, and in particular it is not something to calibrate
|
|
514
|
+
``cap_min_clearance`` against: it is the threshold seen from above.
|
|
430
515
|
* ``blind_min_clearance_nm`` and ``blind_median_clearance_nm`` are the
|
|
431
|
-
crowding statistics
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
516
|
+
crowding statistics, and the blind minimum is the real tail
|
|
517
|
+
statistic — it ranged 0.006–0.048 nm across those 14 boxes while the
|
|
518
|
+
achieved minimum sat on the target. Both are measured along the
|
|
519
|
+
single fixed O-H direction with no search and no early exit, so they
|
|
520
|
+
describe the site rather than the algorithm, and they are the ones
|
|
521
|
+
to correlate across a series of runs and to calibrate the target
|
|
522
|
+
against. ``n_blind_would_overlap`` counts the caps that direction
|
|
523
|
+
alone would have put inside 0.10 nm of a neighbour — which is what
|
|
524
|
+
placement did before the direction search existed, and which came to
|
|
525
|
+
37 % of caps on those boxes.
|
|
437
526
|
* ``n_preferred_out_of_angle`` separates the two reasons a preferred
|
|
438
527
|
direction gets abandoned. A large value means the C-O-C angle
|
|
439
528
|
window is rejecting real O-H vectors, which would look exactly like
|
|
440
|
-
a crowded box in every other field.
|
|
529
|
+
a crowded box in every other field. On the 14 boxes above it was
|
|
530
|
+
6 % of caps, so the 90–150° window is not what is sending caps to
|
|
531
|
+
the search; a value several times that is the one to act on.
|
|
441
532
|
|
|
442
533
|
That count is worth watching, because it is the quantity that predicts
|
|
443
534
|
whether this stage survives. It is an identity — every bond the cure
|