From 5003affb17505525336e6c30ba9c690b810c252b Mon Sep 17 00:00:00 2001 From: Star dust <93254841+jingyuanlm@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:57:28 +0800 Subject: [PATCH] fix: fix mcts (#1270) * init mcts class * full ver of MCTS * auto-lint * make MCTS feedback in exp-gen() * refactor: move reset logic from Trace to ExpGen and update usage accordingly * fix: reinitialize trace on consecutive errors in DataScienceRDLoop * feat: add reset method to BaseScheduler and call in MCTSScheduler reset * style: reorder imports for consistency and PEP8 compliance * lint * fix observe_feedback * fix bug * remove uncommited_rec_status * more simple * refactor: move commit observation logic to process_uncommitted_nodes method * docs: add TODO comment about rule-based virtual root node expansion * add score reward * fix bug * fix small bug * lint * change reward * small small change * autolint --------- Co-authored-by: xuangu-fang Co-authored-by: Young --- .../proposal/exp_gen/trace_scheduler.py | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/rdagent/scenarios/data_science/proposal/exp_gen/trace_scheduler.py b/rdagent/scenarios/data_science/proposal/exp_gen/trace_scheduler.py index 6ced826e..f079c2f6 100644 --- a/rdagent/scenarios/data_science/proposal/exp_gen/trace_scheduler.py +++ b/rdagent/scenarios/data_science/proposal/exp_gen/trace_scheduler.py @@ -393,7 +393,7 @@ class MCTSScheduler(ProbabilisticScheduler): return (best_leaf,) - def observe_feedback(self, trace: DSTrace, new_idx: int, reward: float | None = None) -> None: + def observe_feedback(self, trace: DSTrace, new_idx: int) -> None: """ Update statistics after an experiment is committed to the trace. @@ -402,21 +402,16 @@ class MCTSScheduler(ProbabilisticScheduler): new_idx: Index of the newly appended experiment in trace.hist. reward: Optional explicit reward. If None, derive from feedback.decision (1.0/0.0). """ - if reward is None: - if 0 <= new_idx < len(trace.hist): - re, fb = trace.hist[new_idx] - if DS_RD_SETTING.enable_score_reward: - bigger_is_better = get_metric_direction(trace.scen.competition) - if getattr(fb, "decision", False): - reward = math.tanh(re.result.loc["ensemble"].iloc[0].round(3)) * (1 if bigger_is_better else -1) - else: - reward = -1 if bigger_is_better else 1 - else: - reward = 1.0 if getattr(fb, "decision", False) else 0.0 - else: - # Out-of-range safety - reward = 0.0 + re, fb = trace.hist[new_idx] + if DS_RD_SETTING.enable_score_reward: + bigger_is_better = get_metric_direction(trace.scen.competition) + if getattr(fb, "decision", False): + reward = math.tanh(re.result.loc["ensemble"].iloc[0].round(3)) * (1 if bigger_is_better else -1) + else: + reward = -1 if bigger_is_better else 1 + else: + reward = 1.0 if getattr(fb, "decision", False) else 0.0 id_list = trace.get_parents(new_idx) for id in id_list: self.node_value_sum[id] = self.node_value_sum.get(id, 0.0) + float(reward)