Source code for vertiport_autonomy.evaluation.metrics

"""Performance metrics calculation utilities."""

from typing import Any, Dict, List

import numpy as np


[docs] def calculate_performance_metrics( episode_data: List[Dict[str, Any]], ) -> Dict[str, float]: """Calculate aggregated performance metrics from episode data. Args: episode_data: List of episode results containing metrics Returns: Dictionary of aggregated performance metrics """ if not episode_data: return {} # Extract metrics from episodes episode_lengths = [ep.get("episode_length", 0) for ep in episode_data] total_rewards = [ep.get("total_reward", 0.0) for ep in episode_data] collisions = [ep.get("collisions", 0) for ep in episode_data] missions_completed = [ep.get("missions_completed", 0) for ep in episode_data] # Calculate aggregated metrics metrics = { "mean_episode_length": float(np.mean(episode_lengths)), "std_episode_length": float(np.std(episode_lengths)), "mean_total_reward": float(np.mean(total_rewards)), "std_total_reward": float(np.std(total_rewards)), "total_collisions": int(np.sum(collisions)), "collision_rate": float(np.mean(collisions)), "total_missions_completed": int(np.sum(missions_completed)), "completion_rate": float(np.mean(missions_completed)), "success_rate": float( np.mean( [ 1.0 if ep.get("missions_completed", 0) > 0 else 0.0 for ep in episode_data ] ) ), } return metrics
[docs] def calculate_safety_metrics(episode_data: List[Dict[str, Any]]) -> Dict[str, float]: """Calculate safety-specific metrics. Args: episode_data: List of episode results containing safety metrics Returns: Dictionary of safety metrics """ if not episode_data: return {} unauthorized_landings = [ep.get("unauthorized_landings", 0) for ep in episode_data] loss_of_separation = [ep.get("loss_of_separation", 0) for ep in episode_data] safety_metrics = { "total_unauthorized_landings": int(np.sum(unauthorized_landings)), "unauthorized_landing_rate": float(np.mean(unauthorized_landings)), "total_loss_of_separation": int(np.sum(loss_of_separation)), "loss_of_separation_rate": float(np.mean(loss_of_separation)), } return safety_metrics
[docs] def calculate_efficiency_metrics( episode_data: List[Dict[str, Any]], ) -> Dict[str, float]: """Calculate efficiency-specific metrics. Args: episode_data: List of episode results containing efficiency metrics Returns: Dictionary of efficiency metrics """ if not episode_data: return {} time_in_system = [ep.get("mean_time_in_system", 0.0) for ep in episode_data] throughput = [ep.get("throughput", 0.0) for ep in episode_data] efficiency_metrics = { "mean_time_in_system": float(np.mean(time_in_system)), "std_time_in_system": float(np.std(time_in_system)), "mean_throughput": float(np.mean(throughput)), "std_throughput": float(np.std(throughput)), } return efficiency_metrics