autoforge 2.1.1__tar.gz → 2.2.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 (131) hide show
  1. {autoforge-2.1.1 → autoforge-2.2.1}/PKG-INFO +6 -8
  2. {autoforge-2.1.1 → autoforge-2.2.1}/README.md +3 -6
  3. {autoforge-2.1.1 → autoforge-2.2.1}/pyproject.toml +4 -3
  4. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/PKG-INFO +6 -8
  5. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/SOURCES.txt +17 -1
  6. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/requires.txt +1 -0
  7. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/AmpUtils.py +8 -3
  8. autoforge-2.2.1/src/autoforge/Helper/BorderMesh.py +532 -0
  9. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/DeterministicOps.py +5 -0
  10. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/DeviceUtils.py +19 -0
  11. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/FilamentHelper.py +71 -16
  12. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/FusedComposite.py +166 -17
  13. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/HeightAssign.py +6 -1
  14. autoforge-2.2.1/src/autoforge/Helper/HeightGuidance.py +617 -0
  15. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/HeightfieldMesh.py +13 -2
  16. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/Heightmaps/ChristofidesHeightMap.py +5 -2
  17. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/Heightmaps/DepthEstimateHeightMap.py +13 -10
  18. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/Heightmaps/FastTSPHeightMap.py +44 -2
  19. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/Heightmaps/_cluster.py +59 -20
  20. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/ImageHelper.py +55 -3
  21. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/OptimizerHelper.py +44 -5
  22. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/OtherHelper.py +9 -0
  23. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/OutputHelper.py +100 -25
  24. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/PixelHeightRefine.py +214 -44
  25. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/PruningHelper.py +165 -144
  26. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Init_comparer/auto_forge_init_check.py +1 -1
  27. autoforge-2.2.1/src/autoforge/Init_comparer/plot_results.py +124 -0
  28. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Modules/Optimizer.py +317 -120
  29. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/auto_forge.py +196 -60
  30. autoforge-2.2.1/src/autoforge/default_materials.csv +15 -0
  31. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/priority_mask_editor.py +23 -15
  32. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/filaments.py +4 -1
  33. autoforge-2.2.1/src/autoforge/webui/api/guidance.py +105 -0
  34. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/images.py +22 -3
  35. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/init.py +50 -1
  36. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/optimization.py +273 -15
  37. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/outputs.py +179 -7
  38. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/preview.py +58 -29
  39. autoforge-2.2.1/src/autoforge/webui/api/project.py +221 -0
  40. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/pruning.py +359 -87
  41. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/sliders.py +60 -7
  42. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/system.py +31 -4
  43. autoforge-2.2.1/src/autoforge/webui/api/workers.py +63 -0
  44. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/ws.py +44 -4
  45. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/config.py +13 -1
  46. autoforge-2.2.1/src/autoforge/webui/helpers/auto_prune.py +186 -0
  47. autoforge-2.2.1/src/autoforge/webui/helpers/border.py +173 -0
  48. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/colored_mesh.py +7 -7
  49. autoforge-2.2.1/src/autoforge/webui/helpers/edited_export.py +147 -0
  50. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/gpu_memory.py +13 -2
  51. autoforge-2.2.1/src/autoforge/webui/helpers/guidance_views.py +224 -0
  52. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/mesh_persist.py +5 -0
  53. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/pipeline_runner.py +432 -170
  54. autoforge-2.2.1/src/autoforge/webui/helpers/project_heightmap.py +134 -0
  55. autoforge-2.2.1/src/autoforge/webui/helpers/result_store.py +444 -0
  56. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/slider_render.py +41 -28
  57. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/sliders.py +19 -0
  58. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/telemetry.py +20 -6
  59. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/models.py +150 -8
  60. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/server.py +94 -11
  61. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/catalog_service.py +1 -1
  62. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/filament_service.py +51 -12
  63. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/image_service.py +15 -5
  64. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/optimization_service.py +28 -2
  65. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/project_service.py +19 -3
  66. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_amp_utils.py +14 -0
  67. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_auto_forge_cli.py +1 -1
  68. autoforge-2.2.1/tests/test_border_mesh.py +356 -0
  69. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_bugfixes_2026_09_26.py +4 -1
  70. autoforge-2.2.1/tests/test_bugreport_2026_10_01.py +635 -0
  71. autoforge-2.2.1/tests/test_bugreport_2026_10_03.py +418 -0
  72. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_device_utils.py +75 -14
  73. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_fasttsp_heightmap.py +23 -0
  74. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_filamentcolors_library.py +5 -2
  75. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_graph_cache_eviction.py +47 -0
  76. autoforge-2.2.1/tests/test_height_guidance.py +590 -0
  77. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_output_helper.py +57 -0
  78. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_prune_repeatability.py +4 -2
  79. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_remove_height_spikes.py +63 -0
  80. autoforge-2.2.1/tests/test_worktree_bugs_2026_10_01.py +376 -0
  81. autoforge-2.1.1/src/autoforge/Init_comparer/plot_results.py +0 -116
  82. autoforge-2.1.1/src/autoforge/webui/api/project.py +0 -43
  83. {autoforge-2.1.1 → autoforge-2.2.1}/setup.cfg +0 -0
  84. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/dependency_links.txt +0 -0
  85. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/entry_points.txt +0 -0
  86. {autoforge-2.1.1 → autoforge-2.2.1}/src/AutoForge.egg-info/top_level.txt +0 -0
  87. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/CAdamW.py +0 -0
  88. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/ConstraintHelper.py +0 -0
  89. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/Heightmaps/__init__.py +0 -0
  90. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/__init__.py +0 -0
  91. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Helper/filamentcolors_library.py +0 -0
  92. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Init_comparer/__init__.py +0 -0
  93. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Loss/LossFunctions.py +0 -0
  94. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Loss/PerceptionLoss.py +0 -0
  95. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Loss/__init__.py +0 -0
  96. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Misc/__init__.py +0 -0
  97. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Misc/color_fit_all.py +0 -0
  98. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/Modules/__init__.py +0 -0
  99. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/__init__.py +0 -0
  100. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/__main__.py +0 -0
  101. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/data/filamentcolors_catalog.json +0 -0
  102. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/__init__.py +0 -0
  103. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/__init__.py +0 -0
  104. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/settings.py +0 -0
  105. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/api/state.py +0 -0
  106. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/helpers/__init__.py +0 -0
  107. {autoforge-2.1.1 → autoforge-2.2.1}/src/autoforge/webui/services/__init__.py +0 -0
  108. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_bug_regressions.py +0 -0
  109. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_cadamw.py +0 -0
  110. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_christofides_heightmap.py +0 -0
  111. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_composite_image.py +0 -0
  112. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_constrained_opt.py +0 -0
  113. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_depth_adjusted_height_map.py +0 -0
  114. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_depth_estimate_height_map.py +0 -0
  115. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_edge_bleed.py +0 -0
  116. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_end_to_end_optimizer.py +0 -0
  117. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_filament_helper.py +0 -0
  118. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_flatforge.py +0 -0
  119. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_graph_capture_threads.py +0 -0
  120. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_gumbel_nan.py +0 -0
  121. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_image_helper.py +0 -0
  122. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_loss_functions.py +0 -0
  123. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_optimizer_module.py +0 -0
  124. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_optimizer_training.py +0 -0
  125. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_other_helper.py +0 -0
  126. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_perception_loss.py +0 -0
  127. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_pipeline_smoke.py +0 -0
  128. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_property_based.py +0 -0
  129. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_pruning_helper.py +0 -0
  130. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_webui_backend.py +0 -0
  131. {autoforge-2.1.1 → autoforge-2.2.1}/tests/test_webui_regressions.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AutoForge
