v0.1.12 last gauge info

This commit is contained in:
wty-yy
2025-12-21 14:53:33 +08:00
parent 4546be76bf
commit 59522777c9
7 changed files with 44 additions and 26 deletions

View File

@@ -40,8 +40,7 @@ class BaseGauge:
self.goals: List[BaseGoal] = []
self.metrics: List[function] = []
self.info = {'goal': [], 'metric': []}
self.results = {
} # {'goal/sub_goal': {'metric': result}}
self.results = {} # {'goal/sub_goal': {'metric': result}}
log_str = "Initialized Gauge with Goals and Metrics:\n"
for name, kwargs in self.goals_cfg.items():
@@ -102,16 +101,8 @@ class BaseGauge:
# )
# )
goal_obj = self.goals[self.goal_idx]
if goal_obj.pre_get_goal(sim_data):
metrics = goal_obj.goal_mean_metrics
if hasattr(goal_obj, 'success'): # target position goal
metrics['success'] = {'mean': float(goal_obj.success)}
key = f"{goal_obj.name}"
self.results[key] = metrics
self.goal_idx += 1
self.create_new_goal_logger()
if goal_obj.pre_get_goal(sim_data): # goal finished
self.switch_to_next_goal()
return None
goal = goal_obj.get_goal(sim_data)
@@ -121,6 +112,19 @@ class BaseGauge:
logger.info(f"New Goal [{self.goal_idx+1}/{len(self.goals)}] [{goal_obj.count+1}/{goal_obj.total}]: {self.goal_str}")
return goal
def switch_to_next_goal(self):
""" Switch to the next goal and log the metrics of the current goal. """
goal_obj = self.goals[self.goal_idx]
metrics = goal_obj.goal_mean_metrics
if hasattr(goal_obj, 'success'): # target position goal
metrics['success'] = {'mean': float(goal_obj.success)}
key = f"{goal_obj.name}"
self.results[key] = metrics
self.goal_idx += 1
self.create_new_goal_logger()
def update_metrics(self, sim_data: SimData, goal_data: GoalData):
if sim_data.n_step % int(self.cfg.metrics.metric_dt / sim_data.sim_dt) != 0:
return

View File

@@ -54,6 +54,7 @@ class BaseGoal:
result[f'mean@{i}'] = 0
if len(metrics) == 0:
return result
metrics = [max(0.0, min(1.0, m)) for m in metrics]
metrics.sort()
result['mean'] = float(sum(metrics) / len(metrics))
for i in [25, 50]:

View File

@@ -105,14 +105,16 @@ class BasePipeline:
sim_data = self.reset_sim(sim_data)
except Exception as e:
logger.error(f"❌ Pipeline execution failed with error: {e}")
raise e
self.gauge.switch_to_next_goal() # save current goal metrics
self.gauge.save_results()
return logger.log_dir, e
finally:
self.sim.close_viewer()
self.sim.close_video_writer()
logger.info("✅ Pipeline execution finished.")
logger.info(f"📁 Logging saved at: {logger.log_dir}")
return logger.log_dir
return logger.log_dir, None
def reset_sim(self, sim_data: SimData):
self.sim.reset()

View File

@@ -36,19 +36,20 @@ def run_single_process(args, data):
console_output=False
)
pipeline = task_register.make_pipeline(args=local_args, create_logger=False)
try:
log_dir = pipeline.run()
log_dir, error = pipeline.run()
if error is None:
ret = {
'status': 'success',
'log_dir': log_dir,
'model_path': pipeline.robot_cfg.control.model_path,
}
except Exception as e:
logger.error(f"❌ Process with seed={seed}, base_mass={base_mass}, friction={friction} failed with error: {e}")
else:
logger.error(f"❌ Process with seed={seed}, base_mass={base_mass}, friction={friction} failed with error: {error}")
ret = {
'status': 'error',
'log_dir': log_dir,
'data': data,
'error_msg': str(e),
'error_msg': str(error),
'traceback': traceback.format_exc()
}
return ret
@@ -76,8 +77,9 @@ class MultiPipeline:
iterator = pool.imap_unordered(worker_func, workers_data)
for results in tqdm(iterator, total=len(workers_data), desc="Evaluation"):
success_flags.append(results['status'] == 'success')
result_log_dirs.append(results['log_dir'])
if results['status'] == 'success':
result_log_dirs.append(results['log_dir'])
if self.model_path is None:
self.model_path = results['model_path']
else:

View File

@@ -151,7 +151,7 @@ def plot_radar(data_list, labels, output_file=None):
# loc='upper left' 意思是图例的左上角对齐这个锚点
legend = plt.legend(
loc='upper left',
bbox_to_anchor=(1.1, 0.3), # 调整这里的 0.3 可以上下移动图例
bbox_to_anchor=(1.0, 0.1), # 调整这里的 0.3 可以上下移动图例
title="Models",
title_fontsize=16,
fontsize=12,