loadpath 0.1.1__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 (297) hide show
  1. loadpath-0.1.1/LICENSE +21 -0
  2. loadpath-0.1.1/PKG-INFO +319 -0
  3. loadpath-0.1.1/README.md +258 -0
  4. loadpath-0.1.1/loadpath/README.md +294 -0
  5. loadpath-0.1.1/loadpath/SKILL.md +584 -0
  6. loadpath-0.1.1/loadpath/__init__.py +17 -0
  7. loadpath-0.1.1/loadpath/__main__.py +1202 -0
  8. loadpath-0.1.1/loadpath/am.py +316 -0
  9. loadpath-0.1.1/loadpath/amgfast.py +326 -0
  10. loadpath-0.1.1/loadpath/assembly.py +985 -0
  11. loadpath-0.1.1/loadpath/benchmarks/__init__.py +0 -0
  12. loadpath-0.1.1/loadpath/benchmarks/beams.py +266 -0
  13. loadpath-0.1.1/loadpath/benchmarks/cases/ge-bracket.json +380 -0
  14. loadpath-0.1.1/loadpath/benchmarks/evaluate.py +172 -0
  15. loadpath-0.1.1/loadpath/benchmarks/mechanisms.py +416 -0
  16. loadpath-0.1.1/loadpath/benchmarks/problems.py +140 -0
  17. loadpath-0.1.1/loadpath/benchmarks/reference/bridge-3d.top3d.npz +0 -0
  18. loadpath-0.1.1/loadpath/benchmarks/reference/cantilever-3d.top3d.npz +0 -0
  19. loadpath-0.1.1/loadpath/benchmarks/reference/lbracket-2d.top88-ft2.npz +0 -0
  20. loadpath-0.1.1/loadpath/benchmarks/reference/mbb-2d.top88-ft1.npz +0 -0
  21. loadpath-0.1.1/loadpath/benchmarks/reference/mbb-2d.top88-ft2.npz +0 -0
  22. loadpath-0.1.1/loadpath/benchmarks/reference.py +138 -0
  23. loadpath-0.1.1/loadpath/benchmarks/run.py +301 -0
  24. loadpath-0.1.1/loadpath/brep.py +1470 -0
  25. loadpath-0.1.1/loadpath/bucklingopt.py +300 -0
  26. loadpath-0.1.1/loadpath/buildsim.py +1490 -0
  27. loadpath-0.1.1/loadpath/cadimport.py +904 -0
  28. loadpath-0.1.1/loadpath/calibration.py +885 -0
  29. loadpath-0.1.1/loadpath/cavities.py +211 -0
  30. loadpath-0.1.1/loadpath/checks/__init__.py +0 -0
  31. loadpath-0.1.1/loadpath/checks/dfm.py +354 -0
  32. loadpath-0.1.1/loadpath/checks/exchanger.py +7 -0
  33. loadpath-0.1.1/loadpath/checks/fea.py +212 -0
  34. loadpath-0.1.1/loadpath/checks/fit.py +475 -0
  35. loadpath-0.1.1/loadpath/checks/networks.py +260 -0
  36. loadpath-0.1.1/loadpath/checks/opening.py +67 -0
  37. loadpath-0.1.1/loadpath/checks/sdf_kit.py +7 -0
  38. loadpath-0.1.1/loadpath/conjugate.py +267 -0
  39. loadpath-0.1.1/loadpath/constrained.py +329 -0
  40. loadpath-0.1.1/loadpath/contact.py +691 -0
  41. loadpath-0.1.1/loadpath/coopt.py +342 -0
  42. loadpath-0.1.1/loadpath/cores.py +163 -0
  43. loadpath-0.1.1/loadpath/crease.py +1138 -0
  44. loadpath-0.1.1/loadpath/critic.py +212 -0
  45. loadpath-0.1.1/loadpath/crosscheck.py +1107 -0
  46. loadpath-0.1.1/loadpath/cutcell.py +510 -0
  47. loadpath-0.1.1/loadpath/data/lattice_buckling.json +439 -0
  48. loadpath-0.1.1/loadpath/data/lattice_tensors.json +27449 -0
  49. loadpath-0.1.1/loadpath/data/published_experiments.json +71 -0
  50. loadpath-0.1.1/loadpath/decimate.py +177 -0
  51. loadpath-0.1.1/loadpath/delivery.py +190 -0
  52. loadpath-0.1.1/loadpath/directions.py +262 -0
  53. loadpath-0.1.1/loadpath/domain.py +630 -0
  54. loadpath-0.1.1/loadpath/drains.py +615 -0
  55. loadpath-0.1.1/loadpath/durability.py +413 -0
  56. loadpath-0.1.1/loadpath/editor.html +3135 -0
  57. loadpath-0.1.1/loadpath/editor.py +610 -0
  58. loadpath-0.1.1/loadpath/escape.py +354 -0
  59. loadpath-0.1.1/loadpath/evals/__init__.py +0 -0
  60. loadpath-0.1.1/loadpath/evals/baselines/coarse.json +1543 -0
  61. loadpath-0.1.1/loadpath/evals/baselines/full.json +1497 -0
  62. loadpath-0.1.1/loadpath/evals/brief_kinds/__init__.py +1 -0
  63. loadpath-0.1.1/loadpath/evals/brief_kinds/heatx.py +387 -0
  64. loadpath-0.1.1/loadpath/evals/brief_kinds/lattice.py +571 -0
  65. loadpath-0.1.1/loadpath/evals/brief_kinds/multimat.py +593 -0
  66. loadpath-0.1.1/loadpath/evals/briefs/assets/bracket.step +1201 -0
  67. loadpath-0.1.1/loadpath/evals/briefs/assets/desk_arm.urdf +22 -0
  68. loadpath-0.1.1/loadpath/evals/briefs/assets/elbow-gearbox.stl +0 -0
  69. loadpath-0.1.1/loadpath/evals/briefs/assets/motor-body.stl +0 -0
  70. loadpath-0.1.1/loadpath/evals/briefs/assets/sketch.png +0 -0
  71. loadpath-0.1.1/loadpath/evals/briefs/base-adapter-fdm.json +492 -0
  72. loadpath-0.1.1/loadpath/evals/briefs/bell-crank-lpbf.json +180 -0
  73. loadpath-0.1.1/loadpath/evals/briefs/belt-tensioner-fdm.json +151 -0
  74. loadpath-0.1.1/loadpath/evals/briefs/camera-boom-mjf.json +339 -0
  75. loadpath-0.1.1/loadpath/evals/briefs/camera-mount-pla.json +203 -0
  76. loadpath-0.1.1/loadpath/evals/briefs/coolant-isolator-petg.json +100 -0
  77. loadpath-0.1.1/loadpath/evals/briefs/elbow-bearing-bracket-sls.json +300 -0
  78. loadpath-0.1.1/loadpath/evals/briefs/elbow-gearbox-forearm-mjf.json +558 -0
  79. loadpath-0.1.1/loadpath/evals/briefs/elbow-link-fatigue-fdm.json +251 -0
  80. loadpath-0.1.1/loadpath/evals/briefs/elbow-stop-pad-tpu.json +39 -0
  81. loadpath-0.1.1/loadpath/evals/briefs/forearm-fdm.json +146 -0
  82. loadpath-0.1.1/loadpath/evals/briefs/forearm-servo-link-fdm.json +327 -0
  83. loadpath-0.1.1/loadpath/evals/briefs/grip-pad-finger-mm.json +354 -0
  84. loadpath-0.1.1/loadpath/evals/briefs/gripper-bracket-creep-fdm.json +340 -0
  85. loadpath-0.1.1/loadpath/evals/briefs/gripper-finger-fdm.json +155 -0
  86. loadpath-0.1.1/loadpath/evals/briefs/gripper-jaw-fatigue-mjf.json +328 -0
  87. loadpath-0.1.1/loadpath/evals/briefs/gripper-palm-fdm.json +715 -0
  88. loadpath-0.1.1/loadpath/evals/briefs/hot-stepper-mount-asa-fdm.json +471 -0
  89. loadpath-0.1.1/loadpath/evals/briefs/hpu-oil-cooler-lpbf.json +121 -0
  90. loadpath-0.1.1/loadpath/evals/briefs/isolated-camera-mount-mm.json +675 -0
  91. loadpath-0.1.1/loadpath/evals/briefs/kart-charge-cooler-lpbf.json +93 -0
  92. loadpath-0.1.1/loadpath/evals/briefs/lighten-step-bracket.json +220 -0
  93. loadpath-0.1.1/loadpath/evals/briefs/nema17-mount-stl.json +429 -0
  94. loadpath-0.1.1/loadpath/evals/briefs/pillow-block-sls.json +220 -0
  95. loadpath-0.1.1/loadpath/evals/briefs/polyjet-fingertip-mm.json +305 -0
  96. loadpath-0.1.1/loadpath/evals/briefs/rod-hook-pla.json +154 -0
  97. loadpath-0.1.1/loadpath/evals/briefs/sensor-arm-resin.json +150 -0
  98. loadpath-0.1.1/loadpath/evals/briefs/shelf-bracket-pla.json +158 -0
  99. loadpath-0.1.1/loadpath/evals/briefs/shoulder-riser-mjf.json +487 -0
  100. loadpath-0.1.1/loadpath/evals/briefs/sketch-clevis.json +229 -0
  101. loadpath-0.1.1/loadpath/evals/briefs/spring-bracket-pacf.json +294 -0
  102. loadpath-0.1.1/loadpath/evals/briefs/tool-flange-ti64.json +280 -0
  103. loadpath-0.1.1/loadpath/evals/briefs/tray-arm-lattice-fdm.json +260 -0
  104. loadpath-0.1.1/loadpath/evals/briefs/turret-fdm.json +281 -0
  105. loadpath-0.1.1/loadpath/evals/briefs/upper-arm-sls.json +179 -0
  106. loadpath-0.1.1/loadpath/evals/briefs/urdf-forearm.json +233 -0
  107. loadpath-0.1.1/loadpath/evals/briefs/wrist-link-mjf.json +278 -0
  108. loadpath-0.1.1/loadpath/evals/briefs/wrist-yoke-mjf.json +245 -0
  109. loadpath-0.1.1/loadpath/evals/briefs.py +393 -0
  110. loadpath-0.1.1/loadpath/evals/cases/arm-link-cast.json +157 -0
  111. loadpath-0.1.1/loadpath/evals/cases/arm-link-driven.json +171 -0
  112. loadpath-0.1.1/loadpath/evals/cases/arm-link-sandwich.json +315 -0
  113. loadpath-0.1.1/loadpath/evals/cases/arm-link.json +111 -0
  114. loadpath-0.1.1/loadpath/evals/cases/bell-crank.json +116 -0
  115. loadpath-0.1.1/loadpath/evals/cases/grip-turret.json +479 -0
  116. loadpath-0.1.1/loadpath/evals/cases/grip-upper-arm.json +253 -0
  117. loadpath-0.1.1/loadpath/evals/cases/grip-wrist-link-mjf.json +929 -0
  118. loadpath-0.1.1/loadpath/evals/cases/grip-wrist-yoke.json +831 -0
  119. loadpath-0.1.1/loadpath/evals/cases/lpbf-intercooler-core.json +59 -0
  120. loadpath-0.1.1/loadpath/evals/cases/mbb-beam.json +61 -0
  121. loadpath-0.1.1/loadpath/evals/cases/motor-body.stl +0 -0
  122. loadpath-0.1.1/loadpath/evals/cases/motor-mount.json +265 -0
  123. loadpath-0.1.1/loadpath/evals/cases/printed-hook.json +77 -0
  124. loadpath-0.1.1/loadpath/evals/cases/wall-bracket-fasteners.json +125 -0
  125. loadpath-0.1.1/loadpath/evals/cases/wall-bracket.json +126 -0
  126. loadpath-0.1.1/loadpath/evals/corpus.py +179 -0
  127. loadpath-0.1.1/loadpath/evals/pareto.py +90 -0
  128. loadpath-0.1.1/loadpath/evals/run.py +860 -0
  129. loadpath-0.1.1/loadpath/examples/arm-link.json +25 -0
  130. loadpath-0.1.1/loadpath/examples/bumpered-bracket-compression.json +225 -0
  131. loadpath-0.1.1/loadpath/examples/bumpered-bracket-lattice.json +204 -0
  132. loadpath-0.1.1/loadpath/examples/bumpered-bracket.json +34 -0
  133. loadpath-0.1.1/loadpath/examples/gripper-finger-mm.json +185 -0
  134. loadpath-0.1.1/loadpath/examples/heat-exchanger-counterflow.json +21 -0
  135. loadpath-0.1.1/loadpath/examples/heat-exchanger-crossflow-tuned.json +48 -0
  136. loadpath-0.1.1/loadpath/examples/heat-exchanger-crossflow.json +20 -0
  137. loadpath-0.1.1/loadpath/examples/pedal-lattice.json +23 -0
  138. loadpath-0.1.1/loadpath/examples/pressure-plenum.json +12 -0
  139. loadpath-0.1.1/loadpath/examples/shelf-bracket.json +27 -0
  140. loadpath-0.1.1/loadpath/exchanger.py +831 -0
  141. loadpath-0.1.1/loadpath/fasteners.py +199 -0
  142. loadpath-0.1.1/loadpath/fem.py +668 -0
  143. loadpath-0.1.1/loadpath/femops.py +70 -0
  144. loadpath-0.1.1/loadpath/fieldjit.py +981 -0
  145. loadpath-0.1.1/loadpath/fieldops.py +119 -0
  146. loadpath-0.1.1/loadpath/fields.py +3697 -0
  147. loadpath-0.1.1/loadpath/fieldtorch.py +464 -0
  148. loadpath-0.1.1/loadpath/flow.py +984 -0
  149. loadpath-0.1.1/loadpath/flowtopo.py +300 -0
  150. loadpath-0.1.1/loadpath/gpu.py +521 -0
  151. loadpath-0.1.1/loadpath/heatx.py +1067 -0
  152. loadpath-0.1.1/loadpath/heatx_thermal.py +432 -0
  153. loadpath-0.1.1/loadpath/homogenized.py +886 -0
  154. loadpath-0.1.1/loadpath/ibrep.py +552 -0
  155. loadpath-0.1.1/loadpath/impact.py +693 -0
  156. loadpath-0.1.1/loadpath/infill.py +376 -0
  157. loadpath-0.1.1/loadpath/interface_library.py +340 -0
  158. loadpath-0.1.1/loadpath/interlock.py +186 -0
  159. loadpath-0.1.1/loadpath/isolator.py +149 -0
  160. loadpath-0.1.1/loadpath/knn.py +204 -0
  161. loadpath-0.1.1/loadpath/lattice.py +1065 -0
  162. loadpath-0.1.1/loadpath/lattice3mf.py +760 -0
  163. loadpath-0.1.1/loadpath/lattice_buckling.py +245 -0
  164. loadpath-0.1.1/loadpath/lattice_grade.py +325 -0
  165. loadpath-0.1.1/loadpath/lattice_orient.py +595 -0
  166. loadpath-0.1.1/loadpath/lattice_print.py +159 -0
  167. loadpath-0.1.1/loadpath/lattice_tensors.py +558 -0
  168. loadpath-0.1.1/loadpath/latticestep.py +1210 -0
  169. loadpath-0.1.1/loadpath/manufacture.py +446 -0
  170. loadpath-0.1.1/loadpath/material_library.py +489 -0
  171. loadpath-0.1.1/loadpath/materials.py +144 -0
  172. loadpath-0.1.1/loadpath/mcp_server.py +786 -0
  173. loadpath-0.1.1/loadpath/mechanism.py +218 -0
  174. loadpath-0.1.1/loadpath/mechanism_nl.py +811 -0
  175. loadpath-0.1.1/loadpath/meshops.py +452 -0
  176. loadpath-0.1.1/loadpath/mg.py +853 -0
  177. loadpath-0.1.1/loadpath/mma.py +214 -0
  178. loadpath-0.1.1/loadpath/modal.py +210 -0
  179. loadpath-0.1.1/loadpath/multimat.py +1788 -0
  180. loadpath-0.1.1/loadpath/narrowband.py +418 -0
  181. loadpath-0.1.1/loadpath/nlkernel.py +241 -0
  182. loadpath-0.1.1/loadpath/nonlinear.py +1095 -0
  183. loadpath-0.1.1/loadpath/orient.py +334 -0
  184. loadpath-0.1.1/loadpath/porous.py +994 -0
  185. loadpath-0.1.1/loadpath/pressure.py +171 -0
  186. loadpath-0.1.1/loadpath/preview.py +335 -0
  187. loadpath-0.1.1/loadpath/printcheck.py +263 -0
  188. loadpath-0.1.1/loadpath/printsetup.py +207 -0
  189. loadpath-0.1.1/loadpath/processcheck.py +376 -0
  190. loadpath-0.1.1/loadpath/quick.py +113 -0
  191. loadpath-0.1.1/loadpath/recall.py +406 -0
  192. loadpath-0.1.1/loadpath/reconstruct.py +797 -0
  193. loadpath-0.1.1/loadpath/render.py +436 -0
  194. loadpath-0.1.1/loadpath/resolved.py +189 -0
  195. loadpath-0.1.1/loadpath/schema.py +1701 -0
  196. loadpath-0.1.1/loadpath/sdf_kit.py +843 -0
  197. loadpath-0.1.1/loadpath/selfx.py +292 -0
  198. loadpath-0.1.1/loadpath/shapes.py +584 -0
  199. loadpath-0.1.1/loadpath/sharp.py +717 -0
  200. loadpath-0.1.1/loadpath/simp.py +1170 -0
  201. loadpath-0.1.1/loadpath/sizing.py +312 -0
  202. loadpath-0.1.1/loadpath/slicer.py +321 -0
  203. loadpath-0.1.1/loadpath/spec.py +1072 -0
  204. loadpath-0.1.1/loadpath/step.py +806 -0
  205. loadpath-0.1.1/loadpath/struts.py +639 -0
  206. loadpath-0.1.1/loadpath/study.py +1937 -0
  207. loadpath-0.1.1/loadpath/tasks.py +822 -0
  208. loadpath-0.1.1/loadpath/thermal.py +1691 -0
  209. loadpath-0.1.1/loadpath/threemf.py +487 -0
  210. loadpath-0.1.1/loadpath/tune.py +437 -0
  211. loadpath-0.1.1/loadpath/validation.py +145 -0
  212. loadpath-0.1.1/loadpath/verify.py +1215 -0
  213. loadpath-0.1.1/loadpath/viewer.html +694 -0
  214. loadpath-0.1.1/loadpath/viewer.py +446 -0
  215. loadpath-0.1.1/loadpath/viscoelastic.py +106 -0
  216. loadpath-0.1.1/loadpath/voxelprint.py +582 -0
  217. loadpath-0.1.1/loadpath/voxels.py +402 -0
  218. loadpath-0.1.1/loadpath.egg-info/PKG-INFO +319 -0
  219. loadpath-0.1.1/loadpath.egg-info/SOURCES.txt +295 -0
  220. loadpath-0.1.1/loadpath.egg-info/dependency_links.txt +1 -0
  221. loadpath-0.1.1/loadpath.egg-info/entry_points.txt +2 -0
  222. loadpath-0.1.1/loadpath.egg-info/requires.txt +45 -0
  223. loadpath-0.1.1/loadpath.egg-info/top_level.txt +1 -0
  224. loadpath-0.1.1/pyproject.toml +75 -0
  225. loadpath-0.1.1/setup.cfg +4 -0
  226. loadpath-0.1.1/tests/test_agent_path.py +245 -0
  227. loadpath-0.1.1/tests/test_amgfast.py +55 -0
  228. loadpath-0.1.1/tests/test_assembly.py +242 -0
  229. loadpath-0.1.1/tests/test_benchmarks.py +113 -0
  230. loadpath-0.1.1/tests/test_brief_kinds_heatx.py +108 -0
  231. loadpath-0.1.1/tests/test_brief_kinds_lattice.py +166 -0
  232. loadpath-0.1.1/tests/test_brief_kinds_multimat.py +111 -0
  233. loadpath-0.1.1/tests/test_buckling_check.py +53 -0
  234. loadpath-0.1.1/tests/test_bucklingopt.py +47 -0
  235. loadpath-0.1.1/tests/test_buildsim.py +332 -0
  236. loadpath-0.1.1/tests/test_cadimport.py +240 -0
  237. loadpath-0.1.1/tests/test_calibration.py +294 -0
  238. loadpath-0.1.1/tests/test_conjugate.py +82 -0
  239. loadpath-0.1.1/tests/test_contact.py +444 -0
  240. loadpath-0.1.1/tests/test_coopt.py +150 -0
  241. loadpath-0.1.1/tests/test_cores.py +67 -0
  242. loadpath-0.1.1/tests/test_crease.py +165 -0
  243. loadpath-0.1.1/tests/test_cutcell.py +116 -0
  244. loadpath-0.1.1/tests/test_dfm.py +164 -0
  245. loadpath-0.1.1/tests/test_directions.py +212 -0
  246. loadpath-0.1.1/tests/test_durability.py +200 -0
  247. loadpath-0.1.1/tests/test_editor.py +556 -0
  248. loadpath-0.1.1/tests/test_escape.py +179 -0
  249. loadpath-0.1.1/tests/test_evals.py +176 -0
  250. loadpath-0.1.1/tests/test_femops.py +37 -0
  251. loadpath-0.1.1/tests/test_field_materials.py +195 -0
  252. loadpath-0.1.1/tests/test_fieldjit.py +192 -0
  253. loadpath-0.1.1/tests/test_fields.py +471 -0
  254. loadpath-0.1.1/tests/test_fieldtorch.py +71 -0
  255. loadpath-0.1.1/tests/test_fit.py +271 -0
  256. loadpath-0.1.1/tests/test_flow.py +57 -0
  257. loadpath-0.1.1/tests/test_flowtopo.py +82 -0
  258. loadpath-0.1.1/tests/test_heatx_fixes.py +157 -0
  259. loadpath-0.1.1/tests/test_heatx_rating.py +63 -0
  260. loadpath-0.1.1/tests/test_hex8_im.py +132 -0
  261. loadpath-0.1.1/tests/test_impact.py +346 -0
  262. loadpath-0.1.1/tests/test_interface.py +187 -0
  263. loadpath-0.1.1/tests/test_interfaces.py +76 -0
  264. loadpath-0.1.1/tests/test_interlock.py +86 -0
  265. loadpath-0.1.1/tests/test_lattice3mf.py +177 -0
  266. loadpath-0.1.1/tests/test_lattice_print.py +182 -0
  267. loadpath-0.1.1/tests/test_lattice_tensors.py +416 -0
  268. loadpath-0.1.1/tests/test_latticestep.py +183 -0
  269. loadpath-0.1.1/tests/test_loadpath.py +1209 -0
  270. loadpath-0.1.1/tests/test_manufacture.py +200 -0
  271. loadpath-0.1.1/tests/test_materials.py +137 -0
  272. loadpath-0.1.1/tests/test_meshops.py +155 -0
  273. loadpath-0.1.1/tests/test_metal.py +118 -0
  274. loadpath-0.1.1/tests/test_mg.py +277 -0
  275. loadpath-0.1.1/tests/test_multimat.py +168 -0
  276. loadpath-0.1.1/tests/test_multimat_fixes.py +189 -0
  277. loadpath-0.1.1/tests/test_narrowband.py +305 -0
  278. loadpath-0.1.1/tests/test_nonlinear.py +600 -0
  279. loadpath-0.1.1/tests/test_porous.py +105 -0
  280. loadpath-0.1.1/tests/test_pressure.py +178 -0
  281. loadpath-0.1.1/tests/test_preview.py +163 -0
  282. loadpath-0.1.1/tests/test_print.py +335 -0
  283. loadpath-0.1.1/tests/test_printsetup.py +38 -0
  284. loadpath-0.1.1/tests/test_process.py +140 -0
  285. loadpath-0.1.1/tests/test_published_experiments.py +140 -0
  286. loadpath-0.1.1/tests/test_recall.py +141 -0
  287. loadpath-0.1.1/tests/test_sharp.py +257 -0
  288. loadpath-0.1.1/tests/test_sizing.py +66 -0
  289. loadpath-0.1.1/tests/test_slicer.py +167 -0
  290. loadpath-0.1.1/tests/test_struts.py +215 -0
  291. loadpath-0.1.1/tests/test_tetsizing.py +64 -0
  292. loadpath-0.1.1/tests/test_thermal.py +618 -0
  293. loadpath-0.1.1/tests/test_threemf_multi.py +227 -0
  294. loadpath-0.1.1/tests/test_tune.py +325 -0
  295. loadpath-0.1.1/tests/test_tutorials.py +160 -0
  296. loadpath-0.1.1/tests/test_voxelprint.py +170 -0
  297. loadpath-0.1.1/tests/test_voxels.py +217 -0
