v0.1.18
This commit is contained in:
@@ -25,6 +25,7 @@ from robogauge.utils.logger import Logger
|
||||
from robogauge.utils.process_utils import NoDaemonPool
|
||||
from robogauge.utils.progress_monitor import report_progress, ProgressTypes, ProgressData
|
||||
from robogauge.utils.file_utils import compress_directory
|
||||
from robogauge.tasks.gauge.gauge_configs.terrain_levels_config import SEARCH_LEVELS_TERRAINS
|
||||
|
||||
multi_logger = Logger() # MultiPipeline logger
|
||||
|
||||
@@ -132,7 +133,7 @@ class MultiPipeline:
|
||||
""" Process results from all processes and aggregate them. """
|
||||
multi_logger.info("📊 Aggregating Results from all runs...")
|
||||
|
||||
summary = {'success': {}, **self.static_info, 'summary': {}}
|
||||
summary = {'success': {}, **self.static_info, 'summary': {}, 'quality_score': {}, 'terrain_quality_score': {}}
|
||||
finish_msg = (
|
||||
f"""\n{'='*20} Run Finish Summary {'='*20}\n"""
|
||||
f"""{'Seed':^10}{'Base Mass':^15}{'Friction':^15}{'Status':^10}\n"""
|
||||
@@ -151,6 +152,7 @@ class MultiPipeline:
|
||||
multi_logger.error("No results to aggregate.")
|
||||
return
|
||||
|
||||
quality_score, terrain_quality_score = summary['quality_score'], summary['terrain_quality_score']
|
||||
value_collections = defaultdict(lambda: defaultdict(list))
|
||||
for result in all_results:
|
||||
for goal, metrics in result['results'].items():
|
||||
@@ -159,11 +161,22 @@ class MultiPipeline:
|
||||
for metric, means in metrics.items():
|
||||
for mean_name, mean_value in means.items():
|
||||
value_collections[metric][mean_name].append(float(mean_value.split(' ')[0]))
|
||||
quality_score[mean_name] = 1
|
||||
|
||||
for metric, means in value_collections.items():
|
||||
summary['summary'][metric] = {}
|
||||
for mean_name, values in means.items():
|
||||
summary['summary'][metric][mean_name] = f"{float(np.mean(values)):.4f} ± {float(np.std(values)):.4f}"
|
||||
v = float(np.mean(values))
|
||||
summary['summary'][metric][mean_name] = f"{v:.4f} ± {float(np.std(values)):.4f}"
|
||||
weight = 1
|
||||
if metric in ['ang_vel_err', 'lin_vel_err']:
|
||||
weight = 2
|
||||
quality_score[mean_name] *= min(max(1e-9, v), 1.0) ** weight
|
||||
for mean_name in quality_score:
|
||||
quality_score[mean_name] = quality_score[mean_name] ** (1 / 8) # 2 + 2 + 1 * 4
|
||||
terrain_quality_score[mean_name] = quality_score[mean_name]
|
||||
if summary['terrain_name'] in SEARCH_LEVELS_TERRAINS:
|
||||
terrain_quality_score[mean_name] = 0.09 * (summary['terrain_level'] - 1) + 0.19 * quality_score[mean_name]
|
||||
|
||||
save_path = multi_logger.log_dir / "aggregated_results.yaml"
|
||||
with open(save_path, 'w') as file:
|
||||
|
||||
@@ -27,7 +27,7 @@ from robogauge.utils.logger import Logger
|
||||
from robogauge.utils.process_utils import NoDaemonPool
|
||||
from robogauge.utils.progress_monitor import report_progress, ProgressTypes, start_progress_monitor_thread, ProgressData
|
||||
from robogauge.tasks.pipeline import MultiPipeline, LevelPipeline
|
||||
from robogauge.tasks.gauge.gauge_configs.terrain_levels_config import TerrainSearchLevelsConfig
|
||||
from robogauge.tasks.gauge.gauge_configs.terrain_levels_config import SEARCH_LEVELS_TERRAINS
|
||||
from robogauge.utils.file_utils import compress_directory
|
||||
|
||||
stress_logger = Logger() # StressPipeline logger
|
||||
@@ -57,6 +57,7 @@ def run_pipeline(args, progress_queue, data):
|
||||
|
||||
if search is True:
|
||||
args.goals = GOALS['level_pipeline']
|
||||
args.spawn_type = "level_search"
|
||||
level, level_results = LevelPipeline(args, console_output=False, progress_data=progress_data).run()
|
||||
if level == 0: # no valid level found
|
||||
report_progress(progress_data, ProgressTypes.FINISH, desc=f"❌ Failed (Lv 0)")
|
||||
@@ -76,6 +77,7 @@ def run_pipeline(args, progress_queue, data):
|
||||
|
||||
args.level = level
|
||||
args.goals = GOALS['multi_pipeline']
|
||||
args.spawn_type = "level_eval"
|
||||
results = {
|
||||
'success': True,
|
||||
'results': MultiPipeline(args, console_output=False, progress_data=progress_data).run(),
|
||||
@@ -113,12 +115,9 @@ class StressPipeline:
|
||||
|
||||
### Build worker data ###
|
||||
workers_data = []
|
||||
terrain_search_levels_config = TerrainSearchLevelsConfig()
|
||||
for terrain_name in terrain_names:
|
||||
search_max_level = True
|
||||
terrain_level_cfg = getattr(terrain_search_levels_config, terrain_name, None)
|
||||
assert terrain_level_cfg is not None, f"Terrain '{terrain_name}' not found in TerrainSearchLevelsConfig."
|
||||
if len(terrain_level_cfg.levels) == 1: # Flattened terrain
|
||||
if terrain_name not in SEARCH_LEVELS_TERRAINS: # Flattened terrain
|
||||
search_max_level = False
|
||||
data = {
|
||||
'task_robot_model': self.task_robot_model,
|
||||
@@ -179,8 +178,9 @@ class StressPipeline:
|
||||
stress_logger.error("No results to aggregate.")
|
||||
return
|
||||
|
||||
summary = {**self.static_info, 'summary': {}, 'final_score': {}}
|
||||
value_collections = defaultdict(lambda: defaultdict(list))
|
||||
summary = {**self.static_info, 'summary': {}, 'robust_score': {}, 'benchmark_score': 0.0}
|
||||
metric_collections = defaultdict(lambda: defaultdict(list))
|
||||
terrain_collections = defaultdict(lambda: defaultdict(list))
|
||||
zero_terrain_count = 0
|
||||
for result in all_results:
|
||||
terrain_name = result['data']['terrain_name']
|
||||
@@ -194,21 +194,27 @@ class StressPipeline:
|
||||
summary[key] = result['results']
|
||||
|
||||
for metric, means in result['results']['summary'].items():
|
||||
for mean_name, mean_value in means.items():
|
||||
value = float(mean_value.split(' ')[0])
|
||||
if terrain_level is not None: # level terrain
|
||||
value = (terrain_level - 1) * 0.1 + value * 0.1
|
||||
value_collections[metric][mean_name].append(value)
|
||||
for mean_name, value_str in means.items():
|
||||
value = float(value_str.split(' ± ')[0])
|
||||
metric_collections[metric][mean_name].append(value)
|
||||
for mean_name, value in result['results']['terrain_quality_score'].items():
|
||||
terrain_collections[terrain_name][mean_name].append(value)
|
||||
|
||||
final_metrics = defaultdict(list)
|
||||
for metric, means in value_collections.items():
|
||||
for metric, means in metric_collections.items():
|
||||
summary['summary'][metric] = {}
|
||||
for mean_name, values in means.items():
|
||||
values.extend([0.0] * zero_terrain_count) # include zero terrains
|
||||
summary['summary'][metric][mean_name] = f"{float(np.mean(values)):.4f} ± {float(np.std(values)):.4f}"
|
||||
final_metrics[mean_name].append(np.mean(values))
|
||||
for mean_name, values in final_metrics.items():
|
||||
summary['final_score'][mean_name] = float(np.mean(values))
|
||||
|
||||
robust_score = defaultdict(dict)
|
||||
robust_scores = []
|
||||
for terrain_name, means in terrain_collections.items():
|
||||
for mean_name, values in means.items():
|
||||
values.extend([0.0] * zero_terrain_count) # include zero terrains
|
||||
robust_score[terrain_name][mean_name] = float(np.mean(values))
|
||||
robust_scores.append(robust_score[terrain_name][mean_name])
|
||||
summary['robust_score'] = dict(robust_score)
|
||||
summary['benchmark_score'] = float(np.mean(robust_scores))
|
||||
|
||||
save_path = stress_logger.log_dir / "stress_benchmark_results.yaml"
|
||||
with open(save_path, 'w') as file:
|
||||
|
||||
Reference in New Issue
Block a user