@mytec: feat: Phase 3.0 Architecture Refactor

Major refactoring of RFCP backend:
- Modular propagation models (8 models)
- SharedMemoryManager for terrain data
- ProcessPoolExecutor parallel processing
- WebSocket progress streaming
- Building filtering pipeline (351k → 15k)
- 82 unit tests

Performance: Standard preset 38s → 5s (7.6x speedup)

Known issue: Detailed preset timeout (fix in 3.1.0)
This commit is contained in:
2026-02-01 23:12:26 +02:00
parent 1dde56705a
commit defa3ad440
71 changed files with 7134 additions and 256 deletions

View File

@@ -139,12 +139,33 @@ def find_dominant_paths_vectorized(
"""
global _vec_log_count
# Fast path: no buildings at all → direct LOS, skip all numpy work
has_spatial_data = spatial_idx is not None and spatial_idx._grid
if not buildings and not has_spatial_data:
return {
'has_los': True,
'path_type': 'direct',
'total_loss': 0.0,
'path_length': 0.0,
'reflection_point': None,
}
# Get nearby buildings via spatial index (same filtering as sync version)
if spatial_idx:
line_buildings = spatial_idx.query_line(tx_lat, tx_lon, rx_lat, rx_lon)
else:
line_buildings = buildings
# No nearby buildings along this line → direct LOS
if not line_buildings:
return {
'has_los': True,
'path_type': 'direct',
'total_loss': 0.0,
'path_length': 0.0,
'reflection_point': None,
}
line_buildings = _filter_buildings_by_distance(
line_buildings,
(tx_lat, tx_lon), (rx_lat, rx_lon),
@@ -654,6 +675,19 @@ class DominantPathService:
buildings: fallback list (only used if spatial_idx is None)
spatial_idx: grid-based spatial index for fast local queries
"""
# Fast path: no buildings at all → direct LOS only
has_spatial_data = spatial_idx is not None and spatial_idx._grid
if not buildings and not has_spatial_data:
distance = terrain_service.haversine_distance(tx_lat, tx_lon, rx_lat, rx_lon)
return [RayPath(
path_type="direct",
total_distance=distance,
path_loss=self._calculate_path_loss(distance, frequency_mhz, tx_height, rx_height),
reflection_points=[],
materials_crossed=[],
is_valid=True,
)]
paths = []
# Use spatial index to get only buildings along the TX→RX line