loadpath-0.1.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Connor White
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,319 @@
1
+ Metadata-Version: 2.4
2
+ Name: loadpath
3
+ Version: 0.1.1
4
+ Summary: Generative design for printed parts: topology optimization from keep-outs, preserved geometry and loads, verified in real units.
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/connorwhite-online/loadpath
7
+ Project-URL: Documentation, https://github.com/connorwhite-online/loadpath/tree/main/docs
8
+ Project-URL: Repository, https://github.com/connorwhite-online/loadpath
9
+ Project-URL: Issues, https://github.com/connorwhite-online/loadpath/issues
10
+ Keywords: topology optimization,generative design,3d printing,fea,cad
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Intended Audience :: Manufacturing
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering
20
+ Classifier: Topic :: Scientific/Engineering :: Physics
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: numpy>=1.26
25
+ Requires-Dist: scipy>=1.11
26
+ Requires-Dist: pyamg>=5.0
27
+ Requires-Dist: scikit-image>=0.22
28
+ Requires-Dist: trimesh>=4.0
29
+ Requires-Dist: manifold3d>=3.0
30
+ Requires-Dist: rtree>=1.0
31
+ Requires-Dist: numba>=0.59
32
+ Provides-Extra: render
33
+ Requires-Dist: matplotlib>=3.8; extra == "render"
34
+ Requires-Dist: shapely>=2.0; extra == "render"
35
+ Requires-Dist: fast_simplification>=0.1; extra == "render"
36
+ Provides-Extra: mcp
37
+ Requires-Dist: mcp>=2.0; extra == "mcp"
38
+ Requires-Dist: matplotlib>=3.8; extra == "mcp"
39
+ Requires-Dist: shapely>=2.0; extra == "mcp"
40
+ Provides-Extra: gpu
41
+ Requires-Dist: torch>=2.2; extra == "gpu"
42
+ Provides-Extra: flow
43
+ Requires-Dist: numba>=0.59; extra == "flow"
44
+ Provides-Extra: crosscheck
45
+ Requires-Dist: gmsh>=4.11; extra == "crosscheck"
46
+ Requires-Dist: pytetwild>=0.4; extra == "crosscheck"
47
+ Requires-Dist: pyvista>=0.44; extra == "crosscheck"
48
+ Provides-Extra: fast
49
+ Requires-Dist: pypardiso>=0.4; extra == "fast"
50
+ Provides-Extra: critic
51
+ Requires-Dist: anthropic; extra == "critic"
52
+ Requires-Dist: matplotlib>=3.8; extra == "critic"
53
+ Requires-Dist: shapely>=2.0; extra == "critic"
54
+ Provides-Extra: step
55
+ Requires-Dist: cadquery-ocp>=7.7; extra == "step"
56
+ Requires-Dist: embreex>=4.3; extra == "step"
57
+ Provides-Extra: 3mf
58
+ Requires-Dist: lib3mf>=2.4; extra == "3mf"
59
+ Requires-Dist: pillow>=9; extra == "3mf"
60
+ Dynamic: license-file
61
+
62
+ # loadpath
63
+
64
+ Generative design for 3D printed parts (and cast or milled ones), built to be
65
+ driven by coding agents. Tell your agent what a part has to carry and where it
66
+ mounts; loadpath grows the part with topology optimization, meshes it as a
67
+ watertight solid with the interfaces cut exactly, and checks that mesh with a
68
+ fresh finite element analysis. You get an STL, 3MF or STEP and a report: mass,
69
+ safety factor, deflection, thinnest member, printability, pass or fail.
70
+
71
+ <table>
72
+ <tr>
73
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/printed-hook.png" width="380"></td>
74
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/printed-hook.png" width="380"></td>
75
+ </tr>
76
+ <tr>
77
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/bell-crank.png" width="380"></td>
78
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/bell-crank.png" width="380"></td>
79
+ </tr>
80
+ <tr>
81
+ <td align="center" colspan="2"><sub>Left, the part loadpath delivered (blue: load, red: kept bore). Right, its
82
+ stress from a fresh analysis of that mesh, blue (none) to red (the part's 98th percentile), on the shape bent by
83
+ the worst load case. Top: a 300 N wall hook printed upright without supports, 24.2 g, SF 2.73. Bottom: a 500 N
84
+ aluminium bell crank (LPBF), 23.4 g, SF 3.22. More in <a href="#examples">Examples</a>.</sub></td>
85
+ </tr>
86
+ </table>
87
+
88
+ ## Point your agent at it
89
+
90
+ ```bash
91
+ pip install "loadpath[mcp]"
92
+ claude mcp add loadpath -- loadpath mcp # any MCP client: {"command": "loadpath", "args": ["mcp"]}
93
+ ```
94
+
95
+ Then ask in plain words:
96
+
97
+ > Design a PETG bracket for a 10 kg shelf. It screws to the wall with two
98
+ > M5 bolts 40 mm apart and the shelf sits 60 mm out. Safety factor 2,
99
+ > printed on an FDM printer.
100
+
101
+ The agent writes the study, checks it, runs it in the background and reads
102
+ the report back. Its guide is [loadpath/SKILL.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/loadpath/SKILL.md) (the
103
+ `loadpath_guide` tool returns it); the tools and the loop are in
104
+ [docs/agents.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/agents.md). The server runs locally and nothing
105
+ leaves the machine. Units are millimetres, newtons and megapascals. MIT
106
+ licensed.
107
+
108
+ ## What it does
109
+
110
+ - **Topology optimization** on a voxel grid (SIMP with a density filter,
111
+ Heaviside projection and a robust minimum-member formulation), searching
112
+ for the lightest part that meets a safety factor and a deflection limit
113
+ across several load cases. A stress-constrained mode (MMA) is available.
114
+ - **Verification of the delivered mesh**, not the optimizer's density
115
+ field: the STL is analysed again, on a tetrahedral mesh when the
116
+ `crosscheck` extra is installed and on a fine voxel grid otherwise. Keep-out
117
+ intrusion and lost interface geometry are measured with exact booleans.
118
+ - **Process rules** for FDM (overhangs, bridges, layer bond), SLS and MJF
119
+ (trapped powder, escape holes, warp-prone panels), resin (supports, peel,
120
+ suction cups) and powder-bed metal (internal ceilings, powder
121
+ clean-outs), plus milling and casting constraints.
122
+ - **Field modelling**: a part as a graph of implicit fields, so skins,
123
+ lattices (TPMS and strut) and fillets can be graded by stress or by
124
+ distance ([docs/fields.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md)).
125
+ - **Other analyses**: large deflection and buckling, compliant mechanisms,
126
+ thermal loads, fatigue and creep estimates, lattice crush and impact,
127
+ vibration, lattice-Boltzmann flow and conjugate heat for heat exchangers
128
+ and cold plates, and layer-by-layer warp and residual stress
129
+ ([docs/BUILDSIM.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BUILDSIM.md)).
130
+ - **CAD in and out**: a STEP or STL part becomes a draft study with its
131
+ bores and bolt patterns found ([docs/IMPORT.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPORT.md)); results
132
+ export as STL, 3MF, and STEP with exact planes and cylinders at the
133
+ interfaces; a lattice part (strut cells, TPMS, graded, skinned or open)
134
+ goes to STEP lattice and all, as smooth patches on its true surface ([docs/fields.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md#the-lattice-itself-in-the-step-lattice-exact)).
135
+ - **Mesh checks without a study** (`loadpath.checks`): wall thickness,
136
+ overhangs, trapped voids, fluid-network isolation, component fit.
137
+
138
+ ## How much to trust it
139
+
140
+ Read [docs/VALIDATION.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md) before relying on a number.
141
+ In short:
142
+
143
+ - **The solvers match analytic answers** in the test suite: beam
144
+ deflection within 3-5%, stress at a hole within about 13%, Lamé pressure
145
+ vessels within 5-11%, Poiseuille flow exactly.
146
+ - **The structural check is cross-checked**: CalculiX and loadpath's own
147
+ tetrahedral solver agree within 0.1% on the same mesh. The voxel check
148
+ reads 24-49% higher stress than the tet check, so it errs safe.
149
+ - **The optimizer is benchmarked**: 1-5% less stiff than top88 and top3d at
150
+ equal material on three of their textbook problems, stiffer on the fourth.
151
+ - **Printed lattices match published tests**: against 33 published
152
+ compression tests of printed lattices, the stiffness check has a median
153
+ error of 1.23x (held out) and the strength check stays under the measured
154
+ value on all 33.
155
+ - **Warp prediction is fitted to measured data** (NIST AM-Bench 2018 for
156
+ LPBF IN625, a published ABS study for FDM) and misses other alloys and
157
+ materials by 30-60%.
158
+ - **Everything else is simulation only**, including every part mass and
159
+ safety factor in the case studies. The analysis is linear elastic with
160
+ datasheet material values; printed parts vary with the printer.
161
+
162
+ ## Case studies
163
+
164
+ Each states the problem, the setup, the numbers against a named baseline,
165
+ and the limitations ([docs/case-studies/](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/case-studies/)).
166
+
167
+ | Case study | Result | Baseline |
168
+ | --- | --- | --- |
169
+ | [Eval suite](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/evals.md) | 15 of 15 parts meet their requirements on a fresh analysis of the delivered mesh | Each part's own requirements |
170
+ | [GRIP robot arm](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/grip.md) | A load sweep over the arm's URDF found 3 of 5 links below SF 1; the regrown set meets SF 2 and is 18% smaller | GRIP's committed parts, made by an earlier loadpath with hand-written loads |
171
+ | [Arm link cores](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/arm-link-cores.md) | 42.2 g box section for FDM, 36.8 g hollow link for SLS, both at 0.5 mm and SF 3 | 54.9 g solid web; 54.2 g free-form topology optimization |
172
+ | [Liquid cold plate](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/cold-plate.md) | A die-graded gyroid ties streamline channels; channels filled with a graded gyroid run 7% cooler | Streamline channels and pin fins, equal metal and pressure drop |
173
+ | [TPU finger](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/tpu-finger.md) | up to 8 mm of tip curl for a 5 mm pull; a tendon finger grips 8x harder | A linear-model design (2.5 mm, then the solve fails); a plain bar of equal volume |
174
+ | [Benchmarks](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/benchmarks.md) | 1-5% less stiff than top88/top3d at equal material, in 57-60 iterations instead of 130-410 | Ports of top88 and top3d |
175
+
176
+ ## Command line and Python
177
+
178
+ ```bash
179
+ loadpath examples shelf-bracket > bracket.json
180
+ loadpath check bracket.json # every problem at once, with suggestions
181
+ loadpath run bracket.json --out out/ # optimize, mesh, verify, render
182
+ ```
183
+
184
+ `out/` gets an STL and a render per outcome and `report.json`. Every command
185
+ takes `--quick` for a first look in a minute or two.
186
+
187
+ Optional extras: `crosscheck` (tetrahedral verification; recommended),
188
+ `render`, `step` (STEP in and out, OpenCascade), `flow` (lattice-Boltzmann,
189
+ numba), `gpu` (PyTorch for large grids on CUDA, Apple Silicon or CPU
190
+ threads).
191
+
192
+ Studies are validated against a published JSON Schema
193
+ ([`schema/`](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/schema/)), and `loadpath check` returns every problem at once
194
+ with its JSON path, so an agent can fix a study in one round trip. Long
195
+ solves run as background jobs the agent polls. Each finished outcome has an
196
+ `attention` list of numbers to look at before trusting it, and renders a
197
+ vision model can inspect.
198
+
199
+ From Python:
200
+
201
+ ```python
202
+ from loadpath.spec import study_from_dict
203
+ from loadpath.study import run_study
204
+
205
+ result = run_study(study_from_dict(study))
206
+ best = result.outcomes[result.best]
207
+ best.mesh.export("part.stl")
208
+ print(best.report["mass"], best.report["safetyFactor"])
209
+ ```
210
+
211
+ ## Documentation
212
+
213
+ - [Quickstart](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/quickstart.md): install to a checked part.
214
+ - [Tutorials](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/tutorials/): eleven end-to-end workflows, each run by CI
215
+ (an FDM bracket to 3MF, an SLS lattice with drain holes, a metal heat
216
+ exchanger, an impact bumper, a STEP part round trip, LPBF distortion
217
+ compensation, and more).
218
+ - [Reference](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/loadpath/README.md): the method, every study field, the
219
+ report, the limits.
220
+ - [Validation](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md): what each model has been checked
221
+ against.
222
+ - [Case studies](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/case-studies/) and [benchmarks](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BENCHMARKS.md).
223
+ - Topics: [fields](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md), [materials](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/materials.md),
224
+ [build simulation](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BUILDSIM.md), [calibration](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/CALIBRATION.md),
225
+ [CAD import](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPORT.md), [slicer](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/slicer.md),
226
+ [multi-material](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/MULTIMATERIAL.md), [impact](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPACT.md),
227
+ [mechanisms](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/MECHANISMS.md).
228
+
229
+ <!-- gallery:start -->
230
+
231
+ ## Examples
232
+
233
+ The eval suite (15/15 passing): robot-arm links, brackets, a bell crank and a hook, each optimized and then checked by a fresh analysis of the delivered mesh. "Under envelope" compares with the design space filled solid, not with a conventionally designed part. These are simulated results; see [docs/VALIDATION.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md). Blue arrows are loads, red is keep-out. Every view, stress map and number is in [docs/GALLERY.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/GALLERY.md).
234
+
235
+ <table>
236
+ <tr>
237
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link.png" width="250"><br><b>arm-link</b><br><sub>55.3 g · 56% under envelope · SF 8.92 · pass</sub></td>
238
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link-cast.png" width="250"><br><b>arm-link-cast</b><br><sub>67.8 g · 46% under envelope · SF 20.11 · pass</sub></td>
239
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link-driven.png" width="250"><br><b>arm-link-driven</b><br><sub>48.4 g · 61% under envelope · SF 11.17 · pass</sub></td>
240
+ </tr>
241
+ <tr>
242
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/bell-crank.png" width="250"><br><b>bell-crank</b><br><sub>23.4 g · 84% under envelope · SF 3.22 · pass</sub></td>
243
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-turret.png" width="250"><br><b>grip-turret</b><br><sub>140.4 g · 91% under envelope · SF 2.85 · pass</sub></td>
244
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-upper-arm.png" width="250"><br><b>grip-upper-arm</b><br><sub>207.7 g · 88% under envelope · SF 7.33 · pass</sub></td>
245
+ </tr>
246
+ <tr>
247
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-wrist-link-mjf.png" width="250"><br><b>grip-wrist-link-mjf</b><br><sub>40.2 g · 95% under envelope · SF 5.83 · pass</sub></td>
248
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-wrist-yoke.png" width="250"><br><b>grip-wrist-yoke</b><br><sub>17.3 g · 93% under envelope · SF 3.88 · pass</sub></td>
249
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/mbb-beam.png" width="250"><br><b>mbb-beam</b><br><sub>13.8 g · 79% under envelope · SF 1.51 · pass</sub></td>
250
+ </tr>
251
+ <tr>
252
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/motor-mount.png" width="250"><br><b>motor-mount</b><br><sub>27.6 g · 69% under envelope · SF 3.65 · pass</sub></td>
253
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/printed-hook.png" width="250"><br><b>printed-hook</b><br><sub>24.2 g · 84% under envelope · SF 2.73 · pass</sub></td>
254
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/wall-bracket.png" width="250"><br><b>wall-bracket</b><br><sub>26.9 g · 94% under envelope · SF 2.85 · pass</sub></td>
255
+ </tr>
256
+ <tr>
257
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/wall-bracket-fasteners.png" width="250"><br><b>wall-bracket-fasteners</b><br><sub>26.5 g · 94% under envelope · SF 2.57 · pass</sub></td>
258
+ </tr>
259
+ </table>
260
+
261
+ Where the load goes: von Mises stress, blue (none) to red (the part's 98th percentile), on the part bent by its worst load case:
262
+
263
+ <table>
264
+ <tr>
265
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/bell-crank.png" width="250"><br><sub>bell-crank</sub></td>
266
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/grip-upper-arm.png" width="250"><br><sub>grip-upper-arm</sub></td>
267
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/printed-hook.png" width="250"><br><sub>printed-hook</sub></td>
268
+ </tr>
269
+ </table>
270
+
271
+ Two-fluid heat exchangers: two isolated channel networks through one sheet gyroid, with headers that print without support.
272
+
273
+ ![box-crossflow](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/heatx/box-crossflow.png)
274
+
275
+ Printed in metal, nothing inside can be supported: the channels end in peaked roofs instead of flat ceilings (red).
276
+
277
+ ![metal ceilings](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/heatx/lpbf-ceilings.png)
278
+
279
+ Made another way: the same arm link printed, cast (no undercuts along z), 3-axis milled from both sides with a 6 mm cutter, and with members capped at 6 mm. Each meets SF 3 and 0.5 mm.
280
+
281
+ ![manufacturing constraints](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/manufacturing/arm-link.png)
282
+
283
+ <sub>Rendered 2026-11-03 from `6c97b57` by `python docs/gallery.py`.</sub>
284
+
285
+ <!-- gallery:end -->
286
+ ## Limits
287
+
288
+ - Linear elastic, small deflection in the main check; large deflection and
289
+ buckling are separate analyses (`nonlinear.py`), with contact (rigid
290
+ obstacles and self contact, optionally with Coulomb friction) and
291
+ tendons there only.
292
+ - Printed layers are modelled as transversely isotropic stiffness plus a
293
+ tension-across-layers strength check. Interlayer shear is not checked
294
+ separately.
295
+ - Material cards are datasheet values until you calibrate your printer
296
+ (`loadpath calibrate`).
297
+ - Results depend on the grid: mass at a target safety factor moves about
298
+ 5% with small changes of grid size or starting point.
299
+ - Pure Python with NumPy and SciPy. A 40,000-cell study takes a few minutes
300
+ on one laptop core; a safety-factor search runs several of those, and the
301
+ larger eval parts take 15-60 minutes on four cores.
302
+
303
+ ## Tests
304
+
305
+ ```bash
306
+ python tests/run_tests.py && python tests/test_loadpath.py # core
307
+ python tests/test_tutorials.py # every tutorial, quick mode
308
+ python -m loadpath.evals.run --tier coarse --corpus 6 \
309
+ --baseline loadpath/evals/baselines/coarse.json --gate regressions # under 30 min
310
+ python -m loadpath.evals.run --out evals-out/ # full eval suite, hours
311
+ python -m loadpath.benchmarks.run --out bench-out/ # top88 / top3d benchmarks
312
+ python docs/gallery.py --evals evals-out/ # refresh the Examples renders
313
+ ```
314
+
315
+ `.github/workflows/tests.yml` lists the full set CI runs.
316
+
317
+ ## License
318
+
319
+ MIT
@@ -0,0 +1,258 @@
1
+ # loadpath
2
+
3
+ Generative design for 3D printed parts (and cast or milled ones), built to be
4
+ driven by coding agents. Tell your agent what a part has to carry and where it
5
+ mounts; loadpath grows the part with topology optimization, meshes it as a
6
+ watertight solid with the interfaces cut exactly, and checks that mesh with a
7
+ fresh finite element analysis. You get an STL, 3MF or STEP and a report: mass,
8
+ safety factor, deflection, thinnest member, printability, pass or fail.
9
+
10
+ <table>
11
+ <tr>
12
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/printed-hook.png" width="380"></td>
13
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/printed-hook.png" width="380"></td>
14
+ </tr>
15
+ <tr>
16
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/bell-crank.png" width="380"></td>
17
+ <td align="center" width="50%"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/bell-crank.png" width="380"></td>
18
+ </tr>
19
+ <tr>
20
+ <td align="center" colspan="2"><sub>Left, the part loadpath delivered (blue: load, red: kept bore). Right, its
21
+ stress from a fresh analysis of that mesh, blue (none) to red (the part's 98th percentile), on the shape bent by
22
+ the worst load case. Top: a 300 N wall hook printed upright without supports, 24.2 g, SF 2.73. Bottom: a 500 N
23
+ aluminium bell crank (LPBF), 23.4 g, SF 3.22. More in <a href="#examples">Examples</a>.</sub></td>
24
+ </tr>
25
+ </table>
26
+
27
+ ## Point your agent at it
28
+
29
+ ```bash
30
+ pip install "loadpath[mcp]"
31
+ claude mcp add loadpath -- loadpath mcp # any MCP client: {"command": "loadpath", "args": ["mcp"]}
32
+ ```
33
+
34
+ Then ask in plain words:
35
+
36
+ > Design a PETG bracket for a 10 kg shelf. It screws to the wall with two
37
+ > M5 bolts 40 mm apart and the shelf sits 60 mm out. Safety factor 2,
38
+ > printed on an FDM printer.
39
+
40
+ The agent writes the study, checks it, runs it in the background and reads
41
+ the report back. Its guide is [loadpath/SKILL.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/loadpath/SKILL.md) (the
42
+ `loadpath_guide` tool returns it); the tools and the loop are in
43
+ [docs/agents.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/agents.md). The server runs locally and nothing
44
+ leaves the machine. Units are millimetres, newtons and megapascals. MIT
45
+ licensed.
46
+
47
+ ## What it does
48
+
49
+ - **Topology optimization** on a voxel grid (SIMP with a density filter,
50
+ Heaviside projection and a robust minimum-member formulation), searching
51
+ for the lightest part that meets a safety factor and a deflection limit
52
+ across several load cases. A stress-constrained mode (MMA) is available.
53
+ - **Verification of the delivered mesh**, not the optimizer's density
54
+ field: the STL is analysed again, on a tetrahedral mesh when the
55
+ `crosscheck` extra is installed and on a fine voxel grid otherwise. Keep-out
56
+ intrusion and lost interface geometry are measured with exact booleans.
57
+ - **Process rules** for FDM (overhangs, bridges, layer bond), SLS and MJF
58
+ (trapped powder, escape holes, warp-prone panels), resin (supports, peel,
59
+ suction cups) and powder-bed metal (internal ceilings, powder
60
+ clean-outs), plus milling and casting constraints.
61
+ - **Field modelling**: a part as a graph of implicit fields, so skins,
62
+ lattices (TPMS and strut) and fillets can be graded by stress or by
63
+ distance ([docs/fields.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md)).
64
+ - **Other analyses**: large deflection and buckling, compliant mechanisms,
65
+ thermal loads, fatigue and creep estimates, lattice crush and impact,
66
+ vibration, lattice-Boltzmann flow and conjugate heat for heat exchangers
67
+ and cold plates, and layer-by-layer warp and residual stress
68
+ ([docs/BUILDSIM.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BUILDSIM.md)).
69
+ - **CAD in and out**: a STEP or STL part becomes a draft study with its
70
+ bores and bolt patterns found ([docs/IMPORT.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPORT.md)); results
71
+ export as STL, 3MF, and STEP with exact planes and cylinders at the
72
+ interfaces; a lattice part (strut cells, TPMS, graded, skinned or open)
73
+ goes to STEP lattice and all, as smooth patches on its true surface ([docs/fields.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md#the-lattice-itself-in-the-step-lattice-exact)).
74
+ - **Mesh checks without a study** (`loadpath.checks`): wall thickness,
75
+ overhangs, trapped voids, fluid-network isolation, component fit.
76
+
77
+ ## How much to trust it
78
+
79
+ Read [docs/VALIDATION.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md) before relying on a number.
80
+ In short:
81
+
82
+ - **The solvers match analytic answers** in the test suite: beam
83
+ deflection within 3-5%, stress at a hole within about 13%, Lamé pressure
84
+ vessels within 5-11%, Poiseuille flow exactly.
85
+ - **The structural check is cross-checked**: CalculiX and loadpath's own
86
+ tetrahedral solver agree within 0.1% on the same mesh. The voxel check
87
+ reads 24-49% higher stress than the tet check, so it errs safe.
88
+ - **The optimizer is benchmarked**: 1-5% less stiff than top88 and top3d at
89
+ equal material on three of their textbook problems, stiffer on the fourth.
90
+ - **Printed lattices match published tests**: against 33 published
91
+ compression tests of printed lattices, the stiffness check has a median
92
+ error of 1.23x (held out) and the strength check stays under the measured
93
+ value on all 33.
94
+ - **Warp prediction is fitted to measured data** (NIST AM-Bench 2018 for
95
+ LPBF IN625, a published ABS study for FDM) and misses other alloys and
96
+ materials by 30-60%.
97
+ - **Everything else is simulation only**, including every part mass and
98
+ safety factor in the case studies. The analysis is linear elastic with
99
+ datasheet material values; printed parts vary with the printer.
100
+
101
+ ## Case studies
102
+
103
+ Each states the problem, the setup, the numbers against a named baseline,
104
+ and the limitations ([docs/case-studies/](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/case-studies/)).
105
+
106
+ | Case study | Result | Baseline |
107
+ | --- | --- | --- |
108
+ | [Eval suite](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/evals.md) | 15 of 15 parts meet their requirements on a fresh analysis of the delivered mesh | Each part's own requirements |
109
+ | [GRIP robot arm](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/grip.md) | A load sweep over the arm's URDF found 3 of 5 links below SF 1; the regrown set meets SF 2 and is 18% smaller | GRIP's committed parts, made by an earlier loadpath with hand-written loads |
110
+ | [Arm link cores](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/arm-link-cores.md) | 42.2 g box section for FDM, 36.8 g hollow link for SLS, both at 0.5 mm and SF 3 | 54.9 g solid web; 54.2 g free-form topology optimization |
111
+ | [Liquid cold plate](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/cold-plate.md) | A die-graded gyroid ties streamline channels; channels filled with a graded gyroid run 7% cooler | Streamline channels and pin fins, equal metal and pressure drop |
112
+ | [TPU finger](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/tpu-finger.md) | up to 8 mm of tip curl for a 5 mm pull; a tendon finger grips 8x harder | A linear-model design (2.5 mm, then the solve fails); a plain bar of equal volume |
113
+ | [Benchmarks](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/case-studies/benchmarks.md) | 1-5% less stiff than top88/top3d at equal material, in 57-60 iterations instead of 130-410 | Ports of top88 and top3d |
114
+
115
+ ## Command line and Python
116
+
117
+ ```bash
118
+ loadpath examples shelf-bracket > bracket.json
119
+ loadpath check bracket.json # every problem at once, with suggestions
120
+ loadpath run bracket.json --out out/ # optimize, mesh, verify, render
121
+ ```
122
+
123
+ `out/` gets an STL and a render per outcome and `report.json`. Every command
124
+ takes `--quick` for a first look in a minute or two.
125
+
126
+ Optional extras: `crosscheck` (tetrahedral verification; recommended),
127
+ `render`, `step` (STEP in and out, OpenCascade), `flow` (lattice-Boltzmann,
128
+ numba), `gpu` (PyTorch for large grids on CUDA, Apple Silicon or CPU
129
+ threads).
130
+
131
+ Studies are validated against a published JSON Schema
132
+ ([`schema/`](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/schema/)), and `loadpath check` returns every problem at once
133
+ with its JSON path, so an agent can fix a study in one round trip. Long
134
+ solves run as background jobs the agent polls. Each finished outcome has an
135
+ `attention` list of numbers to look at before trusting it, and renders a
136
+ vision model can inspect.
137
+
138
+ From Python:
139
+
140
+ ```python
141
+ from loadpath.spec import study_from_dict
142
+ from loadpath.study import run_study
143
+
144
+ result = run_study(study_from_dict(study))
145
+ best = result.outcomes[result.best]
146
+ best.mesh.export("part.stl")
147
+ print(best.report["mass"], best.report["safetyFactor"])
148
+ ```
149
+
150
+ ## Documentation
151
+
152
+ - [Quickstart](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/quickstart.md): install to a checked part.
153
+ - [Tutorials](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/tutorials/): eleven end-to-end workflows, each run by CI
154
+ (an FDM bracket to 3MF, an SLS lattice with drain holes, a metal heat
155
+ exchanger, an impact bumper, a STEP part round trip, LPBF distortion
156
+ compensation, and more).
157
+ - [Reference](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/loadpath/README.md): the method, every study field, the
158
+ report, the limits.
159
+ - [Validation](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md): what each model has been checked
160
+ against.
161
+ - [Case studies](https://github.com/connorwhite-online/loadpath/tree/v0.1.1/docs/case-studies/) and [benchmarks](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BENCHMARKS.md).
162
+ - Topics: [fields](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/fields.md), [materials](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/materials.md),
163
+ [build simulation](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/BUILDSIM.md), [calibration](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/CALIBRATION.md),
164
+ [CAD import](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPORT.md), [slicer](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/slicer.md),
165
+ [multi-material](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/MULTIMATERIAL.md), [impact](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/IMPACT.md),
166
+ [mechanisms](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/MECHANISMS.md).
167
+
168
+ <!-- gallery:start -->
169
+
170
+ ## Examples
171
+
172
+ The eval suite (15/15 passing): robot-arm links, brackets, a bell crank and a hook, each optimized and then checked by a fresh analysis of the delivered mesh. "Under envelope" compares with the design space filled solid, not with a conventionally designed part. These are simulated results; see [docs/VALIDATION.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/VALIDATION.md). Blue arrows are loads, red is keep-out. Every view, stress map and number is in [docs/GALLERY.md](https://github.com/connorwhite-online/loadpath/blob/v0.1.1/docs/GALLERY.md).
173
+
174
+ <table>
175
+ <tr>
176
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link.png" width="250"><br><b>arm-link</b><br><sub>55.3 g · 56% under envelope · SF 8.92 · pass</sub></td>
177
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link-cast.png" width="250"><br><b>arm-link-cast</b><br><sub>67.8 g · 46% under envelope · SF 20.11 · pass</sub></td>
178
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/arm-link-driven.png" width="250"><br><b>arm-link-driven</b><br><sub>48.4 g · 61% under envelope · SF 11.17 · pass</sub></td>
179
+ </tr>
180
+ <tr>
181
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/bell-crank.png" width="250"><br><b>bell-crank</b><br><sub>23.4 g · 84% under envelope · SF 3.22 · pass</sub></td>
182
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-turret.png" width="250"><br><b>grip-turret</b><br><sub>140.4 g · 91% under envelope · SF 2.85 · pass</sub></td>
183
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-upper-arm.png" width="250"><br><b>grip-upper-arm</b><br><sub>207.7 g · 88% under envelope · SF 7.33 · pass</sub></td>
184
+ </tr>
185
+ <tr>
186
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-wrist-link-mjf.png" width="250"><br><b>grip-wrist-link-mjf</b><br><sub>40.2 g · 95% under envelope · SF 5.83 · pass</sub></td>
187
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/grip-wrist-yoke.png" width="250"><br><b>grip-wrist-yoke</b><br><sub>17.3 g · 93% under envelope · SF 3.88 · pass</sub></td>
188
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/mbb-beam.png" width="250"><br><b>mbb-beam</b><br><sub>13.8 g · 79% under envelope · SF 1.51 · pass</sub></td>
189
+ </tr>
190
+ <tr>
191
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/motor-mount.png" width="250"><br><b>motor-mount</b><br><sub>27.6 g · 69% under envelope · SF 3.65 · pass</sub></td>
192
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/printed-hook.png" width="250"><br><b>printed-hook</b><br><sub>24.2 g · 84% under envelope · SF 2.73 · pass</sub></td>
193
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/wall-bracket.png" width="250"><br><b>wall-bracket</b><br><sub>26.9 g · 94% under envelope · SF 2.85 · pass</sub></td>
194
+ </tr>
195
+ <tr>
196
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/cases/wall-bracket-fasteners.png" width="250"><br><b>wall-bracket-fasteners</b><br><sub>26.5 g · 94% under envelope · SF 2.57 · pass</sub></td>
197
+ </tr>
198
+ </table>
199
+
200
+ Where the load goes: von Mises stress, blue (none) to red (the part's 98th percentile), on the part bent by its worst load case:
201
+
202
+ <table>
203
+ <tr>
204
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/bell-crank.png" width="250"><br><sub>bell-crank</sub></td>
205
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/grip-upper-arm.png" width="250"><br><sub>grip-upper-arm</sub></td>
206
+ <td align="center" valign="top"><img src="https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/stress/printed-hook.png" width="250"><br><sub>printed-hook</sub></td>
207
+ </tr>
208
+ </table>
209
+
210
+ Two-fluid heat exchangers: two isolated channel networks through one sheet gyroid, with headers that print without support.
211
+
212
+ ![box-crossflow](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/heatx/box-crossflow.png)
213
+
214
+ Printed in metal, nothing inside can be supported: the channels end in peaked roofs instead of flat ceilings (red).
215
+
216
+ ![metal ceilings](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/heatx/lpbf-ceilings.png)
217
+
218
+ Made another way: the same arm link printed, cast (no undercuts along z), 3-axis milled from both sides with a 6 mm cutter, and with members capped at 6 mm. Each meets SF 3 and 0.5 mm.
219
+
220
+ ![manufacturing constraints](https://raw.githubusercontent.com/connorwhite-online/loadpath/v0.1.1/docs/images/manufacturing/arm-link.png)
221
+
222
+ <sub>Rendered 2026-11-03 from `6c97b57` by `python docs/gallery.py`.</sub>
223
+
224
+ <!-- gallery:end -->
225
+ ## Limits
226
+
227
+ - Linear elastic, small deflection in the main check; large deflection and
228
+ buckling are separate analyses (`nonlinear.py`), with contact (rigid
229
+ obstacles and self contact, optionally with Coulomb friction) and
230
+ tendons there only.
231
+ - Printed layers are modelled as transversely isotropic stiffness plus a
232
+ tension-across-layers strength check. Interlayer shear is not checked
233
+ separately.
234
+ - Material cards are datasheet values until you calibrate your printer
235
+ (`loadpath calibrate`).
236
+ - Results depend on the grid: mass at a target safety factor moves about
237
+ 5% with small changes of grid size or starting point.
238
+ - Pure Python with NumPy and SciPy. A 40,000-cell study takes a few minutes
239
+ on one laptop core; a safety-factor search runs several of those, and the
240
+ larger eval parts take 15-60 minutes on four cores.
241
+
242
+ ## Tests
243
+
244
+ ```bash
245
+ python tests/run_tests.py && python tests/test_loadpath.py # core
246
+ python tests/test_tutorials.py # every tutorial, quick mode
247
+ python -m loadpath.evals.run --tier coarse --corpus 6 \
248
+ --baseline loadpath/evals/baselines/coarse.json --gate regressions # under 30 min
249
+ python -m loadpath.evals.run --out evals-out/ # full eval suite, hours
250
+ python -m loadpath.benchmarks.run --out bench-out/ # top88 / top3d benchmarks
251
+ python docs/gallery.py --evals evals-out/ # refresh the Examples renders
252
+ ```
253
+
254
+ `.github/workflows/tests.yml` lists the full set CI runs.
255
+
256
+ ## License
257
+
258
+ MIT