| """ |
| drone_env/models.py |
| # Typed Pydantic models for the Drone Delivery Env. |
| """ |
| from __future__ import annotations |
| from typing import Any, Dict, List, Optional, Tuple |
| from pydantic import BaseModel, Field |
|
|
|
|
| class DroneAction(BaseModel): |
| direction: str = Field( |
| default="WAIT", |
| description="Movement direction: UP | DOWN | LEFT | RIGHT | WAIT", |
| ) |
| task_name: Optional[str] = Field( |
| default=None, |
| description="Task to load on reset: graders:grade_easy | medium | hard", |
| ) |
|
|
|
|
| class DroneObservation(BaseModel): |
| grid: List[str] = Field(description="Emoji grid rows") |
| grid_width: int |
| grid_height: int |
| drone_x: int |
| drone_y: int |
| battery: float = Field(description="Battery level 0.0–1.0") |
| battery_steps_remaining: int |
| deliveries_total: int |
| deliveries_done: int |
| current_target: Optional[Tuple[int, int]] = None |
| distance_to_target: Optional[float] = None |
| step_count: int |
| max_steps: int |
| reward_last: float |
| reward_total: float |
| score: float = 0.0 |
| done: bool |
| message: str = "" |
| legend: Dict[str, str] = Field(default_factory=dict) |
| cell_types: List[List[str]] = Field(default_factory=list) |
|
|
|
|
| class DroneState(BaseModel): |
| episode_id: str = "" |
| task_name: str = "graders:grade_easy" |
| step_count: int = 0 |
| done: bool = False |
| reward_total: float = 0.0 |
| deliveries_done: int = 0 |
| deliveries_total: int = 0 |
| drone_x: int = 0 |
| drone_y: int = 0 |
| battery: float = 1.0 |
| path_history: List[Dict[str, Any]] = Field(default_factory=list) |
|
|