Add Flask web UI, Docker Compose, core engine + tests
- physcom core: CLI, 5-pass pipeline, SQLite repo, 37 tests - physcom_web: Flask app with HTMX for entity/domain/pipeline/results CRUD - Docker Compose: web + cli services sharing a named volume for the DB - Clean up local settings to use wildcard permissions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
286
src/physcom/seed/transport_example.py
Normal file
286
src/physcom/seed/transport_example.py
Normal file
@@ -0,0 +1,286 @@
|
||||
"""Seed data for the transport example from the README."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from physcom.models.entity import Entity, Dependency
|
||||
from physcom.models.domain import Domain, MetricBound
|
||||
|
||||
|
||||
# ── Platforms ───────────────────────────────────────────────────
|
||||
|
||||
PLATFORMS: list[Entity] = [
|
||||
Entity(
|
||||
name="Car",
|
||||
dimension="platform",
|
||||
description="Four-wheeled enclosed road vehicle",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "3000", "kg", "range_max"),
|
||||
Dependency("physical", "mass_kg", "800", "kg", "range_min"),
|
||||
Dependency("force", "force_required_watts", "15000", "watts", "range_min"),
|
||||
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Airplane",
|
||||
dimension="platform",
|
||||
description="Fixed-wing aircraft for atmospheric flight",
|
||||
dependencies=[
|
||||
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "500", "kg", "range_min"),
|
||||
Dependency("force", "force_required_watts", "100000", "watts", "range_min"),
|
||||
Dependency("infrastructure", "runway", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "air", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Train",
|
||||
dimension="platform",
|
||||
description="Rail-guided vehicle",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "10000", "kg", "range_min"),
|
||||
Dependency("force", "force_required_watts", "500000", "watts", "range_min"),
|
||||
Dependency("infrastructure", "rail_network", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Bicycle",
|
||||
dimension="platform",
|
||||
description="Two-wheeled human-scale vehicle",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "30", "kg", "range_max"),
|
||||
Dependency("force", "force_required_watts", "75", "watts", "range_min"),
|
||||
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Walking",
|
||||
dimension="platform",
|
||||
description="Bipedal locomotion",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "150", "kg", "range_max"),
|
||||
Dependency("force", "force_required_watts", "75", "watts", "range_min"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Wheelchair",
|
||||
dimension="platform",
|
||||
description="Wheeled chair for seated mobility",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "200", "kg", "range_max"),
|
||||
Dependency("force", "force_required_watts", "50", "watts", "range_min"),
|
||||
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Scooter",
|
||||
dimension="platform",
|
||||
description="Small two-wheeled standing vehicle",
|
||||
dependencies=[
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("environment", "gravity", "true", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "50", "kg", "range_max"),
|
||||
Dependency("force", "force_required_watts", "200", "watts", "range_min"),
|
||||
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "ground", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Spaceship",
|
||||
dimension="platform",
|
||||
description="Vehicle designed for space travel",
|
||||
dependencies=[
|
||||
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "5000", "kg", "range_min"),
|
||||
Dependency("force", "force_required_watts", "1000000", "watts", "range_min"),
|
||||
Dependency("infrastructure", "launch_facility", "true", None, "requires"),
|
||||
Dependency("environment", "medium", "space", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Teleporter",
|
||||
dimension="platform",
|
||||
description="Hypothetical matter transmission device",
|
||||
dependencies=[
|
||||
Dependency("physical", "mass_kg", "0", "kg", "range_min"),
|
||||
Dependency("force", "force_required_watts", "1000000000", "watts", "range_min"),
|
||||
Dependency("infrastructure", "teleport_network", "true", None, "requires"),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
# ── Power Sources ───────────────────────────────────────────────
|
||||
|
||||
POWER_SOURCES: list[Entity] = [
|
||||
Entity(
|
||||
name="Internal Combustion Engine",
|
||||
dimension="power_source",
|
||||
description="Gas/petrol-powered engine",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "100000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "gas_station", None, "requires"),
|
||||
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "50", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "high_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Lithium Ion Battery",
|
||||
dimension="power_source",
|
||||
description="Rechargeable electric battery pack",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "50000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "charging_station", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "10", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "moderate_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Hydrogen Combustion Engine",
|
||||
dimension="power_source",
|
||||
description="Hydrogen fuel cell or combustion engine",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "80000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "hydrogen_station", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "30", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "high_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Human Pedalling",
|
||||
dimension="power_source",
|
||||
description="Human-powered via pedalling mechanism",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "75", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "0", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Modular Nuclear Reactor",
|
||||
dimension="power_source",
|
||||
description="Small modular nuclear fission reactor",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "50000000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "nuclear_fuel", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "2000", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "extreme_continuous", None, "provides"),
|
||||
Dependency("material", "radiation_shielding", "true", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Coal Steam Engine",
|
||||
dimension="power_source",
|
||||
description="Coal-fired boiler with steam locomotion",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "200000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "coal_supply", None, "requires"),
|
||||
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "500", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "high_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Solar Sail",
|
||||
dimension="power_source",
|
||||
description="Propulsion via radiation pressure from a star",
|
||||
dependencies=[
|
||||
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
||||
Dependency("environment", "star_proximity", "true", None, "requires"),
|
||||
Dependency("physical", "surface_area_m2", "100", "m^2", "range_min"),
|
||||
Dependency("force", "force_output_watts", "1", "watts", "provides"),
|
||||
Dependency("force", "thrust_profile", "continuous_low", None, "provides"),
|
||||
Dependency("environment", "medium", "space", None, "requires"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Cannonfire Recoil",
|
||||
dimension="power_source",
|
||||
description="Propulsion via sequential cannon blasts",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "500000", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "ammunition", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "100", "kg", "range_min"),
|
||||
Dependency("force", "thrust_profile", "high_burst", None, "provides"),
|
||||
],
|
||||
),
|
||||
Entity(
|
||||
name="Pushed by a Friend",
|
||||
dimension="power_source",
|
||||
description="External human pushing the vehicle",
|
||||
dependencies=[
|
||||
Dependency("force", "force_output_watts", "50", "watts", "provides"),
|
||||
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
||||
Dependency("physical", "mass_kg", "0", "kg", "range_min"),
|
||||
Dependency("environment", "ground_surface", "true", None, "requires"),
|
||||
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
# ── Domains ─────────────────────────────────────────────────────
|
||||
|
||||
URBAN_COMMUTING = Domain(
|
||||
name="urban_commuting",
|
||||
description="Daily travel within a city, 1-50km range",
|
||||
metric_bounds=[
|
||||
MetricBound("speed", weight=0.25, norm_min=5, norm_max=120),
|
||||
MetricBound("cost_efficiency", weight=0.25, norm_min=0.01, norm_max=2.0),
|
||||
MetricBound("safety", weight=0.25, norm_min=0.0, norm_max=1.0),
|
||||
MetricBound("availability", weight=0.15, norm_min=0.0, norm_max=1.0),
|
||||
MetricBound("range_fuel", weight=0.10, norm_min=5, norm_max=500),
|
||||
],
|
||||
)
|
||||
|
||||
INTERPLANETARY = Domain(
|
||||
name="interplanetary_travel",
|
||||
description="Travel between planets within a solar system",
|
||||
metric_bounds=[
|
||||
MetricBound("speed", weight=0.30, norm_min=1000, norm_max=300000),
|
||||
MetricBound("range_fuel", weight=0.30, norm_min=1e6, norm_max=1e10),
|
||||
MetricBound("safety", weight=0.20, norm_min=0.0, norm_max=1.0),
|
||||
MetricBound("cost_efficiency", weight=0.10, norm_min=1e3, norm_max=1e9),
|
||||
MetricBound("range_degradation", weight=0.10, norm_min=100, norm_max=36500),
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def load_transport_seed(repo) -> dict:
|
||||
"""Load all transport seed data into the repository. Returns counts."""
|
||||
from physcom.db.repository import Repository
|
||||
repo: Repository
|
||||
|
||||
counts = {"platforms": 0, "power_sources": 0, "domains": 0}
|
||||
|
||||
for entity in PLATFORMS:
|
||||
repo.add_entity(entity)
|
||||
counts["platforms"] += 1
|
||||
|
||||
for entity in POWER_SOURCES:
|
||||
repo.add_entity(entity)
|
||||
counts["power_sources"] += 1
|
||||
|
||||
repo.add_domain(URBAN_COMMUTING)
|
||||
repo.add_domain(INTERPLANETARY)
|
||||
counts["domains"] = 2
|
||||
|
||||
return counts
|
||||
Reference in New Issue
Block a user