Action Statistics Analyzer
The ActionStatsAnalyzer provides comprehensive analysis of agent actions and their outcomes in the Farm simulation. It processes action data to generate detailed metrics about frequency, rewards, interaction patterns, and various behavioral statistics.
Overview
The analyzer examines:
- Action frequencies and distributions
- Reward statistics and patterns
- Interaction rates between agents
- Performance metrics for different action types
- Temporal and decision-making patterns
Key Features
1. Basic Action Metrics
- Action counts and frequencies
- Average rewards per action type
- Success rates and failure patterns
- Resource impact analysis
2. Detailed Reward Statistics
- Mean, median, and mode rewards
- Variance and standard deviation
- Quartile analysis
- Confidence intervals
- Min/max reward values
3. Interaction Analysis
- Interaction rates between agents
- Solo vs collaborative performance
- Target selection patterns
- Success rates for interactive actions
4. Performance Metrics
- Solo performance metrics
- Interaction performance metrics
- Resource efficiency
- Action effectiveness scores
Usage
from farm.database.analyzers.action_stats_analyzer import ActionStatsAnalyzer
from farm.database.repositories.action_repository import ActionRepository
# Initialize analyzer
repository = ActionRepository(session)
analyzer = ActionStatsAnalyzer(repository)
# Get comprehensive action statistics
action_metrics = analyzer.analyze(scope="SIMULATION")
# Example: Print average rewards for each action type
for metric in action_metrics:
print(f"Action: {metric.action_type}")
print(f" Average Reward: {metric.avg_reward:.2f}")
print(f" Frequency: {metric.frequency:.2%}")
print(f" Interaction Rate: {metric.interaction_rate:.2%}")
Return Data Structure
The analyzer returns a list of ActionMetrics objects containing:
ActionMetrics(
action_type="gather",
count=100, # Total occurrences
frequency=0.4, # 40% of all actions
avg_reward=2.5, # Average reward
min_reward=0.0, # Minimum reward
max_reward=5.0, # Maximum reward
variance_reward=0.2, # Reward variance
std_dev_reward=0.447, # Standard deviation
median_reward=2.5, # Median reward
quartiles_reward=[2.0, 3.0], # First and third quartiles
confidence_interval=0.087, # 95% confidence interval
interaction_rate=0.1, # 10% involved other agents
solo_performance=2.7, # Average solo reward
interaction_performance=1.2, # Average interactive reward
temporal_patterns=[...], # Time-based patterns
resource_impacts=[...], # Resource effects
decision_patterns=[...] # Decision-making patterns
)
Analysis Parameters
The analyze() method accepts several parameters for filtering and scoping the analysis:
def analyze(
self,
scope: Union[str, AnalysisScope] = AnalysisScope.SIMULATION,
agent_id: Optional[str] = None,
step: Optional[int] = None,
step_range: Optional[Tuple[int, int]] = None
) -> List[ActionMetrics]
scope: Analysis scope (SIMULATION, EPISODE, etc.)agent_id: Filter for specific agentstep: Analyze specific timestepstep_range: Analyze range of timesteps
Statistical Notes
- Frequency Calculation
- Frequencies are normalized between 0 and 1
- Represents proportion of total actions
- Reward Statistics
- Requires at least 2 data points
- Confidence intervals at 95% level
- Handles null rewards appropriately
- Interaction Metrics
- Based on presence of target_id
- Separate performance tracking for solo/interactive
- Performance Metrics
- Normalized for comparison
- Accounts for action frequency
- Considers resource efficiency
Integration Points
The analyzer integrates with several other analyzers for comprehensive analysis:
DecisionPatternAnalyzer: For decision-making patternsResourceImpactAnalyzer: For resource utilization effectsTemporalPatternAnalyzer: For timing and sequence patterns
Example Workflows
Basic Action Analysis
# Get basic action statistics
metrics = analyzer.analyze()
for m in metrics:
print(f"{m.action_type}: {m.count} occurrences, {m.avg_reward:.2f} avg reward")
Focused Agent Analysis
# Analyze specific agent's actions
agent_metrics = analyzer.analyze(agent_id="agent_1")
for m in agent_metrics:
print(f"Agent 1 {m.action_type}: {m.frequency:.2%} frequency")
Time Period Analysis
# Analyze specific time period
period_metrics = analyzer.analyze(step_range=(100, 200))
for m in period_metrics:
print(f"Steps 100-200 {m.action_type}: {m.interaction_rate:.2%} interaction rate")
Performance Considerations
- Processes all actions in specified scope
- Memory usage scales with action count
- Consider using step_range for large datasets
- Caches common calculations internally