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.
- {processforge-0.2.12/src/processforge.egg-info → processforge-0.2.14}/PKG-INFO +1 -1
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/closed-loop-chain.json +3 -1
- {processforge-0.2.12 → processforge-0.2.14}/pyproject.toml +1 -1
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/schemas/flowsheet_schema.json +9 -1
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/validate_flowsheet.py +30 -2
- {processforge-0.2.12 → processforge-0.2.14/src/processforge.egg-info}/PKG-INFO +1 -1
- {processforge-0.2.12 → processforge-0.2.14}/LICENSE +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/MANIFEST.in +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/README.md +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_dynamic_hybrid.json +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_dynamic_tank.json +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/example_flash.json +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/archive/hydraulic_chain.json +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/flowsheets/hydraulic-chain.json +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/setup.cfg +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/_schema.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/base.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/casadi_backend.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/pyomo_backend.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/backends/scipy_backend.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/flowsheet.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/jacobian.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/mixin.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/solver.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/stream_var.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/flash_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/heater_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/pipes_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/pump_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/strainer_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/eo/units/valve_eo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/flowsheet.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/_fmi_vars.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/builder.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/fmu/slave_template.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/mo_writer.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/omc_runner.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/transpiler.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/modelica/unit_equations.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/provenance.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/result.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/schemas/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/simulate.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/solver.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/thermo.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/flash.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/heater.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/pipes.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/pump.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/solver.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/strainer.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/tank.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/units/valve.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/__init__.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/flowsheet_diagram.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/utils/validation.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge/validate.py +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/SOURCES.txt +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/dependency_links.txt +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/entry_points.txt +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/requires.txt +0 -0
- {processforge-0.2.12 → processforge-0.2.14}/src/processforge.egg-info/top_level.txt +0 -0
|
@@ -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.
|
|
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
|
|
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
|
-
|
|
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")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|