Bryceeee's picture
Upload 34 files
6a11527 verified
"""
Scenario Data Models
"""
from dataclasses import dataclass, field
from typing import List, Optional, Dict
from datetime import datetime
@dataclass
class BoundaryCondition:
"""Boundary condition"""
condition: str # Condition description
impact: str # Impact description
details: Optional[str] = None # Additional details
@dataclass
class AppropriateResponse:
"""Appropriate response"""
response: str # Response action
rationale: str # Rationale
details: Optional[str] = None # Additional details
@dataclass
class ScenarioMetadata:
"""Scenario metadata"""
created_at: str
updated_at: str
views: int = 0
quality_score: float = 0.0
verified: bool = False
source_urls: List[str] = field(default_factory=list)
@dataclass
class ADASScenario:
"""Complete ADAS scenario data model"""
# Basic information
scenario_id: str
title: str
description: str
# Classification information
adas_feature: str # Related ADAS feature
scenario_type: str # "boundary_condition", "historical_incident", "hypothetical_edge_case"
source: List[str] # Data source
severity_level: str # "low", "medium", "high"
# Scenario content
boundary_conditions: List[BoundaryCondition]
appropriate_responses: List[AppropriateResponse]
educational_principles: List[str]
# Generalization information
manufacturer_specific: bool
generalization: str # Generalized universal principle
# Metadata (must come before fields with default values)
metadata: ScenarioMetadata
# Related information (fields with default values must come last)
related_features: List[str] = field(default_factory=list)
related_scenarios: List[str] = field(default_factory=list)
tags: List[str] = field(default_factory=list)
@classmethod
def from_dict(cls, data: dict) -> 'ADASScenario':
"""Create scenario object from dictionary"""
# Convert boundary conditions
boundary_conditions = [
BoundaryCondition(**bc) if isinstance(bc, dict) else bc
for bc in data.get("boundary_conditions", [])
]
# Convert appropriate responses
appropriate_responses = [
AppropriateResponse(**ar) if isinstance(ar, dict) else ar
for ar in data.get("appropriate_responses", [])
]
# Convert metadata
metadata = ScenarioMetadata(**data.get("metadata", {}))
return cls(
scenario_id=data["scenario_id"],
title=data["title"],
description=data["description"],
adas_feature=data["adas_feature"],
scenario_type=data["scenario_type"],
source=data.get("source", []),
severity_level=data.get("severity_level", "medium"),
boundary_conditions=boundary_conditions,
appropriate_responses=appropriate_responses,
educational_principles=data.get("educational_principles", []),
manufacturer_specific=data.get("manufacturer_specific", False),
generalization=data.get("generalization", ""),
metadata=metadata,
related_features=data.get("related_features", []),
related_scenarios=data.get("related_scenarios", []),
tags=data.get("tags", [])
)
def to_dict(self) -> dict:
"""Convert to dictionary"""
return {
"scenario_id": self.scenario_id,
"title": self.title,
"description": self.description,
"adas_feature": self.adas_feature,
"scenario_type": self.scenario_type,
"source": self.source,
"severity_level": self.severity_level,
"boundary_conditions": [
{
"condition": bc.condition,
"impact": bc.impact,
"details": bc.details
}
for bc in self.boundary_conditions
],
"appropriate_responses": [
{
"response": ar.response,
"rationale": ar.rationale,
"details": ar.details
}
for ar in self.appropriate_responses
],
"educational_principles": self.educational_principles,
"manufacturer_specific": self.manufacturer_specific,
"generalization": self.generalization,
"related_features": self.related_features,
"related_scenarios": self.related_scenarios,
"tags": self.tags,
"metadata": {
"created_at": self.metadata.created_at,
"updated_at": self.metadata.updated_at,
"views": self.metadata.views,
"quality_score": self.metadata.quality_score,
"verified": self.metadata.verified,
"source_urls": self.metadata.source_urls
}
}
@dataclass
class RankedScenario:
"""Scenario with relevance score"""
scenario: ADASScenario
relevance_score: float
match_reasons: List[str] = field(default_factory=list)