3
- Version: 2.1.1
3
+ Version: 2.2.1
4
4
  Summary: AutoForge - 3D color prints made easy
5
5
  Author-email: Hendric Voss <hvoss@techfak.uni-bielefeld.de>
6
6
  License: CC BY-NC-SA 4.0
7
- Requires-Python: >=3.10
7
+ Requires-Python: <3.15,>=3.10
8
8
  Description-Content-Type: text/markdown
9
9
  Requires-Dist: numpy
10
10
  Requires-Dist: torch>=2.9.1
@@ -29,6 +29,7 @@ Requires-Dist: aiofiles>=24.1.0
29
29
  Requires-Dist: websockets>=15.0
30
30
  Requires-Dist: pydantic-settings>=2.0.0
31
31
  Requires-Dist: posthog>=3.7.0
32
+ Requires-Dist: manifold3d>=3.2
32
33
  Provides-Extra: test
33
34
  Requires-Dist: pytest>=7.4; extra == "test"
34
35
  Requires-Dist: pytest-cov; extra == "test"
@@ -93,6 +94,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
93
94
  - Windows: double-click `run_webui.bat`
94
95
 
95
96
  This starts the server and opens the web UI in your browser automatically (usually at `http://localhost:8000`).
97
+ It only listens on this computer by default, since the web UI has no login. To open it from other devices on your network, start it with `WEBUI_HOST=0.0.0.0 ./run_webui.sh` (Windows: `set WEBUI_HOST=0.0.0.0` before `run_webui.bat`). Open it by IP address or by this computer's name; any other name (for example one from a reverse proxy) has to be listed in `AUTOFORGE_WEBUI_ALLOWED_HOSTS` (comma separated).
96
98
 
