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.
Files changed (338) hide show
  1. {htpolynet-2.6.1 → htpolynet-2.6.2}/CHANGELOG.md +100 -0
  2. {htpolynet-2.6.1 → htpolynet-2.6.2}/PKG-INFO +1 -1
  3. {htpolynet-2.6.1 → htpolynet-2.6.2}/ROADMAP.md +192 -22
  4. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/results.rst +4 -1
  5. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/postcure-repair.rst +139 -48
  6. {htpolynet-2.6.1 → htpolynet-2.6.2}/pyproject.toml +1 -1
  7. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/curecontroller.py +53 -23
  8. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_completion_bias.py +58 -7
  9. {htpolynet-2.6.1 → htpolynet-2.6.2}/.claude/settings.json +0 -0
  10. {htpolynet-2.6.1 → htpolynet-2.6.2}/.claude/skills/htpolynet/SKILL.md +0 -0
  11. {htpolynet-2.6.1 → htpolynet-2.6.2}/.envrc +0 -0
  12. {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/conda-forge-sync.yml +0 -0
  13. {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/docker.yml +0 -0
  14. {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/release.yaml +0 -0
  15. {htpolynet-2.6.1 → htpolynet-2.6.2}/.github/workflows/test.yml +0 -0
  16. {htpolynet-2.6.1 → htpolynet-2.6.2}/.gitignore +0 -0
  17. {htpolynet-2.6.1 → htpolynet-2.6.2}/.readthedocs.yaml +0 -0
  18. {htpolynet-2.6.1 → htpolynet-2.6.2}/CITATION.cff +0 -0
  19. {htpolynet-2.6.1 → htpolynet-2.6.2}/CLAUDE.md +0 -0
  20. {htpolynet-2.6.1 → htpolynet-2.6.2}/LICENSE +0 -0
  21. {htpolynet-2.6.1 → htpolynet-2.6.2}/MANIFEST.in +0 -0
  22. {htpolynet-2.6.1 → htpolynet-2.6.2}/README.md +0 -0
  23. {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/Dockerfile +0 -0
  24. {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/compose.yml +0 -0
  25. {htpolynet-2.6.1 → htpolynet-2.6.2}/docker/docker-entrypoint.sh +0 -0
  26. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/Makefile +0 -0
  27. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/README.rst +0 -0
  28. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/make.bat +0 -0
  29. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/requirements.txt +0 -0
  30. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/_static/.gitkeep +0 -0
  31. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/changelog.rst +0 -0
  32. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/conf.py +0 -0
  33. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
  34. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
  35. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
  36. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
  37. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
  38. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
  39. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
  40. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
  41. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
  42. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
  43. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
  44. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
  45. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
  46. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
  47. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
  48. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
  49. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
  50. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
  51. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
  52. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
  53. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
  54. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
  55. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
  56. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
  57. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
  58. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
  59. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
  60. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
  61. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
  62. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
  63. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
  64. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
  65. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
  66. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
  67. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
  68. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
  69. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
  70. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
  71. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
  72. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
  73. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
  74. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
  75. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
  76. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
  77. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
  78. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
  79. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
  80. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
  81. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
  82. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
  83. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
  84. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
  85. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
  86. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
  87. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
  88. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
  89. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
  90. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
  91. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
  92. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
  93. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
  94. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
  95. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
  96. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
  97. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
  98. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
  99. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
  100. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
  101. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
  102. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
  103. {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
  104. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
  105. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
  106. {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
  107. {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
  108. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
  109. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
  110. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
  111. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
  112. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
  113. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
  114. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
  115. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
  116. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
  117. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
  118. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
  119. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
  120. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
  121. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
  122. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
  123. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
  124. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
  125. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
  126. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
  127. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
  128. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
  129. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
  130. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
  131. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
  132. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
  133. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
  134. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
  135. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
  136. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
  137. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
  138. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
  139. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
  140. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
  141. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
  142. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
  143. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
  144. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
  145. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
  146. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
  147. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
  148. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
  149. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
  150. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
  151. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
  152. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
  153. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
  154. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
  155. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
  156. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
  157. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
  158. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
  159. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
  160. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
  161. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
  162. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
  163. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
  164. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
  165. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
  166. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
  167. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/example-tutorials/index.rst +0 -0
  168. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/htpolynetpackage.rst +0 -0
  169. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/index.rst +0 -0
  170. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/install.rst +0 -0
  171. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references/index.rst +0 -0
  172. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references/mol2-reference.pdf +0 -0
  173. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/references.bib +0 -0
  174. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/release-history.rst +0 -0
  175. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/CURE.odg +0 -0
  176. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/bond_filter.odg +0 -0
  177. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/building-a-system.rst +0 -0
  178. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
  179. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
  180. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configs/configs-for-run.rst +0 -0
  181. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/configuration-files.rst +0 -0
  182. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/container-usage.rst +0 -0
  183. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/flow1.odg +0 -0
  184. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/flow1yaml.odg +0 -0
  185. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/hydrogenated.eps +0 -0
  186. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/hydrogenated.fig +0 -0
  187. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/index.rst +0 -0
  188. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
  189. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/STY.png +0 -0
  190. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/STYCC.png +0 -0
  191. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
  192. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/bond_filter.png +0 -0
  193. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
  194. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
  195. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/hydrogenated.png +0 -0
  196. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
  197. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
  198. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/program-flow.rst +0 -0
  199. {htpolynet-2.6.1 → htpolynet-2.6.2}/docs/source/user-guide/usage.rst +0 -0
  200. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/check-conda-sync.py +0 -0
  201. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/release.sh +0 -0
  202. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-detail.sh +0 -0
  203. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-detail.tcl +0 -0
  204. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/render-snapshot.sh +0 -0
  205. {htpolynet-2.6.1 → htpolynet-2.6.2}/scripts/run_all_examples.sh +0 -0
  206. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/__init__.py +0 -0
  207. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/__init__.py +0 -0
  208. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/analyze.py +0 -0
  209. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/plot.py +0 -0
  210. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/postsim.py +0 -0
  211. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/analysis/utils.py +0 -0
  212. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cli.py +0 -0
  213. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/__init__.py +0 -0
  214. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/bondtemplate.py +0 -0
  215. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/configuration.py +0 -0
  216. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/coordinates.py +0 -0
  217. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/molecule.py +0 -0
  218. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/paramcache.py +0 -0
  219. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/projectfilesystem.py +0 -0
  220. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/runtime.py +0 -0
  221. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/topocoord.py +0 -0
  222. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/core/topology.py +0 -0
  223. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/__init__.py +0 -0
  224. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/chain.py +0 -0
  225. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/expandreactions.py +0 -0
  226. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/cure/reaction.py +0 -0
  227. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/__init__.py +0 -0
  228. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/ambertools.py +0 -0
  229. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/command.py +0 -0
  230. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/gromacs.py +0 -0
  231. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/slurm.py +0 -0
  232. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/smiles_input.py +0 -0
  233. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/external/software.py +0 -0
  234. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/__init__.py +0 -0
  235. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/bondlist.py +0 -0
  236. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/lattice.py +0 -0
  237. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/linkcell.py +0 -0
  238. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/matrix4.py +0 -0
  239. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/geometry/ring.py +0 -0
  240. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/__init__.py +0 -0
  241. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/gro.py +0 -0
  242. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/mol2.py +0 -0
  243. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/io/pdb.py +0 -0
  244. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/__init__.py +0 -0
  245. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/cyanate_cap.py +0 -0
  246. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/repair/topology_surgery.py +0 -0
  247. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/README.md +0 -0
  248. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/__init__.py +0 -0
  249. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/claude/SKILL.md +0 -0
  250. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
  251. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
  252. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
  253. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
  254. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
  255. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
  256. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
  257. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/README.md +0 -0
  258. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
  259. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
  260. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
  261. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/min.mdp +0 -0
  262. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/npt.mdp +0 -0
  263. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
  264. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
  265. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
  266. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
  267. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
  268. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
  269. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
  270. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
  271. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
  272. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
  273. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
  274. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
  275. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
  276. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
  277. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
  278. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
  279. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
  280. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
  281. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
  282. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
  283. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
  284. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
  285. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
  286. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
  287. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
  288. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
  289. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
  290. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
  291. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
  292. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
  293. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/resources/tcl/render.tcl +0 -0
  294. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/__init__.py +0 -0
  295. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/banner.py +0 -0
  296. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/checkpoint.py +0 -0
  297. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/dataframetools.py +0 -0
  298. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/inputcheck.py +0 -0
  299. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/logsetup.py +0 -0
  300. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/profiling.py +0 -0
  301. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/stringthings.py +0 -0
  302. {htpolynet-2.6.1 → htpolynet-2.6.2}/src/htpolynet/utils/vmd_viz.py +0 -0
  303. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/__init__.py +0 -0
  304. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/conftest.py +0 -0
  305. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/__init__.py +0 -0
  306. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config1.gro +0 -0
  307. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config1.top +0 -0
  308. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config2.gro +0 -0
  309. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/config2.top +0 -0
  310. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items31.edr +0 -0
  311. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items43.edr +0 -0
  312. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/items45.edr +0 -0
  313. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/fixtures/short.mdp +0 -0
  314. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_bondtemplate.py +0 -0
  315. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_cap_placement.py +0 -0
  316. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_chain.py +0 -0
  317. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_configuration.py +0 -0
  318. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_dataframetools.py +0 -0
  319. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gpu_usability.py +0 -0
  320. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
  321. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
  322. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_inputcheck.py +0 -0
  323. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_linkcell_pierce.py +0 -0
  324. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_paramcache.py +0 -0
  325. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_paramcache_ambertools.py +0 -0
  326. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_parameterize_react.py +0 -0
  327. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_plot_smoke.py +0 -0
  328. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_projectfilesystem.py +0 -0
  329. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_repair_conversion.py +0 -0
  330. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_resources.py +0 -0
  331. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_ring.py +0 -0
  332. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_ring_pierce_figs.py +0 -0
  333. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_setup_claude.py +0 -0
  334. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_slurm_script.py +0 -0
  335. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_smiles_input.py +0 -0
  336. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_software_provenance.py +0 -0
  337. {htpolynet-2.6.1 → htpolynet-2.6.2}/tests/unit/test_topology/test.top +0 -0
  338. {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.1
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 is the fire rate in a box at polymer density. Next time a full
190
- cyanate-ester build runs, read `min_clearance_nm`, `median_clearance_nm`,
191
- `n_below_target` and `n_preferred_out_of_angle` out of `repair-summary.yaml`
192
- and set the default so it flags the tail rather than the bulk. A threshold
193
- that fires on everything is not a threshold. If `n_preferred_out_of_angle`
194
- comes back large, the 90--150 degree window is biting real O-H vectors and
195
- is the thing to change, not the clearance.
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. Do it after there is one clean real-box measurement
290
- to compare against. Until then the docs say which fields are placement
291
- outcomes and which are crowding measurements, and
292
- `blind_median_clearance_nm` -- one fixed direction, no search, no early
293
- exit -- is the statistic to correlate on.
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 crosslinker conversion is exactly zero,
297
- a counting constraint; at nine iterations real runs land 1--3 % above the
298
- cube. In between, measured ratios to the cube law are 0.06 and 0.46--0.50 at
299
- three iterations and 0.86 at four -- an eightfold spread at an *identical*
300
- iteration count, so the iteration count does not determine it. The
301
- one-bond-per-residue-per-iteration rule was simulated against this and moves
302
- the n=3 prediction only from 30.0 to 25.9 against 15 observed: about a fifth
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: the eightfold spread
309
- at fixed `n` shows no threshold on `n` can work.
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
@@ -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 only a floor in that many-iteration limit; a cure that
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 it sits a little
181
- above the room a typical site has along the O-H vector, so the
182
- direction search runs for roughly half of all caps rather than
183
- rubber-stamping them. That is the intent — the search exists for
184
- the crowded half — but it means a run reporting that most caps
185
- needed a search is behaving normally, not signalling a bad box.
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 when the cure took many iterations.** Below
338
- that it overstates the result, and there are two regimes with a hard
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, and htpolynet warns when a run ends
349
- this way since nothing else in the output would tell you.
350
- * **At or above** ``f`` **iterations: the shortfall depends on how the
351
- bonds were distributed across those iterations, not on how many
352
- there were.** Two trifunctional runs that both took three
353
- iterations came out at 6 % and 50 % of the cube-law figure — an
354
- eightfold spread at an identical iteration count. Measured ratios
355
- to the cube law across a series of runs: 0.00 at two iterations,
356
- 0.06–0.50 at three, 0.86 at four, 1.01–1.04 at nine. The mechanism
357
- behind the residual is not identified; the one-bond-per-residue rule
358
- accounts for only about a fifth of it.
359
-
360
- Given many iterations, proximity works the other way. The search is
361
- distance-ranked and a partly-bonded crosslinker already sits in a
362
- bridge-rich neighbourhood, so it keeps getting re-found: a weak
363
- version of ``completion_bias`` for free. That is what puts long runs
364
- a couple of percent *above* the cube, and it is expected behaviour
365
- rather than a sign anything is wrong.
366
-
367
- So the cube is a floor only in the many-iteration limit. Anywhere
368
- below it the iteration count will not tell you how far short you fell,
369
- and the only trustworthy number is the measured one that repair
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
- * ``min_clearance_nm`` and ``n_below_target`` describe the **tail**,
422
- which is where a placement failure actually lives, and they are what
423
- ``cap_min_clearance`` should be calibrated against.
424
- * ``median_clearance_nm`` is a **placement outcome, not a measurement
425
- of the site**. The search stops at the first direction that reaches
426
- the target, so this number is pulled toward ``cap_min_clearance`` by
427
- construction and partly reports the threshold you set rather than
428
- how crowded the box is. It answers "how did the caps end up", which
429
- is a fair question, but it is not a crowding statistic.
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. They are measured along the single fixed O-H
432
- direction with no search and no early exit, so they describe the
433
- site rather than the algorithm, and they are the ones to correlate
434
- across a series of runs. ``n_blind_would_overlap`` counts the caps
435
- that direction alone would have put inside 0.10 nm of a neighbour —
436
- which is what placement did before the direction search existed.
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "htpolynet"
7
- version = "2.6.1"
7
+ version = "2.6.2"
8
8
  authors = [
9
9
  { name="Cameron F Abrams", email="cfa22@drexel.edu" },
10
10
  ]