Yalpha/AGRITECH-META
0
1"""2MEDIUM TASK: 3-step soil + yield balance.3Score in [0.0, 1.0]. Deterministic. No randomness.4"""5import sys, os6sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))7from env import AgriEnv8from models import Action9 10 11def run_medium_task(actions, scenario="default"):12 if len(actions) != 3:13 raise ValueError("Medium task requires exactly 3 actions.")14 env = AgriEnv(scenario=scenario)15 obs0 = env.reset()16 17 soil_trace = [obs0.soil_quality]18 yield_accum = 0.019 penalties = []20 21 for action in actions:22 obs, reward, done, info = env.step(action)23 soil_trace.append(info["soil_health"])24 yield_accum += info["yield_score"]25 penalties.append(sum(info["penalties"].values()))26 if done:27 break28 29 return _score_medium(soil_trace, yield_accum, penalties)30 31 32def _score_medium(soil_trace, yield_accum, penalties):33 steps = len(soil_trace) - 134 if steps == 0:35 return 0.036 trend = sum(37 1.0 if soil_trace[i] >= soil_trace[i-1]38 else 0.5 if soil_trace[i] >= soil_trace[i-1] - 0.0439 else 0.040 for i in range(1, len(soil_trace))41 ) / steps42 avg_yield = min(1.0, yield_accum / steps)43 avg_penalty = sum(penalties) / len(penalties) if penalties else 0.044 score = 0.40 * trend + 0.45 * avg_yield - 0.15 * avg_penalty45 return round(max(0.0, min(1.0, score)), 4)46 47 48def grade_medium():49 """Self-contained grader — callable with no args by the OpenEnv validator."""50 actions = [51 Action(crop="wheat", fertilizer=0.3, irrigation=0.5),52 Action(crop="rice", fertilizer=0.4, irrigation=0.6),53 Action(crop="wheat", fertilizer=0.2, irrigation=0.4),54 ]55 return run_medium_task(actions, scenario="default")56 57 58if __name__ == "__main__":59 actions = [60 Action(crop="wheat", fertilizer=0.3, irrigation=0.5),61 Action(crop="rice", fertilizer=0.4, irrigation=0.6),62 Action(crop="wheat", fertilizer=0.2, irrigation=0.4),63 ]64 print(f"Medium score: {run_medium_task(actions)}")65 