97
99
  To make some parts of the picture come out closer than the rest (a face, the eyes, lettering), click **Focus** in the image panel and paint over them; a slider sets how much more they count (2× to 100×, default 10×). After a run, the **Differences** view shows where the print strays furthest from the picture.
98
100
 
@@ -100,7 +102,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
100
102
 
101
103
  To find a filament you own without measuring it yourself, click **Catalog** in the filament library. It searches every filament on [filamentcolors.xyz](https://filamentcolors.xyz) that has a measured TD (search by brand, color name, type or hex code; filter by type, brand or color family; or pick a color to see the closest matches first), and **Add** puts it straight into your library.
102
104
 
103
- The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data, or personal information is sent. To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
105
+ The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data or other personal information is sent, except that error messages and stack traces can contain file paths (the backend replaces your home folder in them with `~`, so your user name isn't sent from there; the browser's own stack traces only name the app's script files). To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
104
106
 
105
107
  4. **Update to the latest release** whenever you want, from the project folder:
106
108
  - Linux/macOS: `./update.sh`
@@ -193,7 +195,7 @@ This will generate separate STL files for each color, allowing you to print face
193
195
  - `--processing_reduction_factor` Reduction factor for the processing size compared to the output size (default: 2 - half resolution).
194
196
  - `--nozzle_diameter` Diameter of the printer nozzle in millimeters (default: 0.4).
195
197
  **Note:** Details smaller than half this value will be ignored.
196
- - `--early_stopping` Number of steps without improvement before stopping (default: 10000).
198
+ - `--early_stopping` Number of steps without improvement before stopping (default: 3000).
197
199
  - `--priority_mask` *(Optional)* Path to a greyscale image the size of the input that marks the parts that matter most: white areas are matched more closely, black areas still count, just less.
198
200
  - `--priority_mask_strength` How many times more a white pixel of `--priority_mask` counts than a black one (default: 10; must be at least 1). Raise it if the marked areas still come out off, lower it for a gentler nudge.
199
201
 
@@ -334,10 +336,6 @@ docker run --rm -v "$PWD:/work" -w /work autoforge-webui:cpu \
334
336
  ```
335
337
  The container runs as root, so on Linux the output files belong to root; `sudo chown -R "$USER" output` makes them yours again.
336
338
 
337
- ## You can now run Autoforge for free in your browser thanks to [Huggingface space support](https://huggingface.co/spaces/hvoss-techfak/Autoforge).
338
- This includes the option to run it locally if you have a powerful pc and don't want to limit yourself to the Huggingface computing limits. \
339
- For this simply go to the [Huggingface](https://huggingface.co/spaces/hvoss-techfak/Autoforge) space and pull the docker container for this project (upper right corner -> three dots -> "run locally")
340
-
341
339
  ## Development
342
340
 
343
341
  To have a "nightly" version of the repository or have live updating changes during development please do the following:
@@ -56,6 +56,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
56
56
  - Windows: double-click `run_webui.bat`
57
57
 
58
58
  This starts the server and opens the web UI in your browser automatically (usually at `http://localhost:8000`).
59
+ It only listens on this computer by default, since the web UI has no login. To open it from other devices on your network, start it with `WEBUI_HOST=0.0.0.0 ./run_webui.sh` (Windows: `set WEBUI_HOST=0.0.0.0` before `run_webui.bat`). Open it by IP address or by this computer's name; any other name (for example one from a reverse proxy) has to be listed in `AUTOFORGE_WEBUI_ALLOWED_HOSTS` (comma separated).
59
60
 
60
61
  To make some parts of the picture come out closer than the rest (a face, the eyes, lettering), click **Focus** in the image panel and paint over them; a slider sets how much more they count (2× to 100×, default 10×). After a run, the **Differences** view shows where the print strays furthest from the picture.
61
62
 
@@ -63,7 +64,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
63
64
 
64
65
  To find a filament you own without measuring it yourself, click **Catalog** in the filament library. It searches every filament on [filamentcolors.xyz](https://filamentcolors.xyz) that has a measured TD (search by brand, color name, type or hex code; filter by type, brand or color family; or pick a color to see the closest matches first), and **Add** puts it straight into your library.
65
66
 
66
- The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data, or personal information is sent. To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
67
+ The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data or other personal information is sent, except that error messages and stack traces can contain file paths (the backend replaces your home folder in them with `~`, so your user name isn't sent from there; the browser's own stack traces only name the app's script files). To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
67
68
 
68
69
  4. **Update to the latest release** whenever you want, from the project folder:
69
70
  - Linux/macOS: `./update.sh`
@@ -156,7 +157,7 @@ This will generate separate STL files for each color, allowing you to print face
156
157
  - `--processing_reduction_factor` Reduction factor for the processing size compared to the output size (default: 2 - half resolution).
157
158
  - `--nozzle_diameter` Diameter of the printer nozzle in millimeters (default: 0.4).
158
159
  **Note:** Details smaller than half this value will be ignored.
159
- - `--early_stopping` Number of steps without improvement before stopping (default: 10000).
160
+ - `--early_stopping` Number of steps without improvement before stopping (default: 3000).
160
161
  - `--priority_mask` *(Optional)* Path to a greyscale image the size of the input that marks the parts that matter most: white areas are matched more closely, black areas still count, just less.
161
162
  - `--priority_mask_strength` How many times more a white pixel of `--priority_mask` counts than a black one (default: 10; must be at least 1). Raise it if the marked areas still come out off, lower it for a gentler nudge.
162
163
 
@@ -297,10 +298,6 @@ docker run --rm -v "$PWD:/work" -w /work autoforge-webui:cpu \
297
298
  ```
298
299
  The container runs as root, so on Linux the output files belong to root; `sudo chown -R "$USER" output` makes them yours again.
299
300
 
300
- ## You can now run Autoforge for free in your browser thanks to [Huggingface space support](https://huggingface.co/spaces/hvoss-techfak/Autoforge).
301
- This includes the option to run it locally if you have a powerful pc and don't want to limit yourself to the Huggingface computing limits. \
302
- For this simply go to the [Huggingface](https://huggingface.co/spaces/hvoss-techfak/Autoforge) space and pull the docker container for this project (upper right corner -> three dots -> "run locally")
303
-
304
301
  ## Development
305
302
 
306
303
  To have a "nightly" version of the repository or have live updating changes during development please do the following:
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "AutoForge"
7
- version="2.1.1"
7
+ version="2.2.1"
8
8
  description = "AutoForge - 3D color prints made easy"
9
9
  authors = [{ name = "Hendric Voss", email = "hvoss@techfak.uni-bielefeld.de" }]
10
10
  readme = "README.md"
11
- requires-python = ">=3.10"
11
+ requires-python = ">=3.10,<3.15"
12
12
  license = { text = "CC BY-NC-SA 4.0" }
13
13
  dependencies = [
14
14
  "numpy",
@@ -34,6 +34,7 @@ dependencies = [
34
34
  "websockets>=15.0",
35
35
  "pydantic-settings>=2.0.0",
36
36
  "posthog>=3.7.0",
37
+ "manifold3d>=3.2",
37
38
  ]
38
39
 
39
40
  [project.optional-dependencies]
@@ -51,7 +52,7 @@ test = [
51
52
  package-dir = {"" = "src"}
52
53
 
53
54
  [tool.setuptools.package-data]
54
- autoforge = ["data/*.json"]
55
+ autoforge = ["data/*.json", "default_materials.csv"]
55
56
 
56
57
  [project.scripts]
57
58
  autoforge = "autoforge.auto_forge:main"
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AutoForge
3
- Version: 2.1.1
3
+ Version: 2.2.1
4
4
  Summary: AutoForge - 3D color prints made easy
5
5
  Author-email: Hendric Voss <hvoss@techfak.uni-bielefeld.de>
6
6
  License: CC BY-NC-SA 4.0
7
- Requires-Python: >=3.10
7
+ Requires-Python: <3.15,>=3.10
8
8
  Description-Content-Type: text/markdown
9
9
  Requires-Dist: numpy
10
10
  Requires-Dist: torch>=2.9.1
@@ -29,6 +29,7 @@ Requires-Dist: aiofiles>=24.1.0
29
29
  Requires-Dist: websockets>=15.0
30
30
  Requires-Dist: pydantic-settings>=2.0.0
31
31
  Requires-Dist: posthog>=3.7.0
32
+ Requires-Dist: manifold3d>=3.2
32
33
  Provides-Extra: test
33
34
  Requires-Dist: pytest>=7.4; extra == "test"
34
35
  Requires-Dist: pytest-cov; extra == "test"
@@ -93,6 +94,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
93
94
  - Windows: double-click `run_webui.bat`
94
95
 
95
96
  This starts the server and opens the web UI in your browser automatically (usually at `http://localhost:8000`).
97
+ It only listens on this computer by default, since the web UI has no login. To open it from other devices on your network, start it with `WEBUI_HOST=0.0.0.0 ./run_webui.sh` (Windows: `set WEBUI_HOST=0.0.0.0` before `run_webui.bat`). Open it by IP address or by this computer's name; any other name (for example one from a reverse proxy) has to be listed in `AUTOFORGE_WEBUI_ALLOWED_HOSTS` (comma separated).
96
98
 
97
99
  To make some parts of the picture come out closer than the rest (a face, the eyes, lettering), click **Focus** in the image panel and paint over them; a slider sets how much more they count (2× to 100×, default 10×). After a run, the **Differences** view shows where the print strays furthest from the picture.
98
100
 
@@ -100,7 +102,7 @@ The easiest way to use AutoForge is the web UI, a local app with drag-and-drop i
100
102
 
101
103
  To find a filament you own without measuring it yourself, click **Catalog** in the filament library. It searches every filament on [filamentcolors.xyz](https://filamentcolors.xyz) that has a measured TD (search by brand, color name, type or hex code; filter by type, brand or color family; or pick a color to see the closest matches first), and **Add** puts it straight into your library.
102
104
 
103
- The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data, or personal information is sent. To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
105
+ The web UI sends anonymous usage telemetry to the project via [PostHog](https://posthog.com/) by default, to notify me of problems and any bugs. This includes crash reports (unhandled errors from both the browser frontend and the backend server, with the error type, message, and stack trace) so bugs can get fixed faster. No image data, filament data or other personal information is sent, except that error messages and stack traces can contain file paths (the backend replaces your home folder in them with `~`, so your user name isn't sent from there; the browser's own stack traces only name the app's script files). To disable it, pass `--no-telemetry` (e.g. `./run_webui.sh --no-telemetry` / `run_webui.bat --no-telemetry`), or set `AUTOFORGE_WEBUI_TELEMETRY_ENABLED=false` permanently in your environment.
104
106
 
105
107
  4. **Update to the latest release** whenever you want, from the project folder:
106
108
  - Linux/macOS: `./update.sh`
@@ -193,7 +195,7 @@ This will generate separate STL files for each color, allowing you to print face
193
195
  - `--processing_reduction_factor` Reduction factor for the processing size compared to the output size (default: 2 - half resolution).
194
196
  - `--nozzle_diameter` Diameter of the printer nozzle in millimeters (default: 0.4).
195
197
  **Note:** Details smaller than half this value will be ignored.
196
- - `--early_stopping` Number of steps without improvement before stopping (default: 10000).
198
+ - `--early_stopping` Number of steps without improvement before stopping (default: 3000).
197
199
  - `--priority_mask` *(Optional)* Path to a greyscale image the size of the input that marks the parts that matter most: white areas are matched more closely, black areas still count, just less.
198
200
  - `--priority_mask_strength` How many times more a white pixel of `--priority_mask` counts than a black one (default: 10; must be at least 1). Raise it if the marked areas still come out off, lower it for a gentler nudge.
199
201
 
@@ -334,10 +336,6 @@ docker run --rm -v "$PWD:/work" -w /work autoforge-webui:cpu \
334
336
  ```
335
337
  The container runs as root, so on Linux the output files belong to root; `sudo chown -R "$USER" output` makes them yours again.
336
338
 
337
- ## You can now run Autoforge for free in your browser thanks to [Huggingface space support](https://huggingface.co/spaces/hvoss-techfak/Autoforge).
338
- This includes the option to run it locally if you have a powerful pc and don't want to limit yourself to the Huggingface computing limits. \
339
- For this simply go to the [Huggingface](https://huggingface.co/spaces/hvoss-techfak/Autoforge) space and pull the docker container for this project (upper right corner -> three dots -> "run locally")
340
-
341
339
  ## Development
342
340
 
343
341
  To have a "nightly" version of the repository or have live updating changes during development please do the following:
@@ -9,8 +9,10 @@ src/AutoForge.egg-info/top_level.txt
9
9
  src/autoforge/__init__.py
10
10
  src/autoforge/__main__.py
11
11
  src/autoforge/auto_forge.py
12
+ src/autoforge/default_materials.csv
12
13
  src/autoforge/priority_mask_editor.py
13
14
  src/autoforge/Helper/AmpUtils.py
15
+ src/autoforge/Helper/BorderMesh.py
14
16
  src/autoforge/Helper/CAdamW.py
15
17
  src/autoforge/Helper/ConstraintHelper.py
16
18
  src/autoforge/Helper/DeterministicOps.py
@@ -18,6 +20,7 @@ src/autoforge/Helper/DeviceUtils.py
18
20
  src/autoforge/Helper/FilamentHelper.py
19
21
  src/autoforge/Helper/FusedComposite.py
20
22
  src/autoforge/Helper/HeightAssign.py
23
+ src/autoforge/Helper/HeightGuidance.py
21
24
  src/autoforge/Helper/HeightfieldMesh.py
22
25
  src/autoforge/Helper/ImageHelper.py
23
26
  src/autoforge/Helper/OptimizerHelper.py
@@ -49,6 +52,7 @@ src/autoforge/webui/models.py
49
52
  src/autoforge/webui/server.py
50
53
  src/autoforge/webui/api/__init__.py
51
54
  src/autoforge/webui/api/filaments.py
55
+ src/autoforge/webui/api/guidance.py
52
56
  src/autoforge/webui/api/images.py
53
57
  src/autoforge/webui/api/init.py
54
58
  src/autoforge/webui/api/optimization.py
@@ -60,12 +64,19 @@ src/autoforge/webui/api/settings.py
60
64
  src/autoforge/webui/api/sliders.py
61
65
  src/autoforge/webui/api/state.py
62
66
  src/autoforge/webui/api/system.py
67
+ src/autoforge/webui/api/workers.py
63
68
  src/autoforge/webui/api/ws.py
64
69
  src/autoforge/webui/helpers/__init__.py
70
+ src/autoforge/webui/helpers/auto_prune.py
71
+ src/autoforge/webui/helpers/border.py
65
72
  src/autoforge/webui/helpers/colored_mesh.py
73
+ src/autoforge/webui/helpers/edited_export.py
66
74
  src/autoforge/webui/helpers/gpu_memory.py
75
+ src/autoforge/webui/helpers/guidance_views.py
67
76
  src/autoforge/webui/helpers/mesh_persist.py
68
77
  src/autoforge/webui/helpers/pipeline_runner.py
78
+ src/autoforge/webui/helpers/project_heightmap.py
79
+ src/autoforge/webui/helpers/result_store.py
69
80
  src/autoforge/webui/helpers/slider_render.py
70
81
  src/autoforge/webui/helpers/sliders.py
71
82
  src/autoforge/webui/helpers/telemetry.py
@@ -77,8 +88,11 @@ src/autoforge/webui/services/optimization_service.py
77
88
  src/autoforge/webui/services/project_service.py
78
89
  tests/test_amp_utils.py
79
90
  tests/test_auto_forge_cli.py
91
+ tests/test_border_mesh.py
80
92
  tests/test_bug_regressions.py
81
93
  tests/test_bugfixes_2026_09_26.py
94
+ tests/test_bugreport_2026_10_01.py
95
+ tests/test_bugreport_2026_10_03.py
82
96
  tests/test_cadamw.py
83
97
  tests/test_christofides_heightmap.py
84
98
  tests/test_composite_image.py
@@ -95,6 +109,7 @@ tests/test_flatforge.py
95
109
  tests/test_graph_cache_eviction.py
96
110
  tests/test_graph_capture_threads.py
97
111
  tests/test_gumbel_nan.py
112
+ tests/test_height_guidance.py
98
113
  tests/test_image_helper.py
99
114
  tests/test_loss_functions.py
100
115
  tests/test_optimizer_module.py
@@ -108,4 +123,5 @@ tests/test_prune_repeatability.py
108
123
  tests/test_pruning_helper.py
109
124
  tests/test_remove_height_spikes.py
110
125
  tests/test_webui_backend.py
111
- tests/test_webui_regressions.py
126
+ tests/test_webui_regressions.py
127
+ tests/test_worktree_bugs_2026_10_01.py
@@ -21,6 +21,7 @@ aiofiles>=24.1.0
21
21
  websockets>=15.0
22
22
  pydantic-settings>=2.0.0
23
23
  posthog>=3.7.0
24
+ manifold3d>=3.2
24
25
 
25
26
  [test]
26
27
  pytest>=7.4
@@ -30,9 +30,14 @@ def _probe_backward(device: torch.device, dtype: torch.dtype) -> bool:
30
30
  here.
31
31
  """
32
32
  try:
33
- x = torch.randn(8, 8, device=device, dtype=torch.float32, requires_grad=False)
34
- w = torch.randn(8, 8, device=device, dtype=torch.float32, requires_grad=True)
35
- target = torch.randn(8, 8, device=device, dtype=torch.float32)
33
+ # Fixed inputs, not torch.randn: the probe runs once per process, and
34
+ # drawing from the device's generator there shifted the random
35
+ # stream of only the first run - the same seed gave a different
36
+ # result in the first webui job than in every later one.
37
+ base = torch.linspace(-1.0, 1.0, 64, device=device, dtype=torch.float32).view(8, 8)
38
+ x = base.clone()
39
+ w = base.t().contiguous().requires_grad_(True)
40
+ target = base.flip(0)
36
41
  with torch.autocast(device_type=device.type, dtype=dtype):
37
42
  y = x @ w
38
43
  loss = torch.nn.functional.mse_loss(y, target)