harshraj22's picture
download
raw
8.78 kB
"""
Data models for the CropRL Environment.
"""
from typing import Any, Dict, List, Optional, Tuple
from pydantic import BaseModel, Field
from openenv.core.env_server.types import Action, Observation, State
from .enums import ForumMsgType, HypePhase, LedgerEventType
class CroprlAction(Action):
"""
Agent selects a discrete action each step.
"""
action_id: int = Field(
ge=0,
le=14,
description="Discrete action index (0-14)",
json_schema_extra={
"enum": [
["0 - Wait / No-Op", 0],
["1 - Plant Crop 1 (Corn / Heavy Feeder)", 1],
["2 - Plant Crop 2 (Wheat / Medium Feeder)", 2],
["3 - Plant Crop 3 (Chickpea / Legume)", 3],
["4 - Irrigate", 4],
["5 - Fertilize", 5],
["6 - Harvest & Store", 6],
["7 - Harvest & Sell", 7],
["8 - Sell Inventory", 8],
["9 - Take Loan", 9],
["10 - Repay Loan", 10],
["11 - Post Forum Message", 11],
["12 - Plant Matcha (Hype Crop)", 12],
["13 - Plant Quinoa (Hype Crop)", 13],
["14 - Plant Turmeric (Hype Crop)", 14],
]
}
)
class CroprlObservation(Observation):
"""
Full farm dashboard the agent sees each step.
"""
# ── Time & Weather ──────────────────────────────────────────
current_month: int = Field(description="Calendar month 1-12")
current_step: int = Field(description="Step index 0..max_steps-1")
expected_rainfall: float = Field(description="Forecasted rainfall for this month, 0.0 to 1.0")
# ── Biological & Soil ───────────────────────────────────────
active_crop_type: int = Field(description="0=Fallow, 1=Corn, 2=Wheat, 3=Chickpea, 4=Matcha, 5=Quinoa, 6=Turmeric")
crop_age_months: int = Field(description="Months since planting")
expected_yield_potential: float = Field(description="Estimated yield if harvested now, normalized 0.0-1.0")
soil_nitrogen: float = Field(description="Soil nitrogen level 0.0-1.0")
current_water_level: float = Field(description="Current water level in the field 0.0-1.0")
# ── Financial ───────────────────────────────────────────────
cash_balance: float = Field(description="Current cash on hand")
current_debt: float = Field(description="Outstanding loan debt")
current_interest_rate: float = Field(description="Current annual interest rate")
current_land_price: float = Field(description="Current land value = base_land_price × soil_nitrogen")
market_price_crop_1: float = Field(description="Spot price for Corn")
market_price_crop_2: float = Field(description="Spot price for Wheat")
market_price_crop_3: float = Field(description="Spot price for Chickpea")
market_price_crop_4: float = Field(description="Spot price for Matcha (Hype Crop)")
market_price_crop_5: float = Field(description="Spot price for Quinoa (Hype Crop)")
market_price_crop_6: float = Field(description="Spot price for Turmeric (Hype Crop)")
# ── Costs ───────────────────────────────────────────────────
cost_seed_1: float = Field(description="Cost to plant Corn")
cost_seed_2: float = Field(description="Cost to plant Wheat")
cost_seed_3: float = Field(description="Cost to plant Chickpea")
cost_seed_4: float = Field(description="Cost to plant Matcha (Hype)")
cost_seed_5: float = Field(description="Cost to plant Quinoa (Hype)")
cost_seed_6: float = Field(description="Cost to plant Turmeric (Hype)")
cost_irrigate: float = Field(description="Cost to irrigate")
cost_fertilize: float = Field(description="Cost to fertilize")
# ── Inventory ───────────────────────────────────────────────
stored_crop_type: int = Field(description="Type of crop in storage (0=empty)")
stored_amount: float = Field(description="Tons of crop in storage")
stored_age_months: int = Field(description="Months since stored crop was harvested")
# ── Info ────────────────────────────────────────────────────
message: str = Field(default="", description="Human-readable feedback about what happened this step")
text_summary: str = Field(default="", description="Full text observation")
class CroprlState(State):
"""
Internal environment state (superset of observation).
"""
# ── Internal Bookkeeping ────────────────────────────────────
irrigated_this_month: bool = False
fertilized_this_month: bool = False
previous_cash: float = 0.0
has_active_loan: bool = False
loan_interest_rate: float = 0.0 # locked rate at loan origination
current_month_count: int = 0 # total months elapsed
current_year: int = 1 # for inflation tracking
task_id: str = "default"
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Multi-Agent Models
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class LedgerEvent(BaseModel):
"""A single action event visible on the public ledger."""
agent_id: int
month: int
slot: int # which slot within the month this happened
event_type: LedgerEventType
payload: Dict[str, Any] = Field(default_factory=dict)
class ForumMessage(BaseModel):
"""A public message posted by an agent to the shared forum."""
agent_id: int
month: int
slot: int
text: str
msg_type: ForumMsgType = ForumMsgType.INTENT
class HypeCropStatus(BaseModel):
"""Current hype-cycle state for a single hype crop."""
crop_type: int # CropType integer ID (4, 5, or 6)
crop_name: str
hype_level: float # 0.0 – 1.0
phase: HypePhase
months_in_phase: int
class MultiAgentObservation(CroprlObservation):
"""
Extended observation wrapping CroprlObservation with multi-agent context.
"""
# ── Identity & Turn Info ────────────────────────────────────
agent_id: int
month_slot: int # current slot (0..K-1)
slots_remaining: int
forum_posts_remaining: int
# ── Shared World State ──────────────────────────────────────
other_agents_crops: Dict[int, int] = Field(default_factory=dict) # agent_id → CropType (0=unknown)
ledger_this_month: List[LedgerEvent] = Field(default_factory=list)
forum_this_month: List[ForumMessage] = Field(default_factory=list)
last_month_realised_prices: Tuple[float, ...] = Field(default_factory=tuple)
# ── Hype Crop Statuses ──────────────────────────────────────
hype_crop_statuses: List[HypeCropStatus] = Field(default_factory=list)
class MultiAgentAction(CroprlAction):
"""
Extended action for multi-agent mode.
Adds agent identity and optional forum message payload.
"""
agent_id: int = 0
forum_message: Optional[str] = None # only used when action_id == 11
class MultiAgentResult(BaseModel):
"""Final scoring result for a completed multi-agent episode."""
agent_scores: Dict[int, float] # 0.01 – 0.99 per agent
aggregate_score: float
winner_agent_id: Optional[int] # None in cooperative mode
gini_coefficient: float # 0=equal, 1=monopoly
total_village_nw: float # sum of all final net worths
class MultiAgentState(State):
"""Internal state for the multi-agent environment."""
num_agents: int = 0
current_month: int = 1
month_count: int = 0
episode_id: str = ""
task_id: str = "default"

Xet Storage Details

Size:
8.78 kB
·
Xet hash:
9b254e15f1107b209604de9cea6c1a23cefcfc6454c50f6a3cbf5bf040fb3a84

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.