Bryceeee's picture
Upload 34 files
6a11527 verified
raw
history blame
5.38 kB
"""
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)