morphopt 3.1.6__tar.gz → 3.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of morphopt might be problematic. Click here for more details.

Files changed (126) hide show
  1. morphopt-3.2.0/PKG-INFO +151 -0
  2. morphopt-3.2.0/README.md +127 -0
  3. {morphopt-3.1.6 → morphopt-3.2.0}/pyproject.toml +2 -2
  4. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/feaparams.py +2 -2
  5. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/opt_runner.py +2 -2
  6. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/geometry.py +5 -3
  7. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/geometryparams.py +3 -2
  8. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/__init__.py +2 -1
  9. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/app.py +9 -2
  10. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/codegen/generator.py +122 -58
  11. morphopt-3.2.0/src/morphopt/ui/i18n.py +74 -0
  12. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/launcher.py +71 -8
  13. morphopt-3.2.0/src/morphopt/ui/mainwindow.py +209 -0
  14. morphopt-3.2.0/src/morphopt/ui/model/problem.py +1069 -0
  15. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/model/schemas.py +376 -68
  16. morphopt-3.2.0/src/morphopt/ui/observe_panel.py +968 -0
  17. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/schemes/__init__.py +6 -2
  18. morphopt-3.2.0/src/morphopt/ui/schemes/base.py +186 -0
  19. morphopt-3.2.0/src/morphopt/ui/schemes/codesign.py +143 -0
  20. morphopt-3.2.0/src/morphopt/ui/schemes/shapeopt.py +100 -0
  21. morphopt-3.2.0/src/morphopt/ui/schemes/simp.py +96 -0
  22. morphopt-3.2.0/src/morphopt/ui/schemes/snippets.py +236 -0
  23. morphopt-3.2.0/src/morphopt/ui/widgets/__init__.py +1 -0
  24. morphopt-3.2.0/src/morphopt/ui/widgets/code_completion.py +180 -0
  25. morphopt-3.2.0/src/morphopt/ui/widgets/codeeditor.py +372 -0
  26. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/editor.py +47 -30
  27. morphopt-3.2.0/src/morphopt/ui/widgets/model_tree.py +485 -0
  28. morphopt-3.2.0/src/morphopt/ui/widgets/objective_editor.py +233 -0
  29. morphopt-3.2.0/src/morphopt/ui/widgets/observation_pages.py +246 -0
  30. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/param_form.py +13 -6
  31. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/solver_editor.py +22 -16
  32. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/stepmatrix.py +71 -52
  33. morphopt-3.2.0/src/morphopt/ui/widgets/template_insert_dialog.py +198 -0
  34. morphopt-3.2.0/src/morphopt/ui/widgets/updater_editor.py +699 -0
  35. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/values.py +23 -0
  36. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/widgets/viewer.py +62 -37
  37. morphopt-3.2.0/src/morphopt/ui/workbench.py +506 -0
  38. morphopt-3.2.0/src/morphopt.egg-info/PKG-INFO +151 -0
  39. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt.egg-info/SOURCES.txt +5 -3
  40. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt.egg-info/requires.txt +1 -1
  41. morphopt-3.1.6/PKG-INFO +0 -95
  42. morphopt-3.1.6/README.md +0 -71
  43. morphopt-3.1.6/src/morphopt/taskui.py +0 -18
  44. morphopt-3.1.6/src/morphopt/ui/codegen/objective_templates.py +0 -52
  45. morphopt-3.1.6/src/morphopt/ui/mainwindow.py +0 -146
  46. morphopt-3.1.6/src/morphopt/ui/model/problem.py +0 -170
  47. morphopt-3.1.6/src/morphopt/ui/monitor.py +0 -558
  48. morphopt-3.1.6/src/morphopt/ui/observe_panel.py +0 -533
  49. morphopt-3.1.6/src/morphopt/ui/schemes/base.py +0 -101
  50. morphopt-3.1.6/src/morphopt/ui/schemes/codesign.py +0 -173
  51. morphopt-3.1.6/src/morphopt/ui/schemes/shapeopt.py +0 -127
  52. morphopt-3.1.6/src/morphopt/ui/schemes/simp.py +0 -115
  53. morphopt-3.1.6/src/morphopt/ui/widgets/__init__.py +0 -1
  54. morphopt-3.1.6/src/morphopt/ui/widgets/codeeditor.py +0 -207
  55. morphopt-3.1.6/src/morphopt/ui/widgets/model_tree.py +0 -282
  56. morphopt-3.1.6/src/morphopt/ui/widgets/objective_editor.py +0 -141
  57. morphopt-3.1.6/src/morphopt/ui/widgets/updater_editor.py +0 -214
  58. morphopt-3.1.6/src/morphopt/ui/workbench.py +0 -313
  59. morphopt-3.1.6/src/morphopt.egg-info/PKG-INFO +0 -95
  60. {morphopt-3.1.6 → morphopt-3.2.0}/setup.cfg +0 -0
  61. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/__init__.py +0 -0
  62. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/__init__.py +0 -0
  63. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/constraints.py +0 -0
  64. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/geometry.py +0 -0
  65. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/material.py +0 -0
  66. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/codesign/params.py +0 -0
  67. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/__init__.py +0 -0
  68. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/baseobject.py +0 -0
  69. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/controller.py +0 -0
  70. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/history.py +0 -0
  71. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/__init__.py +0 -0
  72. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/baseparam.py +0 -0
  73. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/__init__.py +0 -0
  74. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/basefeainterface.py +0 -0
  75. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/bodyforceinterface.py +0 -0
  76. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/boundaryconditioninterface.py +0 -0
  77. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/contactinterface.py +0 -0
  78. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/coupleinterface.py +0 -0
  79. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/pointinterface.py +0 -0
  80. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/pressureinterface.py +0 -0
  81. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/referencepointinterface.py +0 -0
  82. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feainterface/springinterface.py +0 -0
  83. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/feaparams.py +0 -0
  84. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/materials.py +0 -0
  85. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/modelparams/params.py +0 -0
  86. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/objfunc.py +0 -0
  87. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/solver.py +0 -0
  88. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/optcore/updaters.py +0 -0
  89. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/__init__.py +0 -0
  90. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/geometryinterfaces/__init__.py +0 -0
  91. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/geometryinterfaces/basesurfaceinterface.py +0 -0
  92. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/geometryinterfaces/bspsurfaceinterface.py +0 -0
  93. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/geometryinterfaces/cpgeosurfaceinterface.py +0 -0
  94. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/__init__.py +0 -0
  95. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/basefuncs.py +0 -0
  96. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/boundarys.py +0 -0
  97. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/distancesurface.py +0 -0
  98. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/shapederivative.py +0 -0
  99. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/surfacefairness.py +0 -0
  100. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objectivefuncs/volumemaximization.py +0 -0
  101. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/objfunc.py +0 -0
  102. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/shapeopt/update_geometry.py +0 -0
  103. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/__init__.py +0 -0
  104. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/__init__.py +0 -0
  105. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/basefuncs.py +0 -0
  106. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/boundarys.py +0 -0
  107. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/densityfield.py +0 -0
  108. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/sensitivity.py +0 -0
  109. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/objectivefuncs/volfrac.py +0 -0
  110. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/simpmaterial.py +0 -0
  111. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/solver.py +0 -0
  112. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/simp/update_material.py +0 -0
  113. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/taskoptmization.py +0 -0
  114. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/__main__.py +0 -0
  115. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/codegen/__init__.py +0 -0
  116. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/model/__init__.py +0 -0
  117. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/ui/model/loaders.py +0 -0
  118. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/utils/__init__.py +0 -0
  119. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/utils/gradient_check.py +0 -0
  120. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt/utils/history_read.py +0 -0
  121. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt.egg-info/dependency_links.txt +0 -0
  122. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt.egg-info/entry_points.txt +0 -0
  123. {morphopt-3.1.6 → morphopt-3.2.0}/src/morphopt.egg-info/top_level.txt +0 -0
  124. {morphopt-3.1.6 → morphopt-3.2.0}/tests/test_fixedGeometry.py +0 -0
  125. {morphopt-3.1.6 → morphopt-3.2.0}/tests/test_path.py +0 -0
  126. {morphopt-3.1.6 → morphopt-3.2.0}/tests/test_ui.py +0 -0
