from __future__ import annotations from abc import ABC, abstractmethod from typing import Dict, List from .models import DeliveryWindow, PendingOrder class Task(ABC): name: str num_platforms: int max_steps: int seed: int solar_zones: Dict[str, float] pending_orders: List[PendingOrder] delivery_windows: List[DeliveryWindow] description: str # Grading thresholds min_production_runs: int min_assemblies: int min_deliveries: int min_energy_final: float max_invalid_actions: int class EasyTask(Task): name = "easy" num_platforms = 2 max_steps = 60 seed = 101 description = "Basic production scheduling with 2 platforms and 4 delivery orders." solar_zones = {"zone_a": 0.8, "zone_b": 0.8} pending_orders = [ PendingOrder(order_id=1, product_type="alloy_panel", requires_assembly=False), PendingOrder(order_id=2, product_type="circuit_board", requires_assembly=False), PendingOrder(order_id=3, product_type="fuel_cell", requires_assembly=False), PendingOrder(order_id=4, product_type="alloy_panel", requires_assembly=False), ] delivery_windows = [ DeliveryWindow(order_id=1, product_type="alloy_panel", deadline=20, reward_value=8.0), DeliveryWindow(order_id=2, product_type="circuit_board", deadline=35, reward_value=8.0), DeliveryWindow(order_id=3, product_type="fuel_cell", deadline=50, reward_value=8.0), DeliveryWindow(order_id=4, product_type="alloy_panel", deadline=58, reward_value=8.0), ] min_production_runs = 3 min_assemblies = 0 min_deliveries = 2 min_energy_final = 40.0 max_invalid_actions = 3 class MediumTask(Task): name = "medium" num_platforms = 4 max_steps = 120 seed = 202 description = "Multi-stage assembly and delivery balancing with 4 platforms and 10 orders." solar_zones = { "zone_a": 0.8, "zone_b": 0.6, "zone_c": 0.5, "zone_d": 0.7, } pending_orders = [ PendingOrder(order_id=1, product_type="alloy_panel", requires_assembly=False), PendingOrder(order_id=2, product_type="circuit_board", requires_assembly=False), PendingOrder(order_id=3, product_type="solar_array", requires_assembly=True), PendingOrder(order_id=4, product_type="fuel_cell", requires_assembly=False), PendingOrder(order_id=5, product_type="thruster_module", requires_assembly=True), PendingOrder(order_id=6, product_type="alloy_panel", requires_assembly=False), PendingOrder(order_id=7, product_type="circuit_board", requires_assembly=False), PendingOrder(order_id=8, product_type="solar_array", requires_assembly=True), PendingOrder(order_id=9, product_type="fuel_cell", requires_assembly=False), PendingOrder(order_id=10, product_type="habitat_unit", requires_assembly=True), ] delivery_windows = [ DeliveryWindow(order_id=1, product_type="alloy_panel", deadline=25, reward_value=8.0), DeliveryWindow(order_id=2, product_type="circuit_board", deadline=40, reward_value=8.0), DeliveryWindow(order_id=3, product_type="solar_array", deadline=55, reward_value=10.0), DeliveryWindow(order_id=4, product_type="fuel_cell", deadline=60, reward_value=8.0), DeliveryWindow(order_id=5, product_type="thruster_module", deadline=75, reward_value=10.0), DeliveryWindow(order_id=6, product_type="alloy_panel", deadline=80, reward_value=8.0), DeliveryWindow(order_id=7, product_type="circuit_board", deadline=90, reward_value=8.0), DeliveryWindow(order_id=8, product_type="solar_array", deadline=100, reward_value=10.0), DeliveryWindow(order_id=9, product_type="fuel_cell", deadline=110, reward_value=8.0), DeliveryWindow(order_id=10, product_type="habitat_unit", deadline=118, reward_value=12.0), ] min_production_runs = 8 min_assemblies = 4 min_deliveries = 6 min_energy_final = 25.0 max_invalid_actions = 8 class HardTask(Task): name = "hard" num_platforms = 6 max_steps = 240 seed = 303 description = "Power pressure, multi-platform coordination, 20 orders, strict grading." solar_zones = { "zone_a": 0.9, "zone_b": 0.2, "zone_c": 0.6, "zone_d": 0.4, "zone_e": 0.7, "zone_f": 0.3, } pending_orders = [ PendingOrder(order_id=i, product_type=pt, requires_assembly=asm) for i, (pt, asm) in enumerate( [ ("alloy_panel", False), ("circuit_board", False), ("solar_array", True), ("fuel_cell", False), ("thruster_module", True), ("habitat_unit", True), ("alloy_panel", False), ("circuit_board", False), ("solar_array", True), ("fuel_cell", False), ("thruster_module", True), ("alloy_panel", False), ("circuit_board", False), ("habitat_unit", True), ("fuel_cell", False), ("solar_array", True), ("alloy_panel", False), ("thruster_module", True), ("circuit_board", False), ("habitat_unit", True), ], start=1, ) ] delivery_windows = [ DeliveryWindow(order_id=i, product_type=pt, deadline=dl, reward_value=rv) for i, pt, dl, rv in [ (1, "alloy_panel", 20, 8.0), (2, "circuit_board", 35, 8.0), (3, "solar_array", 50, 10.0), (4, "fuel_cell", 60, 8.0), (5, "thruster_module", 70, 10.0), (6, "habitat_unit", 85, 12.0), (7, "alloy_panel", 90, 8.0), (8, "circuit_board", 100, 8.0), (9, "solar_array", 110, 10.0), (10, "fuel_cell", 115, 8.0), (11, "thruster_module", 125, 10.0), (12, "alloy_panel", 135, 8.0), (13, "circuit_board", 145, 8.0), (14, "habitat_unit", 155, 12.0), (15, "fuel_cell", 160, 8.0), (16, "solar_array", 175, 10.0), (17, "alloy_panel", 185, 8.0), (18, "thruster_module", 200, 10.0), (19, "circuit_board", 215, 8.0), (20, "habitat_unit", 235, 12.0), ] ] min_production_runs = 16 min_assemblies = 10 min_deliveries = 14 min_energy_final = 15.0 max_invalid_actions = 12 TASK_REGISTRY: Dict[str, Task] = { "easy": EasyTask(), "medium": MediumTask(), "hard": HardTask(), }