CoolFace
Apppublic

Yalpha/AGRITECH-META

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
hard.py73 linesDownload Raw Back to root
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