pass 2's no-LLM fallback previously used broken/placeholder formulas: power_density passed an actuator's own intensive W/kg straight through without scaling by vehicle mass, range_fuel multiplied energy_density by a flat unitless constant, and cost_efficiency was a categorical guess. Replaces all three with formulas grounded in each entity's own declared attributes. Actuator and storage mass are sized to what's actually necessary -- enough power to sustain a platform's target_velocity against resistance (or real thrust/accel requirements where already declared, for aircraft/rocket combos), enough energy to reach the domain's own declared range ceiling -- solved as a closed-form 2x2 linear system rather than an invented mass-fraction table. Platform mass uses the geometric mean of its declared range instead of the bare floor, since a category as broad as Road Vehicle (50kg-36,000kg) is closer to log-uniformly distributed than uniformly distributed. cost_efficiency is now real operating cost (energy price x resistance) plus amortized upfront cost (materials cost by medium x lifetime distance), replacing the old flat per-energy-form guess. Also fixes two bugs found while validating the above against real-world reference values: entities whose power source isn't their own carried mass (Human Muscle, Solar Sail) degenerated to zero power; and combos blocked by a domain-specific constraint kept combinations.status stuck at "valid" forever, which silently miscounted them as passing in two repository queries (count_combinations_by_status, get_pipeline_summary) even though the per-domain result row was correctly marked blocked. Adds target_velocity to platforms that had no declared performance requirement at all, and raises OllamaLLMProvider's HTTP timeout (120s to 300s) to match observed real review-call latency. Validated against 4 real-world reference combos (commuter car, bicycle, delivery drone) and a full 2,970-combination domain run (0 pass-2 failures); all 100 existing tests still pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
852 lines
39 KiB
Python
852 lines
39 KiB
Python
"""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, DomainConstraint, MetricBound
|
|
|
|
|
|
# ── Platforms — Ground ──────────────────────────────────────────
|
|
|
|
GROUND_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Road Vehicle",
|
|
dimension="platform",
|
|
description="Generic wheeled road vehicle — from motorcycles to trucks",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "provides"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "50", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "0.5", "m²", "range_min"),
|
|
Dependency("physical", "mass", "36000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "50", "kg", "range_min"),
|
|
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
Dependency("physical", "target_velocity", "25", "m/s", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Light Personal Vehicle",
|
|
dimension="platform",
|
|
description="Small human-scale vehicle — bicycles, skateboards, wheelchairs",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "provides"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "3", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "0.3", "m²", "range_min"),
|
|
Dependency("physical", "mass", "60", "kg", "range_max"),
|
|
Dependency("physical", "mass", "5", "kg", "range_min"),
|
|
Dependency("infrastructure", "road_network", "true", None, "requires"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
Dependency("physical", "target_velocity", "6", "m/s", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Rail Vehicle",
|
|
dimension="platform",
|
|
description="Rail-guided vehicle — from trams to high-speed trains",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "provides"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "200", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "20", "m²", "range_min"),
|
|
Dependency("physical", "mass", "40000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "10000", "kg", "range_min"),
|
|
Dependency("infrastructure", "rail_network", "true", None, "requires"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
Dependency("physical", "target_velocity", "30", "m/s", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Platforms — Water ───────────────────────────────────────────
|
|
|
|
WATER_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Watercraft",
|
|
dimension="platform",
|
|
description="Surface vessel — from kayaks to container ships",
|
|
dependencies=[
|
|
Dependency("environment", "water_surface", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "2000", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "2", "m²", "range_min"),
|
|
Dependency("physical", "mass", "100000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "30", "kg", "range_min"),
|
|
Dependency("environment", "medium", "water", None, "requires"),
|
|
Dependency("physical", "target_velocity", "8", "m/s", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Submarine",
|
|
dimension="platform",
|
|
description="Submersible vessel for underwater travel",
|
|
dependencies=[
|
|
Dependency("environment", "water_surface", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "200", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "20", "m²", "range_min"),
|
|
Dependency("physical", "mass", "10000", "kg", "range_min"),
|
|
Dependency("environment", "medium", "water", None, "requires"),
|
|
Dependency("physical", "energy_density", "720000", "J/kg", "range_min"),
|
|
Dependency("physical", "target_velocity", "8", "m/s", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Platforms — Air ─────────────────────────────────────────────
|
|
|
|
AIR_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Fixed-Wing Aircraft",
|
|
dimension="platform",
|
|
description="Airplane — fixed-wing powered atmospheric flight",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "500", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "10", "m²", "range_min"),
|
|
Dependency("physical", "mass", "100000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "500", "kg", "range_min"),
|
|
Dependency("infrastructure", "runway", "true", None, "requires"),
|
|
Dependency("environment", "medium", "air", None, "requires"),
|
|
Dependency("physical", "energy_density", "1440000", "J/kg", "range_min"),
|
|
Dependency("physical", "min_effective_accel", "2.0", "m/s²", "range_min"),
|
|
Dependency("physical", "target_velocity", "60", "m/s", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Rotorcraft",
|
|
dimension="platform",
|
|
description="Vertical-takeoff aircraft — helicopters, drones",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "20", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "0.5", "m²", "range_min"),
|
|
Dependency("physical", "mass", "5000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "1", "kg", "range_min"),
|
|
Dependency("environment", "medium", "air", None, "requires"),
|
|
Dependency("physical", "energy_density", "720000", "J/kg", "range_min"),
|
|
Dependency("physical", "min_effective_accel", "10", "m/s²", "range_min"),
|
|
Dependency("physical", "target_velocity", "30", "m/s", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Lighter-than-Air Craft",
|
|
dimension="platform",
|
|
description="Buoyancy-based aircraft — balloons, airships",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "1000", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "50", "m²", "range_min"),
|
|
Dependency("physical", "mass", "20000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "200", "kg", "range_min"),
|
|
Dependency("environment", "medium", "air", None, "requires"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Platforms — Space ───────────────────────────────────────────
|
|
|
|
SPACE_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Spaceship",
|
|
dimension="platform",
|
|
description="Vehicle designed for space travel",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
|
Dependency("physical", "footprint", "500", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "10", "m²", "range_min"),
|
|
Dependency("physical", "mass", "5000", "kg", "range_min"),
|
|
Dependency("infrastructure", "launch_facility", "true", None, "requires"),
|
|
Dependency("environment", "medium", "space", None, "requires"),
|
|
Dependency("physical", "energy_density", "7200000", "J/kg", "range_min"),
|
|
Dependency("physical", "min_effective_accel", "0", "m/s²", "range_min"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Platforms — Multi-medium ────────────────────────────────────
|
|
|
|
MULTI_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Amphibious Vehicle",
|
|
dimension="platform",
|
|
description="Vehicle capable of operation on land, water, or both",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "provides"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "100", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "5", "m²", "range_min"),
|
|
Dependency("physical", "mass", "10000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "1500", "kg", "range_min"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Platforms — Fictional / Speculative ─────────────────────────
|
|
|
|
FICTIONAL_PLATFORMS: list[Entity] = [
|
|
Entity(
|
|
name="Hyperloop",
|
|
dimension="platform",
|
|
description="Sealed low-pressure tube with passenger pods at near-sonic speed",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "provides"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "provides"),
|
|
Dependency("physical", "footprint", "50", "m²", "range_max"),
|
|
Dependency("physical", "footprint", "5", "m²", "range_min"),
|
|
Dependency("physical", "mass", "20000", "kg", "range_max"),
|
|
Dependency("physical", "mass", "5000", "kg", "range_min"),
|
|
Dependency("infrastructure", "hyperloop_tube", "true", None, "requires"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
Dependency("physical", "target_velocity", "270", "m/s", "provides"), # near-sonic, per its own description
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── All Platforms ───────────────────────────────────────────────
|
|
|
|
PLATFORMS: list[Entity] = (
|
|
GROUND_PLATFORMS
|
|
+ WATER_PLATFORMS
|
|
+ AIR_PLATFORMS
|
|
+ SPACE_PLATFORMS
|
|
+ MULTI_PLATFORMS
|
|
+ FICTIONAL_PLATFORMS
|
|
)
|
|
|
|
|
|
# ── Actuators — Combustion ──────────────────────────────────────
|
|
|
|
COMBUSTION_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Piston Engine",
|
|
dimension="actuator",
|
|
description="Reciprocating combustion engine — petrol or diesel",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "requires"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass", "45", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "high_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "1000", "W/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Gas Turbine",
|
|
dimension="actuator",
|
|
description="Turbine engine — jets, turboshafts, turboprops",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "requires"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass", "200", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "extreme_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "5000", "W/kg", "provides"),
|
|
Dependency("force", "specific_thrust", "50", "N/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Steam Engine",
|
|
dimension="actuator",
|
|
description="External combustion engine using steam for mechanical power",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "requires"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass", "300", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "high_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "30", "W/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Actuators — Electric ───────────────────────────────────────
|
|
|
|
ELECTRIC_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Electric Motor",
|
|
dimension="actuator",
|
|
description="Rotary motor converting electrical energy to mechanical motion",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "electrical", None, "requires"),
|
|
Dependency("physical", "mass", "5", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "moderate_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "2000", "W/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Actuators — Biological ─────────────────────────────────────
|
|
|
|
BIOLOGICAL_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Human Muscle",
|
|
dimension="actuator",
|
|
description="Human-powered via pedalling, pushing, or rowing",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "biological", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "5.5", "W/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Animal Traction",
|
|
dimension="actuator",
|
|
description="Animal muscle power (horse, ox, or dog team)",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "biological", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "2", "W/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Actuators — Renewable / Ambient ────────────────────────────
|
|
|
|
RENEWABLE_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Solar Sail",
|
|
dimension="actuator",
|
|
description="Reflective surface propelled by radiation pressure",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "radiation_pressure", None, "requires"),
|
|
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
|
Dependency("environment", "star_proximity", "true", None, "requires"),
|
|
Dependency("physical", "footprint", "100", "m²", "range_min"),
|
|
Dependency("force", "thrust_profile", "continuous_low", None, "provides"),
|
|
Dependency("force", "power_density", "0.01", "W/kg", "provides"),
|
|
Dependency("environment", "medium", "space", None, "requires"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Wind Sail",
|
|
dimension="actuator",
|
|
description="Fabric or rigid sail harnessing wind for propulsion",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "wind", None, "requires"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass", "15", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "10", "W/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Actuators — Rocket / Space ─────────────────────────────────
|
|
|
|
ROCKET_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Rocket Nozzle",
|
|
dimension="actuator",
|
|
description="Thrust from expanding combustion gases through a nozzle",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_propellant", None, "requires"),
|
|
Dependency("environment", "medium", "water", None, "excludes"),
|
|
Dependency("physical", "mass", "150", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "extreme_burst", None, "provides"),
|
|
Dependency("force", "power_density", "10000", "W/kg", "provides"),
|
|
Dependency("force", "specific_thrust", "1500", "N/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Ion Drive",
|
|
dimension="actuator",
|
|
description="Electric propulsion using ionized gas for deep-space travel",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "ion_propellant", None, "requires"),
|
|
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
|
Dependency("environment", "medium", "space", None, "requires"),
|
|
Dependency("physical", "mass", "8", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "continuous_low", None, "provides"),
|
|
Dependency("force", "power_density", "30", "W/kg", "provides"),
|
|
Dependency("force", "specific_thrust", "0.01", "N/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Nuclear Thermal Drive",
|
|
dimension="actuator",
|
|
description="Nuclear fission reactor heating propellant for thrust",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "nuclear_thermal", None, "requires"),
|
|
Dependency("physical", "mass", "1500", "kg", "range_min"),
|
|
Dependency("physical", "footprint", "20", "m²", "range_min"),
|
|
Dependency("force", "thrust_profile", "extreme_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "50", "W/kg", "provides"),
|
|
Dependency("force", "specific_thrust", "200", "N/kg", "provides"),
|
|
Dependency("material", "radiation_shielding", "true", None, "requires"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Actuators — Exotic ─────────────────────────────────────────
|
|
|
|
EXOTIC_ACTUATORS: list[Entity] = [
|
|
Entity(
|
|
name="Cannon Recoil Drive",
|
|
dimension="actuator",
|
|
description="Propulsion via sequential cannon blasts",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_explosive", None, "requires"),
|
|
Dependency("environment", "medium", "water", None, "excludes"),
|
|
Dependency("physical", "mass", "80", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "high_burst", None, "provides"),
|
|
Dependency("force", "power_density", "3000", "W/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Compressed Air Motor",
|
|
dimension="actuator",
|
|
description="Motor powered by expanding compressed air",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "pneumatic", None, "requires"),
|
|
Dependency("physical", "mass", "10", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "moderate_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "100", "W/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Flywheel Drive",
|
|
dimension="actuator",
|
|
description="Mechanical drive transferring kinetic energy from a spinning rotor",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "kinetic_stored", None, "requires"),
|
|
Dependency("physical", "mass", "20", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "high_burst", None, "provides"),
|
|
Dependency("force", "power_density", "2000", "W/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Gravity Coast",
|
|
dimension="actuator",
|
|
description="Free-rolling descent using gravitational potential energy",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "gravitational", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
Dependency("force", "thrust_profile", "low_continuous", None, "provides"),
|
|
Dependency("force", "power_density", "10", "W/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── All Actuators ──────────────────────────────────────────────
|
|
|
|
ACTUATORS: list[Entity] = (
|
|
COMBUSTION_ACTUATORS
|
|
+ ELECTRIC_ACTUATORS
|
|
+ BIOLOGICAL_ACTUATORS
|
|
+ RENEWABLE_ACTUATORS
|
|
+ ROCKET_ACTUATORS
|
|
+ EXOTIC_ACTUATORS
|
|
)
|
|
|
|
|
|
# ── Energy Storage — Combustible Fuels ─────────────────────────
|
|
|
|
COMBUSTIBLE_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Liquid Fuel",
|
|
dimension="energy_storage",
|
|
description="Liquid hydrocarbon fuel — gasoline, diesel, or biofuel",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "fuel_station", None, "requires"),
|
|
Dependency("physical", "mass", "10", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "4680000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Hydrogen",
|
|
dimension="energy_storage",
|
|
description="Compressed or liquefied hydrogen gas",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "hydrogen_station", None, "requires"),
|
|
Dependency("physical", "mass", "5", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "2160000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Compressed Natural Gas",
|
|
dimension="energy_storage",
|
|
description="Methane stored under high pressure in tanks",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "cng_station", None, "requires"),
|
|
Dependency("physical", "mass", "15", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "2880000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Coal",
|
|
dimension="energy_storage",
|
|
description="Solid fossil fuel for steam boilers",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "coal_supply", None, "requires"),
|
|
Dependency("physical", "mass", "100", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "1440000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Jet Fuel",
|
|
dimension="energy_storage",
|
|
description="Kerosene-based fuel for turbine engines",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_combustible", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "jet_fuel", None, "requires"),
|
|
Dependency("physical", "mass", "50", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "4320000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Energy Storage — Electrical ────────────────────────────────
|
|
|
|
ELECTRICAL_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Rechargeable Battery",
|
|
dimension="energy_storage",
|
|
description="Rechargeable battery pack — lithium-ion or solid-state",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "electrical", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "charging_station", None, "requires"),
|
|
Dependency("physical", "mass", "9", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "1080000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Supercapacitor",
|
|
dimension="energy_storage",
|
|
description="High-power energy storage for rapid charge/discharge",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "electrical", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "charging_station", None, "requires"),
|
|
Dependency("physical", "mass", "15", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "36000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Solar Photovoltaic Panel",
|
|
dimension="energy_storage",
|
|
description="Photovoltaic cells converting sunlight to electricity",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "electrical", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
|
Dependency("environment", "star_proximity", "true", None, "requires"),
|
|
Dependency("physical", "mass", "10", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "180000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Energy Storage — Biological ────────────────────────────────
|
|
|
|
BIOLOGICAL_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Biological Feed",
|
|
dimension="energy_storage",
|
|
description="Metabolic energy from food or animal fodder",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "biological", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "720000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Energy Storage — Ambient ───────────────────────────────────
|
|
|
|
AMBIENT_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Solar Radiation",
|
|
dimension="energy_storage",
|
|
description="Photon flux from a nearby star providing radiation pressure",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "radiation_pressure", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
|
Dependency("environment", "star_proximity", "true", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Wind",
|
|
dimension="energy_storage",
|
|
description="Atmospheric air currents providing kinetic energy",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "wind", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Energy Storage — Propellant ────────────────────────────────
|
|
|
|
PROPELLANT_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Solid Propellant",
|
|
dimension="energy_storage",
|
|
description="Solid rocket fuel providing chemical propulsion energy",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_propellant", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "solid_propellant", None, "requires"),
|
|
Dependency("physical", "mass", "50", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "1800000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Xenon Propellant",
|
|
dimension="energy_storage",
|
|
description="Ionizable xenon gas for electric propulsion",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "ion_propellant", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "xenon_propellant", None, "requires"),
|
|
Dependency("physical", "mass", "2", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "10800000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Nuclear Fuel",
|
|
dimension="energy_storage",
|
|
description="Enriched uranium or thorium fuel rods for fission reactors",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "nuclear_thermal", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "nuclear_fuel", None, "requires"),
|
|
Dependency("physical", "mass", "500", "kg", "range_min"),
|
|
Dependency("physical", "footprint", "5", "m²", "range_min"),
|
|
Dependency("physical", "energy_density", "1800000000", "J/kg", "provides"),
|
|
Dependency("material", "radiation_shielding", "true", None, "requires"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── Energy Storage — Exotic ────────────────────────────────────
|
|
|
|
EXOTIC_STORAGE: list[Entity] = [
|
|
Entity(
|
|
name="Gunpowder/Ammunition",
|
|
dimension="energy_storage",
|
|
description="Black powder or cartridge ammunition for explosive propulsion",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "chemical_explosive", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "ammunition", None, "requires"),
|
|
Dependency("physical", "mass", "20", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "720000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Compressed Air",
|
|
dimension="energy_storage",
|
|
description="Air stored in high-pressure tanks",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "pneumatic", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "compressed_air_station", None, "requires"),
|
|
Dependency("physical", "mass", "10", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "108000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Flywheel Store",
|
|
dimension="energy_storage",
|
|
description="Kinetic energy stored in a spinning rotor",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "kinetic_stored", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "charging_station", None, "requires"),
|
|
Dependency("physical", "mass", "30", "kg", "range_min"),
|
|
Dependency("physical", "energy_density", "180000", "J/kg", "provides"),
|
|
],
|
|
),
|
|
Entity(
|
|
name="Gravitational Potential",
|
|
dimension="energy_storage",
|
|
description="Stored energy from elevation difference (hills, slopes)",
|
|
dependencies=[
|
|
Dependency("energy", "energy_form", "gravitational", None, "provides"),
|
|
Dependency("infrastructure", "fuel_infrastructure", "none", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("physical", "mass", "0", "kg", "range_min"),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
# ── All Energy Storages ────────────────────────────────────────
|
|
|
|
ENERGY_STORAGES: list[Entity] = (
|
|
COMBUSTIBLE_STORAGE
|
|
+ ELECTRICAL_STORAGE
|
|
+ BIOLOGICAL_STORAGE
|
|
+ AMBIENT_STORAGE
|
|
+ PROPELLANT_STORAGE
|
|
+ EXOTIC_STORAGE
|
|
)
|
|
|
|
|
|
# ── Domains ─────────────────────────────────────────────────────
|
|
|
|
URBAN_COMMUTING = Domain(
|
|
name="urban_commuting",
|
|
description="Daily travel within a city, 1-50km range",
|
|
metric_bounds=[
|
|
MetricBound("power_density", weight=0.25, norm_min=1, norm_max=2000, unit="W/kg"),
|
|
MetricBound("cost_efficiency", weight=0.25, norm_min=1e-5, norm_max=2e-3, unit="$/m", lower_is_better=True),
|
|
MetricBound("safety", weight=0.25, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
MetricBound("availability", weight=0.15, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
MetricBound("range_fuel", weight=0.10, norm_min=5000, norm_max=500000, unit="m"),
|
|
],
|
|
constraints=[DomainConstraint("medium", ["ground", "air"])],
|
|
)
|
|
|
|
INTERPLANETARY = Domain(
|
|
name="interplanetary_travel",
|
|
description="Travel between planets within a solar system",
|
|
metric_bounds=[
|
|
MetricBound("power_density", weight=0.30, norm_min=10, norm_max=10000, unit="W/kg"),
|
|
MetricBound("range_fuel", weight=0.30, norm_min=1e9, norm_max=1e13, unit="m"),
|
|
MetricBound("safety", weight=0.20, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
MetricBound("cost_efficiency", weight=0.10, norm_min=1.0, norm_max=1e6, unit="$/m", lower_is_better=True),
|
|
MetricBound("range_degradation", weight=0.10, norm_min=8640000, norm_max=3.1536e9, unit="s"),
|
|
],
|
|
constraints=[DomainConstraint("medium", ["space"])],
|
|
)
|
|
|
|
MARITIME_SHIPPING = Domain(
|
|
name="maritime_shipping",
|
|
description="Ocean cargo transport between ports, 100-40000km range",
|
|
metric_bounds=[
|
|
MetricBound("power_density", weight=0.15, norm_min=1, norm_max=1000, unit="W/kg"),
|
|
MetricBound("cargo_capacity", weight=0.25, norm_min=1000, norm_max=2e8, unit="kg"),
|
|
MetricBound("cost_efficiency", weight=0.25, norm_min=1e-9, norm_max=1e-6, unit="$/(kg\u00b7m)", lower_is_better=True),
|
|
MetricBound("safety", weight=0.20, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
MetricBound("range_fuel", weight=0.15, norm_min=100000, norm_max=40000000, unit="m"),
|
|
],
|
|
constraints=[DomainConstraint("medium", ["water"])],
|
|
)
|
|
|
|
LAST_MILE_DELIVERY = Domain(
|
|
name="last_mile_delivery",
|
|
description="Short-range package delivery within neighborhoods, 0.5-15km",
|
|
metric_bounds=[
|
|
MetricBound("power_density", weight=0.25, norm_min=1, norm_max=500, unit="W/kg"),
|
|
MetricBound("cost_efficiency", weight=0.30, norm_min=1e-5, norm_max=5e-3, unit="$/m", lower_is_better=True),
|
|
MetricBound("cargo_capacity_kg", weight=0.20, norm_min=1, norm_max=500, unit="kg"),
|
|
MetricBound("safety", weight=0.15, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
MetricBound("environmental_impact", weight=0.10, norm_min=0, norm_max=5e-4, unit="kg/m", lower_is_better=True),
|
|
],
|
|
constraints=[DomainConstraint("medium", ["ground", "air"])],
|
|
)
|
|
|
|
CROSS_COUNTRY_FREIGHT = Domain(
|
|
name="cross_country_freight",
|
|
description="Long-distance overland cargo transport, 200-5000km",
|
|
metric_bounds=[
|
|
MetricBound("power_density", weight=0.20, norm_min=5, norm_max=5000, unit="W/kg"),
|
|
MetricBound("cargo_capacity", weight=0.25, norm_min=500, norm_max=100000, unit="kg"),
|
|
MetricBound("cost_efficiency", weight=0.25, norm_min=1e-8, norm_max=5e-6, unit="$/(kg\u00b7m)", lower_is_better=True),
|
|
MetricBound("range_fuel", weight=0.20, norm_min=100000, norm_max=5000000, unit="m"),
|
|
MetricBound("reliability", weight=0.10, norm_min=0.0, norm_max=1.0, unit="0-1"),
|
|
],
|
|
constraints=[DomainConstraint("medium", ["ground"])],
|
|
)
|
|
|
|
ALL_DOMAINS = [
|
|
URBAN_COMMUTING,
|
|
INTERPLANETARY,
|
|
MARITIME_SHIPPING,
|
|
LAST_MILE_DELIVERY,
|
|
CROSS_COUNTRY_FREIGHT,
|
|
]
|
|
|
|
|
|
def load_transport_seed(repo) -> dict:
|
|
"""Load all transport seed data into the repository. Idempotent — safe to re-run."""
|
|
import sqlite3
|
|
from physcom.db.repository import Repository
|
|
repo: Repository
|
|
|
|
counts = {"platforms": 0, "actuators": 0, "energy_storages": 0, "domains": 0}
|
|
|
|
for entity in PLATFORMS:
|
|
try:
|
|
repo.add_entity(entity)
|
|
counts["platforms"] += 1
|
|
except sqlite3.IntegrityError:
|
|
existing = repo.get_entity_by_name(entity.dimension, entity.name)
|
|
if existing:
|
|
repo.replace_entity_dependencies(existing.id, entity.dependencies)
|
|
|
|
for entity in ACTUATORS:
|
|
try:
|
|
repo.add_entity(entity)
|
|
counts["actuators"] += 1
|
|
except sqlite3.IntegrityError:
|
|
existing = repo.get_entity_by_name(entity.dimension, entity.name)
|
|
if existing:
|
|
repo.replace_entity_dependencies(existing.id, entity.dependencies)
|
|
|
|
for entity in ENERGY_STORAGES:
|
|
try:
|
|
repo.add_entity(entity)
|
|
counts["energy_storages"] += 1
|
|
except sqlite3.IntegrityError:
|
|
existing = repo.get_entity_by_name(entity.dimension, entity.name)
|
|
if existing:
|
|
repo.replace_entity_dependencies(existing.id, entity.dependencies)
|
|
|
|
for domain in ALL_DOMAINS:
|
|
try:
|
|
repo.add_domain(domain)
|
|
counts["domains"] += 1
|
|
except sqlite3.IntegrityError:
|
|
pass
|
|
# Backfill metric units and lower_is_better on existing DBs.
|
|
for mb in domain.metric_bounds:
|
|
repo.ensure_metric(mb.metric_name, unit=mb.unit)
|
|
repo.backfill_metric_unit(domain.name, mb.metric_name, mb.unit)
|
|
if mb.lower_is_better:
|
|
repo.backfill_lower_is_better(domain.name, mb.metric_name)
|
|
# Backfill domain constraints
|
|
repo.replace_domain_constraints(domain)
|
|
|
|
return counts
|