@@ -0,0 +1,151 @@
1
+ Metadata-Version: 2.4
2
+ Name: morphopt
3
+ Version: 3.2.0
4
+ Summary: A morphing optimization framework using PyTorch and Abaqus.
5
+ Requires-Python: >=3.12
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: torch>=2.9.1
8
+ Requires-Dist: torchvision>=0.15.1
9
+ Requires-Dist: numpy>=2.0.0
10
+ Requires-Dist: pypardiso>=0.4.7
11
+ Requires-Dist: pyside6>=6.8.0
12
+ Requires-Dist: pyvista>=0.47.1
13
+ Requires-Dist: pyvistaqt>=0.11.3
14
+ Requires-Dist: vtk>=9.6.1
15
+ Requires-Dist: gmsh>=4.15.0
16
+ Requires-Dist: tabulate>=0.9.0
17
+ Requires-Dist: imageio>=2.37.3
18
+ Requires-Dist: bspmap>=1.0.3
19
+ Requires-Dist: torchfea>=1.1.0
20
+ Requires-Dist: trimesh>=4.11.5
21
+ Requires-Dist: networkx>=3.6.1
22
+ Requires-Dist: scipy>=1.17.1
23
+ Requires-Dist: cpgeo>=1.0.12
24
+
25
+ # MorphOpt — A Differentiable Optimization Framework for Soft Structure & Morphology Design
26
+
27
+ **Developed by Zenan Song**
28
+
29
+ A differentiable structural optimization framework that eliminates manual sensitivity derivation by fusing the adjoint method with automatic differentiation (AD). The sensitivity corresponds to the virtual work of residual force derivatives on the adjoint displacement field, computed via a single backpropagation through the residual graph. MorphOpt provides a unified interface for geometry, load, and material definition, calls torchfea for GPU-accelerated differentiable nonlinear FEA and adjoint-AD sensitivity, and employs a trust-region optimizer with L-BFGS for design updates. Validated on SIMP topology optimization with B-spline density fields and pneumatic soft robot shape optimization with deformation-dependent follower loads.
30
+
31
+ ## Features
32
+
33
+ - Custom model definition covering geometry, material, and load parameters
34
+ - Differentiable FEA via torchfea with automatic solving and sensitivity propagation
35
+ - L-BFGS and trust-region methods for parameter updates within a subproblem framework
36
+ - Fully extensible via inheritance — users customize every component in their definition scripts
37
+
38
+ ## Quick Start
39
+
40
+ Install the package:
41
+
42
+ ```bash
43
+ pip install morphopt
44
+ ```
45
+
46
+ Requirements: Python ≥ 3.12; a PyTorch **float64** build is recommended.
47
+
48
+ > **Optimizations are run as scripts.** Each job is an ordinary Python file that calls `morphopt.start_optimization(...)`. It runs headlessly in a terminal (local or remote), and a finished run can be stopped and resumed later from its result folder. Script execution is the recommended way to run jobs.
49
+
50
+ 1. **Run a minimal example** — execute it directly in a terminal:
51
+
52
+ ```bash
53
+ # Shape optimization (pneumatic bending actuator)
54
+ python examples/bendingactuator.py
55
+
56
+ # SIMP topology optimization (compliant gripper)
57
+ python examples/gripper.py
58
+ ```
59
+
60
+ 2. **Run your own job** — copy an example as a starting point, adapt the definition (geometry, material, load, updater, objective), and launch it as a script:
61
+
62
+ ```bash
63
+ python my_task.py
64
+ ```
65
+
66
+ Each run writes its results (logs, FEA files, restart script) into a timestamped result folder under the run root.
67
+
68
+ 3. **Optional — the GUI** is a visual aid for authoring a problem definition and inspecting finished runs in one window. It can also export a runnable script (`.py`), which you can either run directly in the UI or further customize before executing it via Step 2 in a terminal.
69
+
70
+ ```bash
71
+ morphopt-ui # console command, available after `pip install morphopt`
72
+ # python -m morphopt.ui works too (handy when running from a source code directory)
73
+ ```
74
+
75
+ The complete UI workflow (definition part + observer part) is described in [`docs/UI_usage.md`](docs/UI_usage.md).
76
+
77
+ Further references:
78
+
79
+ - Task definition guide: `docs/module_definition_guide.md`
80
+ - Module API reference: `docs/module_reference.md`
81
+ - Theory & papers: `docs/theory/`
82
+
83
+ ## Directory Overview
84
+
85
+ - `src/morphopt/`
86
+ - `optcore` — Core package (controller, params, solver, objective, updaters)
87
+ - `shapeopt/` — B-spline shape optimization
88
+ - `simp/` — SIMP topology optimization
89
+ - `codesign/` — Shell co-design (shape + material)
90
+ - `ui/` — PySide6 graphical UI (definition + observer in one window)
91
+ - `examples/` — Example tasks (bending actuator, gripper, etc.)
92
+ - `docs/` — Usage guides, API reference, theory papers
93
+ - `tests/` — Gradient checks, geometry tests, UI tests
94
+ - `ui_runs/` — runs launched from the UI and their results (`<label>_T<timestamp>/`)
95
+
96
+ ## License
97
+
98
+ Research use preferred. For production or commercial use, please evaluate and ensure numerical and engineering robustness first.
99
+
100
+ ## Citation
101
+
102
+ If you use MorphOpt in your research, please cite:
103
+
104
+ - TRO 2023
105
+
106
+ ```
107
+ @ARTICLE{10296178,
108
+ author={Chen, Feifei and Song, Zenan and Chen, Shitong and Gu, Guoying and Zhu, Xiangyang},
109
+ journal={IEEE Transactions on Robotics},
110
+ title={Morphological Design for Pneumatic Soft Actuators and Robots With Desired Deformation Behavior},
111
+ year={2023},
112
+ volume={39},
113
+ number={6},
114
+ pages={4408-4428},
115
+ keywords={Shape;Surface morphology;Robots;Splines (mathematics);Pneumatic systems;Actuators;Soft robotics;Morphological design;shape optimization;pneumatic soft robots},
116
+ doi={10.1109/TRO.2023.3323825}}
117
+ ```
118
+
119
+ - TRO 2026
120
+
121
+ ```
122
+ @ARTICLE{11617347,
123
+ author={Song, Zenan and Chen, Feifei and Gu, Guoying and Zhu, Xiangyang},
124
+ journal={IEEE Transactions on Robotics},
125
+ title={Continuum Jacobian-Based Computational Morphogenesis for Soft Robotic Workspace Optimization},
126
+ year={2026},
127
+ volume={42},
128
+ number={},
129
+ pages={3048-3068},
130
+ keywords={Optimization;Design methodology;Surfaces;Modeling;End effectors;Shape;Soft robotics;Deformation;Vectors;Robots;Computational morphogenesis;Jacobian shape derivative;soft robotics;workspace optimization},
131
+ doi={10.1109/TRO.2026.3716051}}
132
+
133
+ ```
134
+
135
+ - TMECH 2026
136
+
137
+ ```
138
+ @ARTICLE{11536090,
139
+ author={Song, Zenan and Zhou, Guozhen and Chen, Feifei},
140
+ journal={IEEE/ASME Transactions on Mechatronics},
141
+ title={Contact-Aware Soft Robot Design via Differentiable Simulation and Morphological Optimization},
142
+ year={2026},
143
+ volume={31},
144
+ number={4},
145
+ pages={4576-4584},
146
+ keywords={Contacts;Optimization;Modeling;Design methodology;Soft robotics;Surfaces;Actuators;Materials;Force;Simulation;Differentiable contact modeling;morphological design;soft robotics},
147
+ doi={10.1109/TMECH.2026.3692920}}
148
+
149
+ ```
150
+
151
+
@@ -0,0 +1,127 @@
1
+ # MorphOpt — A Differentiable Optimization Framework for Soft Structure & Morphology Design
2
+
3
+ **Developed by Zenan Song**
4
+
5
+ A differentiable structural optimization framework that eliminates manual sensitivity derivation by fusing the adjoint method with automatic differentiation (AD). The sensitivity corresponds to the virtual work of residual force derivatives on the adjoint displacement field, computed via a single backpropagation through the residual graph. MorphOpt provides a unified interface for geometry, load, and material definition, calls torchfea for GPU-accelerated differentiable nonlinear FEA and adjoint-AD sensitivity, and employs a trust-region optimizer with L-BFGS for design updates. Validated on SIMP topology optimization with B-spline density fields and pneumatic soft robot shape optimization with deformation-dependent follower loads.
6
+
7
+ ## Features
8
+
9
+ - Custom model definition covering geometry, material, and load parameters
10
+ - Differentiable FEA via torchfea with automatic solving and sensitivity propagation
11
+ - L-BFGS and trust-region methods for parameter updates within a subproblem framework
12
+ - Fully extensible via inheritance — users customize every component in their definition scripts
13
+
14
+ ## Quick Start
15
+
16
+ Install the package:
17
+
18
+ ```bash
19
+ pip install morphopt
20
+ ```
21
+
22
+ Requirements: Python ≥ 3.12; a PyTorch **float64** build is recommended.
23
+
24
+ > **Optimizations are run as scripts.** Each job is an ordinary Python file that calls `morphopt.start_optimization(...)`. It runs headlessly in a terminal (local or remote), and a finished run can be stopped and resumed later from its result folder. Script execution is the recommended way to run jobs.
25
+
26
+ 1. **Run a minimal example** — execute it directly in a terminal:
27
+
28
+ ```bash
29
+ # Shape optimization (pneumatic bending actuator)
30
+ python examples/bendingactuator.py
31
+
32
+ # SIMP topology optimization (compliant gripper)
33
+ python examples/gripper.py
34
+ ```
35
+
36
+ 2. **Run your own job** — copy an example as a starting point, adapt the definition (geometry, material, load, updater, objective), and launch it as a script:
37
+
38
+ ```bash
39
+ python my_task.py
40
+ ```
41
+
42
+ Each run writes its results (logs, FEA files, restart script) into a timestamped result folder under the run root.
43
+
44
+ 3. **Optional — the GUI** is a visual aid for authoring a problem definition and inspecting finished runs in one window. It can also export a runnable script (`.py`), which you can either run directly in the UI or further customize before executing it via Step 2 in a terminal.
45
+
46
+ ```bash
47
+ morphopt-ui # console command, available after `pip install morphopt`
48
+ # python -m morphopt.ui works too (handy when running from a source code directory)
49
+ ```
50
+
51
+ The complete UI workflow (definition part + observer part) is described in [`docs/UI_usage.md`](docs/UI_usage.md).
52
+
53
+ Further references:
54
+
55
+ - Task definition guide: `docs/module_definition_guide.md`
56
+ - Module API reference: `docs/module_reference.md`
57
+ - Theory & papers: `docs/theory/`
58
+
59
+ ## Directory Overview
60
+
61
+ - `src/morphopt/`
62
+ - `optcore` — Core package (controller, params, solver, objective, updaters)
63
+ - `shapeopt/` — B-spline shape optimization
64
+ - `simp/` — SIMP topology optimization
65
+ - `codesign/` — Shell co-design (shape + material)
66
+ - `ui/` — PySide6 graphical UI (definition + observer in one window)
67
+ - `examples/` — Example tasks (bending actuator, gripper, etc.)
68
+ - `docs/` — Usage guides, API reference, theory papers
69
+ - `tests/` — Gradient checks, geometry tests, UI tests
70
+ - `ui_runs/` — runs launched from the UI and their results (`<label>_T<timestamp>/`)
71
+
72
+ ## License
73
+
74
+ Research use preferred. For production or commercial use, please evaluate and ensure numerical and engineering robustness first.
75
+
76
+ ## Citation
77
+
78
+ If you use MorphOpt in your research, please cite:
79
+
80
+ - TRO 2023
81
+
82
+ ```
83
+ @ARTICLE{10296178,
84
+ author={Chen, Feifei and Song, Zenan and Chen, Shitong and Gu, Guoying and Zhu, Xiangyang},
85
+ journal={IEEE Transactions on Robotics},
86
+ title={Morphological Design for Pneumatic Soft Actuators and Robots With Desired Deformation Behavior},
87
+ year={2023},
88
+ volume={39},
89
+ number={6},
90
+ pages={4408-4428},
91
+ keywords={Shape;Surface morphology;Robots;Splines (mathematics);Pneumatic systems;Actuators;Soft robotics;Morphological design;shape optimization;pneumatic soft robots},
92
+ doi={10.1109/TRO.2023.3323825}}
93
+ ```
94
+
95
+ - TRO 2026
96
+
97
+ ```
98
+ @ARTICLE{11617347,
99
+ author={Song, Zenan and Chen, Feifei and Gu, Guoying and Zhu, Xiangyang},
100
+ journal={IEEE Transactions on Robotics},
101
+ title={Continuum Jacobian-Based Computational Morphogenesis for Soft Robotic Workspace Optimization},
102
+ year={2026},
103
+ volume={42},
104
+ number={},
105
+ pages={3048-3068},
106
+ keywords={Optimization;Design methodology;Surfaces;Modeling;End effectors;Shape;Soft robotics;Deformation;Vectors;Robots;Computational morphogenesis;Jacobian shape derivative;soft robotics;workspace optimization},
107
+ doi={10.1109/TRO.2026.3716051}}
108
+
109
+ ```
110
+
111
+ - TMECH 2026
112
+
113
+ ```
114
+ @ARTICLE{11536090,
115
+ author={Song, Zenan and Zhou, Guozhen and Chen, Feifei},
116
+ journal={IEEE/ASME Transactions on Mechatronics},
117
+ title={Contact-Aware Soft Robot Design via Differentiable Simulation and Morphological Optimization},
118
+ year={2026},
119
+ volume={31},
120
+ number={4},
121
+ pages={4576-4584},
122
+ keywords={Contacts;Optimization;Modeling;Design methodology;Soft robotics;Surfaces;Actuators;Materials;Force;Simulation;Differentiable contact modeling;morphological design;soft robotics},
123
+ doi={10.1109/TMECH.2026.3692920}}
124
+
125
+ ```
126
+
127
+
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "morphopt"
3
- version = "3.1.6"
3
+ version = "3.2.0"
4
4
  description = "A morphing optimization framework using PyTorch and Abaqus."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -17,7 +17,7 @@ dependencies = [
17
17
  "tabulate>=0.9.0",
18
18
  "imageio>=2.37.3",
19
19
  "bspmap>=1.0.3",
20
- "torchfea>=1.0.17",
20
+ "torchfea>=1.1.0",
21
21
  "trimesh>=4.11.5",
22
22
  "networkx>=3.6.1",
23
23
  "scipy>=1.17.1",
@@ -40,7 +40,7 @@ class CodesignFEAParams(FEAParams):
40
40
  )
