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 <xuangufang@gmail.com>
Co-authored-by: Young <afe.young@gmail.com>
This commit is contained in:
Star dust
2025-10-17 16:57:28 +08:00
committed by GitHub
parent 4f493c8d63
commit 5003affb17
@@ -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)