v1.0.1
This commit is contained in:
@@ -133,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': {}, 'terrain_weighted_summary': {}, 'quality_score': {}, 'terrain_quality_score': {}}
|
||||
summary = {'success': {}, **self.static_info, 'summary': {}, 'terrain_weighted_summary': {}}
|
||||
finish_msg = (
|
||||
f"""\n{'='*20} Run Finish Summary {'='*20}\n"""
|
||||
f"""{'Seed':^10}{'Base Mass':^15}{'Friction':^15}{'Status':^10}\n"""
|
||||
@@ -152,7 +152,6 @@ 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():
|
||||
@@ -161,27 +160,20 @@ 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] = {}
|
||||
summary['terrain_weighted_summary'][metric] = {}
|
||||
for mean_name, values in means.items():
|
||||
v = float(np.mean(values))
|
||||
summary['summary'][metric][mean_name] = f"{v:.4f} ± {float(np.std(values)):.4f}"
|
||||
twv = v
|
||||
|
||||
if 'quality_score' in metric: continue
|
||||
summary['terrain_weighted_summary'][metric] = {}
|
||||
for mean_name, values in means.items():
|
||||
twv = float(np.mean(values))
|
||||
if summary['terrain_name'] in SEARCH_LEVELS_TERRAINS:
|
||||
twv = 0.09 * (summary['terrain_level'] - 1) + 0.19 * v
|
||||
summary['terrain_weighted_summary'][metric][mean_name] = f"{twv:.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:
|
||||
|
||||
@@ -182,10 +182,12 @@ class StressPipeline:
|
||||
metric_collections = defaultdict(lambda: defaultdict(list))
|
||||
terrain_collections = defaultdict(lambda: defaultdict(list))
|
||||
zero_terrain_count = defaultdict(lambda: 0)
|
||||
robust_score = summary['robust_score']
|
||||
for result in all_results:
|
||||
terrain_name = result['data']['terrain_name']
|
||||
terrain_level = result['level'] # None, 0, 1, ..., 10
|
||||
scores[terrain_name] = 0.0
|
||||
robust_score[terrain_name] = {}
|
||||
key = f'{terrain_name}_{terrain_level}'
|
||||
key += f'_baseMass{result["data"]["base_mass"]}_friction{result["data"]["friction"]}'
|
||||
if terrain_level == 0:
|
||||
@@ -198,7 +200,8 @@ class StressPipeline:
|
||||
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():
|
||||
for mean_name, value_str in result['results']['summary']['terrain_quality_score'].items():
|
||||
value = float(value_str.split(' ± ')[0])
|
||||
terrain_collections[terrain_name][mean_name].append(value)
|
||||
|
||||
for metric, means in metric_collections.items():
|
||||
@@ -207,15 +210,14 @@ class StressPipeline:
|
||||
values.extend([0.0] * sum(zero_terrain_count.values())) # include zero terrains
|
||||
summary['summary'][metric][mean_name] = f"{float(np.mean(values)):.4f} ± {float(np.std(values)):.4f}"
|
||||
|
||||
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[terrain_name]) # include zero terrains
|
||||
robust_score[terrain_name][mean_name] = float(np.mean(values))
|
||||
scores[terrain_name] = robust_score[terrain_name]['mean@50']
|
||||
robust_scores.append(robust_score[terrain_name]['mean@50'])
|
||||
summary['robust_score'] = dict(robust_score)
|
||||
for terrain_name in robust_score:
|
||||
if len(robust_score[terrain_name]) == 0:
|
||||
robust_score[terrain_name] = None
|
||||
summary['benchmark_score'] = float(np.mean(list(scores.values())))
|
||||
scores['benchmark'] = summary['benchmark_score']
|
||||
|
||||
|
||||
Reference in New Issue
Block a user