41
41
  surfcenter = surfnodes.mean(dim=1)
42
42
 
43
- fe.assembly.get_instance('final_model').external_surface = 'surface_1_offset'
43
+ fe.assembly.get_instance('final_model').exterior_surface = 'surface_1_offset'
44
44
 
45
45
  mesh_1all = fe.assembly.get_instance('final_model').get_mesh(surf_name='surface_1_All')
46
46
  mesh_1offset = fe.assembly.get_instance('final_model').get_mesh(surf_name='surface_1_offset')
@@ -72,4 +72,4 @@ class CodesignFEAParams(FEAParams):
72
72
 
73
73
  raise ValueError("The Gaussian weights of the C3D6 elements are negative. Please check the mesh quality.")
74
74
 
75
- return fe
75
+ return fe
@@ -2,8 +2,8 @@
2
2
 
3
3
  Runs started from *code* never open a UI: the PySide6 observer lives inside the
4
4
  MorphOpt UI and simply polls the result folder on disk (per finished
5
- iteration). The old ``no_gui`` flag and the separate observer process were
6
- therefore removed; ``view_optimization_result`` lives on the UI side now.
5
+ iteration). The old ``no_gui`` flag and separate observer process were
6
+ therefore removed; browse results from the observer page in the main UI.
7
7
  """
8
8
 
9
9
 
@@ -85,6 +85,8 @@ class FixedGeometryINP(FixedGeometry):
85
85
 
86
86
  assembly = torchfea.Assembly()
87
87
 
88
- assembly.add_part(part=fe_ext.assembly.get_part(self._part_name), name='final_model')
89
- assembly.add_instance(instance=torchfea.Instance(part_name='final_model', external_surface='surface_0_All'), name='final_model')
90
- return assembly
88
+ assembly.add_part(part=fe_ext.assembly.get_part(self._part_name), name='final_model')
89
+ instance = torchfea.Instance(part_name='final_model')
90
+ assembly.add_instance(instance=instance, name='final_model')
91
+ instance.exterior_surface = 'surface_0_All'
92
+ return assembly
@@ -640,7 +640,9 @@ class GeometryParams(BaseGeometry):
640
640
  assembly = torchfea.Assembly()
641
641
 
642
642
  assembly.add_part(part=part, name='final_model')
643
- assembly.add_instance(instance=torchfea.Instance(part_name='final_model', external_surface='surface_0_All'), name='final_model')
643
+ instance = torchfea.Instance(part_name='final_model')
644
+ assembly.add_instance(instance=instance, name='final_model')
645
+ instance.exterior_surface = 'surface_0_All'
644
646
  return assembly
645
647
 
646
648
  def _regenerate(self, path_result: str, pools = None):
@@ -776,4 +778,3 @@ class GeometryParams(BaseGeometry):
776
778
  nodes_new[part.mid_pt_idxmap_torch[:, 2]] = (nodes_new[part.mid_pt_idxmap_torch[:, 0]] + nodes_new[part.mid_pt_idxmap_torch[:, 1]]) / 2
777
779
 
778
780
  part.nodes = nodes_new
779
-
@@ -21,7 +21,8 @@ ui/widgets/ modeltree / editor / stepmatrix / codeeditor / viewer
21
21
  ui/schemes/ per-scheme templates + generators
22
22
  ui/launcher.py headless job launch / continue / result helpers
23
23
 
24
- The design spec lives at the repository root in ``UIprompt.md``.
24
+ The maintainability contract lives in
25
+ ``docs/codestructure/ui_code_design.md``.
25
26
  """
26
27
 
27
28
  from __future__ import annotations
@@ -38,13 +38,20 @@ def configure_environment() -> None:
38
38
  os.environ.setdefault("KMP_DUPLICATE_LIB_OK", "True")
39
39
 
40
40
 
41
- def main() -> int:
41
+ def create_application(argv: list[str] | None = None):
42
+ """Create the shared QApplication with MorphOpt's process-wide settings."""
42
43
  configure_environment()
43
44
 
44
45
  from PySide6.QtWidgets import QApplication
45
46
 
46
- app = QApplication(sys.argv)
47
+ app = QApplication.instance() or QApplication(argv or sys.argv)
47
48
  app.setStyleSheet(_DARK_QSS)
49
+ return app
50
+
51
+
52
+ def main() -> int:
53
+ """Launch the definition page in the main application window."""
54
+ app = create_application()
48
55
 
49
56
  from .mainwindow import MainWindow
50
57