processforge 0.2.12__tar.gz → 0.2.14__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 (69) hide show
  1. {processforge-0.2.12/src/processforge.egg-info → processforge-0.2.14}/PKG-INFO +1 -1
  2. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/closed-loop-chain.json +3 -1
  3. {processforge-0.2.12 → processforge-0.2.14}/pyproject.toml +1 -1
  4. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/schemas/flowsheet_schema.json +9 -1
  5. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/validate_flowsheet.py +30 -2
  6. {processforge-0.2.12 → processforge-0.2.14/src/processforge.egg-info}/PKG-INFO +1 -1
  7. {processforge-0.2.12 → processforge-0.2.14}/LICENSE +0 -0
  8. {processforge-0.2.12 → processforge-0.2.14}/MANIFEST.in +0 -0
  9. {processforge-0.2.12 → processforge-0.2.14}/README.md +0 -0
  10. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_dynamic_hybrid.json +0 -0
  11. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_dynamic_tank.json +0 -0
  12. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_flash.json +0 -0
  13. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/hydraulic_chain.json +0 -0
  14. {processforge-0.2.12 → processforge-0.2.14}/flowsheets/hydraulic-chain.json +0 -0
  15. {processforge-0.2.12 → processforge-0.2.14}/setup.cfg +0 -0
  16. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/__init__.py +0 -0
  17. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/_schema.py +0 -0
  18. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/__init__.py +0 -0
  19. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/__init__.py +0 -0
  20. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/base.py +0 -0
  21. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/casadi_backend.py +0 -0
  22. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/pyomo_backend.py +0 -0
  23. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/scipy_backend.py +0 -0
  24. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/flowsheet.py +0 -0
  25. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/jacobian.py +0 -0
  26. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/mixin.py +0 -0
  27. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/solver.py +0 -0
  28. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/stream_var.py +0 -0
  29. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/__init__.py +0 -0
  30. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/flash_eo.py +0 -0
  31. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/heater_eo.py +0 -0
  32. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/pipes_eo.py +0 -0
  33. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/pump_eo.py +0 -0
  34. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/strainer_eo.py +0 -0
  35. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/valve_eo.py +0 -0
  36. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/flowsheet.py +0 -0
  37. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/__init__.py +0 -0
  38. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/_fmi_vars.py +0 -0
  39. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/builder.py +0 -0
  40. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/slave_template.py +0 -0
  41. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/__init__.py +0 -0
  42. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/mo_writer.py +0 -0
  43. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/omc_runner.py +0 -0
  44. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/transpiler.py +0 -0
  45. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/unit_equations.py +0 -0
  46. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/provenance.py +0 -0
  47. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/result.py +0 -0
  48. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/schemas/__init__.py +0 -0
  49. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/simulate.py +0 -0
  50. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/solver.py +0 -0
  51. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/thermo.py +0 -0
  52. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/__init__.py +0 -0
  53. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/flash.py +0 -0
  54. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/heater.py +0 -0
  55. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/pipes.py +0 -0
  56. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/pump.py +0 -0
  57. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/solver.py +0 -0
  58. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/strainer.py +0 -0
  59. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/tank.py +0 -0
  60. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/valve.py +0 -0
  61. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/__init__.py +0 -0
  62. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/flowsheet_diagram.py +0 -0
  63. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/validation.py +0 -0
  64. {processforge-0.2.12 → processforge-0.2.14}/src/processforge/validate.py +0 -0
  65. {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/SOURCES.txt +0 -0
  66. {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/dependency_links.txt +0 -0
  67. {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/entry_points.txt +0 -0
  68. {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/requires.txt +0 -0
  69. {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: processforge
3
- Version: 0.2.12
3
+ Version: 0.2.14
4
4
  Summary: A Python-based process simulation framework for chemical engineering applications.
5
5
  Author-email: Process Forge Team <team@processforge.dev>
6
6
  License-Expression: BSD-3-Clause
@@ -40,6 +40,7 @@
40
40
  },
41
41
  "material_mixes": {
42
42
  "Benzene_Toluene_Mix": {
43
+ "friendly_material_mix_id": 1,
43
44
  "percent_type": "ao",
44
45
  "components": [
45
46
  {"name": "Benzene", "fraction": 0.5},
@@ -55,7 +56,8 @@
55
56
  "Benzene": 0.5,
56
57
  "Toluene": 0.5
57
58
  },
58
- "flowrate": 0.1
59
+ "flowrate": 0.1,
60
+ "material_mix": 1
59
61
  }
60
62
  },
61
63
  "units": {
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "processforge"
7
- version = "0.2.12"
7
+ version = "0.2.14"
8
8
  description = "A Python-based process simulation framework for chemical engineering applications."
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -86,8 +86,12 @@
86
86
  "patternProperties": {
87
87
  "^[a-zA-Z0-9_]+$": {
88
88
  "type": "object",
89
- "required": ["components"],
89
+ "required": ["friendly_material_mix_id", "components"],
90
90
  "properties": {
91
+ "friendly_material_mix_id": {
92
+ "type": "integer",
93
+ "description": "Unique numeric ID for this material mix"
94
+ },
91
95
  "percent_type": {
92
96
  "type": "string",
93
97
  "enum": ["ao", "wo", "vo"],
@@ -143,6 +147,10 @@
143
147
  },
144
148
  "z": {
145
149
  "type": "object"
150
+ },
151
+ "material_mix": {
152
+ "type": "integer",
153
+ "description": "friendly_material_mix_id of the material mix carried by this stream"
146
154
  }
147
155
  },
148
156
  "additionalProperties": true
@@ -192,7 +192,22 @@ def _check_material_semantics(config):
192
192
  f"❌ Duplicate friendly_material_id values found: {sorted(dupes)}"
193
193
  )
194
194
 
195
- # 3 & 4. Mix component name resolution and fraction sum
195
+ # 3. friendly_material_mix_id uniqueness
196
+ mix_ids = [
197
+ mix_def["friendly_material_mix_id"]
198
+ for mix_def in material_mixes.values()
199
+ ]
200
+ if len(mix_ids) != len(set(mix_ids)):
201
+ seen, dupes = set(), set()
202
+ for i in mix_ids:
203
+ if i in seen:
204
+ dupes.add(i)
205
+ seen.add(i)
206
+ raise ValueError(
207
+ f"❌ Duplicate friendly_material_mix_id values found: {sorted(dupes)}"
208
+ )
209
+
210
+ # 4 & 5. Mix component name resolution and fraction sum
196
211
  for mix_name, mix_def in material_mixes.items():
197
212
  fractions = []
198
213
  for component in mix_def.get("components", []):
@@ -222,7 +237,20 @@ def _check_material_semantics(config):
222
237
  f"❌ Stream '{stream_name}' z-key '{comp_name}' is not defined in materials."
223
238
  )
224
239
 
225
- # 6. Every unit must reference a valid friendly_material_id
240
+ # 6. Stream material_mix references must resolve to a valid friendly_material_mix_id
241
+ valid_mix_ids = {
242
+ mix_def["friendly_material_mix_id"]
243
+ for mix_def in material_mixes.values()
244
+ }
245
+ for stream_name, stream_def in config.get("streams", {}).items():
246
+ mix_ref = stream_def.get("material_mix")
247
+ if mix_ref is not None and mix_ref not in valid_mix_ids:
248
+ raise ValueError(
249
+ f"❌ Stream '{stream_name}' references material_mix id {mix_ref}, "
250
+ f"which does not match any friendly_material_mix_id in material_mixes."
251
+ )
252
+
253
+ # 7. Every unit must reference a valid friendly_material_id
226
254
  hint = " (no materials section defined)" if not materials else ""
227
255
  for unit_name, unit_def in config.get("units", {}).items():
228
256
  mat_id = unit_def.get("material")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: processforge
3
- Version: 0.2.12
3
+ Version: 0.2.14
4
4
  Summary: A Python-based process simulation framework for chemical engineering applications.
5
5
  Author-email: Process Forge Team <team@processforge.dev>
6
6
  License-Expression: BSD-3-Clause
File without changes
File without changes
File without changes
File without changes