Cluster/tests/test_topology.py
2025-07-17 17:04:56 +08:00

306 lines
12 KiB
Python

#!/usr/bin/env python3
"""
🚀 智慧拓撲排序算法演示
這個演示展示了我們的進階pipeline拓撲分析和優化算法:
- 自動依賴關係分析
- 循環檢測和解決
- 並行執行優化
- 關鍵路徑分析
- 性能指標計算
適合進度報告展示!
"""
import json
from mflow_converter import MFlowConverter
def create_demo_pipeline() -> dict:
"""創建一個複雜的多階段pipeline用於演示"""
return {
"project_name": "Advanced Multi-Stage Fire Detection Pipeline",
"description": "Demonstrates intelligent topology sorting with parallel stages",
"nodes": [
# Input Node
{
"id": "input_001",
"name": "RGB Camera Input",
"type": "ExactInputNode",
"pos": [100, 200],
"properties": {
"source_type": "Camera",
"device_id": 0,
"resolution": "1920x1080",
"fps": 30
}
},
# Parallel Feature Extraction Stages
{
"id": "model_rgb_001",
"name": "RGB Feature Extractor",
"type": "ExactModelNode",
"pos": [300, 100],
"properties": {
"model_path": "rgb_features.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "520",
"port_id": "28,30"
}
},
{
"id": "model_edge_002",
"name": "Edge Feature Extractor",
"type": "ExactModelNode",
"pos": [300, 200],
"properties": {
"model_path": "edge_features.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "520",
"port_id": "32,34"
}
},
{
"id": "model_thermal_003",
"name": "Thermal Feature Extractor",
"type": "ExactModelNode",
"pos": [300, 300],
"properties": {
"model_path": "thermal_features.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "520",
"port_id": "36,38"
}
},
# Intermediate Processing Stages
{
"id": "model_fusion_004",
"name": "Feature Fusion",
"type": "ExactModelNode",
"pos": [500, 150],
"properties": {
"model_path": "feature_fusion.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "720",
"port_id": "40,42"
}
},
{
"id": "model_attention_005",
"name": "Attention Mechanism",
"type": "ExactModelNode",
"pos": [500, 250],
"properties": {
"model_path": "attention.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "720",
"port_id": "44,46"
}
},
# Final Classification Stage
{
"id": "model_classifier_006",
"name": "Fire Classifier",
"type": "ExactModelNode",
"pos": [700, 200],
"properties": {
"model_path": "fire_classifier.nef",
"scpu_fw_path": "fw_scpu.bin",
"ncpu_fw_path": "fw_ncpu.bin",
"dongle_series": "720",
"port_id": "48,50"
}
},
# Output Node
{
"id": "output_007",
"name": "Detection Output",
"type": "ExactOutputNode",
"pos": [900, 200],
"properties": {
"output_type": "Stream",
"format": "JSON",
"destination": "tcp://localhost:5555"
}
}
],
"connections": [
# Input to parallel feature extractors
{"output_node": "input_001", "output_port": "output", "input_node": "model_rgb_001", "input_port": "input"},
{"output_node": "input_001", "output_port": "output", "input_node": "model_edge_002", "input_port": "input"},
{"output_node": "input_001", "output_port": "output", "input_node": "model_thermal_003", "input_port": "input"},
# Feature extractors to fusion
{"output_node": "model_rgb_001", "output_port": "output", "input_node": "model_fusion_004", "input_port": "input"},
{"output_node": "model_edge_002", "output_port": "output", "input_node": "model_fusion_004", "input_port": "input"},
{"output_node": "model_thermal_003", "output_port": "output", "input_node": "model_attention_005", "input_port": "input"},
# Intermediate stages to classifier
{"output_node": "model_fusion_004", "output_port": "output", "input_node": "model_classifier_006", "input_port": "input"},
{"output_node": "model_attention_005", "output_port": "output", "input_node": "model_classifier_006", "input_port": "input"},
# Classifier to output
{"output_node": "model_classifier_006", "output_port": "output", "input_node": "output_007", "input_port": "input"}
],
"version": "1.0"
}
def demo_simple_pipeline():
"""演示簡單的線性pipeline"""
print("🎯 DEMO 1: Simple Linear Pipeline")
print("="*50)
simple_pipeline = {
"project_name": "Simple Linear Pipeline",
"nodes": [
{"id": "model_001", "name": "Detection", "type": "ExactModelNode", "properties": {"model_path": "detect.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "28"}},
{"id": "model_002", "name": "Classification", "type": "ExactModelNode", "properties": {"model_path": "classify.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "30"}},
{"id": "model_003", "name": "Verification", "type": "ExactModelNode", "properties": {"model_path": "verify.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "32"}}
],
"connections": [
{"output_node": "model_001", "input_node": "model_002"},
{"output_node": "model_002", "input_node": "model_003"}
]
}
converter = MFlowConverter()
config = converter._convert_mflow_to_config(simple_pipeline)
print("\n")
def demo_parallel_pipeline():
"""演示並行pipeline"""
print("🎯 DEMO 2: Parallel Processing Pipeline")
print("="*50)
parallel_pipeline = {
"project_name": "Parallel Processing Pipeline",
"nodes": [
{"id": "model_001", "name": "RGB Processor", "type": "ExactModelNode", "properties": {"model_path": "rgb.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "28"}},
{"id": "model_002", "name": "IR Processor", "type": "ExactModelNode", "properties": {"model_path": "ir.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "30"}},
{"id": "model_003", "name": "Depth Processor", "type": "ExactModelNode", "properties": {"model_path": "depth.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "32"}},
{"id": "model_004", "name": "Fusion Engine", "type": "ExactModelNode", "properties": {"model_path": "fusion.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "34"}}
],
"connections": [
{"output_node": "model_001", "input_node": "model_004"},
{"output_node": "model_002", "input_node": "model_004"},
{"output_node": "model_003", "input_node": "model_004"}
]
}
converter = MFlowConverter()
config = converter._convert_mflow_to_config(parallel_pipeline)
print("\n")
def demo_complex_pipeline():
"""演示複雜的多層級pipeline"""
print("🎯 DEMO 3: Complex Multi-Level Pipeline")
print("="*50)
complex_pipeline = create_demo_pipeline()
converter = MFlowConverter()
config = converter._convert_mflow_to_config(complex_pipeline)
# 顯示額外的配置信息
print("🔧 Generated Pipeline Configuration:")
print(f" • Stage Configs: {len(config.stage_configs)}")
print(f" • Input Config: {config.input_config.get('source_type', 'Unknown')}")
print(f" • Output Config: {config.output_config.get('format', 'Unknown')}")
print("\n")
def demo_cycle_detection():
"""演示循環檢測和解決"""
print("🎯 DEMO 4: Cycle Detection & Resolution")
print("="*50)
# 創建一個有循環的pipeline
cycle_pipeline = {
"project_name": "Pipeline with Cycles (Testing)",
"nodes": [
{"id": "model_A", "name": "Model A", "type": "ExactModelNode", "properties": {"model_path": "a.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "28"}},
{"id": "model_B", "name": "Model B", "type": "ExactModelNode", "properties": {"model_path": "b.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "30"}},
{"id": "model_C", "name": "Model C", "type": "ExactModelNode", "properties": {"model_path": "c.nef", "scpu_fw_path": "fw_scpu.bin", "ncpu_fw_path": "fw_ncpu.bin", "port_id": "32"}}
],
"connections": [
{"output_node": "model_A", "input_node": "model_B"},
{"output_node": "model_B", "input_node": "model_C"},
{"output_node": "model_C", "input_node": "model_A"} # Creates cycle!
]
}
converter = MFlowConverter()
config = converter._convert_mflow_to_config(cycle_pipeline)
print("\n")
def demo_performance_analysis():
"""演示性能分析功能"""
print("🎯 DEMO 5: Performance Analysis")
print("="*50)
# 使用之前創建的複雜pipeline
complex_pipeline = create_demo_pipeline()
converter = MFlowConverter()
config = converter._convert_mflow_to_config(complex_pipeline)
# 驗證配置
is_valid, errors = converter.validate_config(config)
print("🔍 Configuration Validation:")
if is_valid:
print(" ✅ All configurations are valid!")
else:
print(" ⚠️ Configuration issues found:")
for error in errors[:3]: # Show first 3 errors
print(f" - {error}")
print(f"\n📦 Ready for InferencePipeline Creation:")
print(f" • Total Stages: {len(config.stage_configs)}")
print(f" • Pipeline Name: {config.pipeline_name}")
print(f" • Preprocessing Configs: {len(config.preprocessing_configs)}")
print(f" • Postprocessing Configs: {len(config.postprocessing_configs)}")
print("\n")
def main():
"""主演示函數"""
print("🚀 INTELLIGENT PIPELINE TOPOLOGY SORTING DEMONSTRATION")
print("="*60)
print("This demo showcases our advanced pipeline analysis capabilities:")
print("• Automatic dependency resolution")
print("• Parallel execution optimization")
print("• Cycle detection and prevention")
print("• Critical path analysis")
print("• Performance metrics calculation")
print("="*60 + "\n")
try:
# 運行所有演示
demo_simple_pipeline()
demo_parallel_pipeline()
demo_complex_pipeline()
demo_cycle_detection()
demo_performance_analysis()
print("🎉 ALL DEMONSTRATIONS COMPLETED SUCCESSFULLY!")
print("Ready for production deployment and progress reporting! 🚀")
except Exception as e:
print(f"❌ Demo error: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()