Yalpha/AGRITECH-META
0
1"""2HARD TASK: 5-step full episode with delayed effects, stochastic weather3(seeded), resource constraints. Score in [0.0, 1.0]. Deterministic.4"""5import sys, os6sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))7from env import AgriEnv8from models import Action9 10EPISODE_LENGTH = 511 12 13def run_hard_task(actions, scenario="default"):14 if len(actions) != EPISODE_LENGTH:15 raise ValueError(f"Hard task requires exactly {EPISODE_LENGTH} actions.")16 env = AgriEnv(scenario=scenario, seed=42)17 obs0 = env.reset()18 19 nitrogen_trace = [obs0.nitrogen]20 soil_trace = [obs0.soil_quality]21 reward_list = []22 budget_trace = [obs0.budget]23 all_penalties = []24 25 for action in actions:26 obs, reward, done, info = env.step(action)27 nitrogen_trace.append(obs.nitrogen)28 soil_trace.append(info["soil_health"])29 reward_list.append(reward)30 budget_trace.append(info["budget_remaining"])31 all_penalties.append(sum(info["penalties"].values()))32 if done:33 break34 35 return grade_hard(nitrogen_trace, soil_trace, reward_list, budget_trace, all_penalties)36 37 38def grade_hard(nitrogen_trace, soil_trace, rewards, budget_trace, penalties):39 if not rewards:40 return 0.041 steps = len(rewards)42 43 avg_reward = sum(rewards) / steps44 degraded = sum(1 for n in nitrogen_trace if n < 0.25) / (steps + 1)45 drop = max(0.0, soil_trace[0] - soil_trace[-1])46 sustainability = max(0.0, 1.0 - drop / max(soil_trace[0], 0.01)) if drop > 0 else 1.047 budget_health = min(1.0, max(0.0, budget_trace[-1] / 120.0))48 avg_penalty = sum(penalties) / len(penalties) if penalties else 0.049 mean_n = sum(nitrogen_trace) / len(nitrogen_trace)50 variance = sum((n - mean_n)**2 for n in nitrogen_trace) / len(nitrogen_trace)51 stability = max(0.0, 1.0 - variance * 8)52 53 score = (54 0.30 * avg_reward55 - 0.20 * degraded56 + 0.20 * sustainability57 + 0.15 * budget_health58 - 0.10 * avg_penalty59 + 0.05 * stability60 )61 return round(max(0.0, min(1.0, score)), 4)62 63 64if __name__ == "__main__":65 actions = [66 Action(crop="wheat", fertilizer=0.3, irrigation=0.5),67 Action(crop="rice", fertilizer=0.5, irrigation=0.6),68 Action(crop="wheat", fertilizer=0.2, irrigation=0.4),69 Action(crop="none", fertilizer=0.0, irrigation=0.2),70 Action(crop="wheat", fertilizer=0.3, irrigation=0.4),71 ]72 print(f"Hard score: {run_hard_task(actions)}")73 