split actuators from energy storage

This commit is contained in:
2026-03-04 14:18:52 -06:00
parent e99a14d087
commit 216879bdd5
13 changed files with 601 additions and 681 deletions

View File

@@ -9,7 +9,7 @@ def test_pipeline_run_lifecycle(seeded_repo):
"""Pipeline run should transition: pending -> running -> completed."""
repo = seeded_repo
domain = repo.get_domain("urban_commuting")
config = {"passes": [1, 2, 3], "threshold": 0.1, "dimensions": ["platform", "power_source"]}
config = {"passes": [1, 2, 3], "threshold": 0.1, "dimensions": ["platform", "actuator", "energy_storage"]}
run_id = repo.create_pipeline_run(domain.id, config)
run = repo.get_pipeline_run(run_id)
@@ -19,10 +19,10 @@ def test_pipeline_run_lifecycle(seeded_repo):
scorer = Scorer(domain)
pipeline = Pipeline(repo, resolver, scorer)
pipeline.run(domain, ["platform", "power_source"], passes=[1, 2, 3], run_id=run_id)
pipeline.run(domain, ["platform", "actuator", "energy_storage"], passes=[1, 2, 3], run_id=run_id)
from physcom.seed.transport_example import PLATFORMS, POWER_SOURCES
expected = len(PLATFORMS) * len(POWER_SOURCES)
from physcom.seed.transport_example import PLATFORMS, ACTUATORS, ENERGY_STORAGES
expected = len(PLATFORMS) * len(ACTUATORS) * len(ENERGY_STORAGES)
run = repo.get_pipeline_run(run_id)
assert run["status"] == "completed"
@@ -35,7 +35,7 @@ def test_pipeline_run_failed(seeded_repo):
"""Pipeline run should be marked failed on error."""
repo = seeded_repo
domain = repo.get_domain("urban_commuting")
config = {"passes": [1], "threshold": 0.1, "dimensions": ["platform", "power_source"]}
config = {"passes": [1], "threshold": 0.1, "dimensions": ["platform", "actuator", "energy_storage"]}
run_id = repo.create_pipeline_run(domain.id, config)
# Manually mark as failed (simulating what the web route does on exception)
@@ -58,7 +58,7 @@ def test_resume_skips_completed_combos(seeded_repo):
# First run: passes 1-3
run_id_1 = repo.create_pipeline_run(domain.id, {"passes": [1, 2, 3]})
result1 = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3], run_id=run_id_1,
)
assert result1.pass2_estimated > 0
@@ -67,7 +67,7 @@ def test_resume_skips_completed_combos(seeded_repo):
# Second run: same passes — should skip all combos (already pass_reached >= 3)
run_id_2 = repo.create_pipeline_run(domain.id, {"passes": [1, 2, 3]})
result2 = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3], run_id=run_id_2,
)
# pass2_estimated still counted (reloaded from DB) but no new estimation work
@@ -93,7 +93,7 @@ def test_cancellation_stops_processing(seeded_repo):
repo.update_pipeline_run(run_id, status="cancelled")
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3], run_id=run_id,
)
@@ -115,7 +115,7 @@ def test_status_guard_no_downgrade_reviewed(seeded_repo):
# Run pipeline to get scored combos
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3],
)
@@ -148,7 +148,7 @@ def test_human_notes_preserved_on_rerun(seeded_repo):
# First run
pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3],
)
@@ -177,7 +177,7 @@ def test_human_notes_preserved_on_rerun(seeded_repo):
# Re-run pipeline
pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3],
)
@@ -212,7 +212,7 @@ def test_get_combo_pass_reached(seeded_repo):
pipeline = Pipeline(repo, resolver, scorer)
pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3],
)
@@ -238,7 +238,7 @@ def test_blocked_combos_have_results(seeded_repo):
pipeline = Pipeline(repo, resolver, scorer)
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3],
)
@@ -269,7 +269,7 @@ def test_all_passes_run_and_tracked(seeded_repo):
run_id = repo.create_pipeline_run(domain.id, {"passes": [1, 2, 3]})
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3], run_id=run_id,
)
@@ -289,7 +289,9 @@ def test_save_combination_loads_existing_status(seeded_repo):
repo = seeded_repo
from physcom.models.combination import Combination
entities = repo.list_entities(dimension="platform")[:1] + repo.list_entities(dimension="power_source")[:1]
entities = (repo.list_entities(dimension="platform")[:1]
+ repo.list_entities(dimension="actuator")[:1]
+ repo.list_entities(dimension="energy_storage")[:1])
combo = Combination(entities=entities)
saved = repo.save_combination(combo)
assert saved.status == "pending"
@@ -316,7 +318,7 @@ def test_p3_fail_below_threshold(seeded_repo):
# Use a very high threshold so most combos fail pass 3
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.99, passes=[1, 2, 3],
)
@@ -350,7 +352,7 @@ def test_p4_fail_implausible(seeded_repo):
pipeline = Pipeline(repo, resolver, scorer, llm=mock_llm)
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.0, passes=[1, 2, 3, 4],
)
@@ -381,7 +383,7 @@ def test_p4_pass_plausible(seeded_repo):
pipeline = Pipeline(repo, resolver, scorer, llm=mock_llm)
result = pipeline.run(
domain, ["platform", "power_source"],
domain, ["platform", "actuator", "energy_storage"],
score_threshold=0.01, passes=[1, 2, 3, 4],
)