logging
This commit is contained in:
@ -543,8 +543,7 @@ class CleanTradingDashboard:
|
||||
success = True
|
||||
|
||||
if success:
|
||||
# Create callbacks for the new model
|
||||
self._create_model_toggle_callbacks(model_name)
|
||||
# Universal callback system handles new models automatically
|
||||
logger.info(f"✅ Successfully added model dynamically: {model_name}")
|
||||
return True
|
||||
else:
|
||||
@ -839,9 +838,9 @@ class CleanTradingDashboard:
|
||||
|
||||
logger.info(f"Setting up universal callbacks for {len(available_models)} models: {list(available_models.keys())}")
|
||||
|
||||
# Create callbacks for each model dynamically
|
||||
for model_name in available_models.keys():
|
||||
self._create_model_toggle_callbacks(model_name)
|
||||
# Universal callback system handles all models automatically
|
||||
# No need to create individual callbacks for each model
|
||||
logger.info(f"Universal callback system will handle {len(available_models)} models automatically")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error setting up universal model callbacks: {e}")
|
||||
@ -903,79 +902,7 @@ class CleanTradingDashboard:
|
||||
'transformer': {'name': 'transformer', 'type': 'fallback'}
|
||||
}
|
||||
|
||||
def _create_model_toggle_callbacks(self, model_name):
|
||||
"""Create inference and training toggle callbacks for a specific model"""
|
||||
try:
|
||||
# Create inference toggle callback
|
||||
@self.app.callback(
|
||||
Output(f'{model_name}-inference-toggle', 'value'),
|
||||
[Input(f'{model_name}-inference-toggle', 'value')],
|
||||
prevent_initial_call=True
|
||||
)
|
||||
def update_model_inference_toggle(value):
|
||||
return self._handle_model_toggle(model_name, 'inference', value)
|
||||
|
||||
# Create training toggle callback
|
||||
@self.app.callback(
|
||||
Output(f'{model_name}-training-toggle', 'value'),
|
||||
[Input(f'{model_name}-training-toggle', 'value')],
|
||||
prevent_initial_call=True
|
||||
)
|
||||
def update_model_training_toggle(value):
|
||||
return self._handle_model_toggle(model_name, 'training', value)
|
||||
|
||||
logger.debug(f"Created toggle callbacks for model: {model_name}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating callbacks for model {model_name}: {e}")
|
||||
|
||||
def _handle_model_toggle(self, model_name, toggle_type, value):
|
||||
"""Universal handler for model toggle changes"""
|
||||
try:
|
||||
enabled = bool(value and len(value) > 0) # Convert list to boolean
|
||||
|
||||
if self.orchestrator:
|
||||
# Map component model name back to orchestrator's expected model name
|
||||
reverse_mapping = {
|
||||
'dqn': 'dqn_agent',
|
||||
'cnn': 'enhanced_cnn',
|
||||
'decision_fusion': 'decision',
|
||||
'extrema_trainer': 'extrema_trainer',
|
||||
'cob_rl': 'cob_rl',
|
||||
'transformer': 'transformer'
|
||||
}
|
||||
|
||||
orchestrator_model_name = reverse_mapping.get(model_name, model_name)
|
||||
|
||||
# Update orchestrator toggle state
|
||||
if toggle_type == 'inference':
|
||||
self.orchestrator.set_model_toggle_state(orchestrator_model_name, inference_enabled=enabled)
|
||||
elif toggle_type == 'training':
|
||||
self.orchestrator.set_model_toggle_state(orchestrator_model_name, training_enabled=enabled)
|
||||
|
||||
logger.info(f"Model {model_name} ({orchestrator_model_name}) {toggle_type} toggle: {enabled}")
|
||||
|
||||
# Update dashboard state variables for backward compatibility
|
||||
self._update_dashboard_state_variable(model_name, toggle_type, enabled)
|
||||
|
||||
return value
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error handling toggle for {model_name} {toggle_type}: {e}")
|
||||
return value
|
||||
|
||||
def _update_dashboard_state_variable(self, model_name, toggle_type, enabled):
|
||||
"""Update dashboard state variables for dynamic model management"""
|
||||
try:
|
||||
# Store in dynamic model toggle states
|
||||
if model_name not in self.model_toggle_states:
|
||||
self.model_toggle_states[model_name] = {"inference_enabled": True, "training_enabled": True}
|
||||
|
||||
self.model_toggle_states[model_name][f"{toggle_type}_enabled"] = enabled
|
||||
logger.debug(f"Updated dynamic model state: {model_name}.{toggle_type}_enabled = {enabled}")
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(f"Error updating dynamic model state: {e}")
|
||||
# Dynamic callback functions removed - using universal callback system instead
|
||||
|
||||
def _setup_callbacks(self):
|
||||
"""Setup dashboard callbacks"""
|
||||
@ -1439,11 +1366,19 @@ class CleanTradingDashboard:
|
||||
}
|
||||
|
||||
orchestrator_name = model_mapping.get(model_name, model_name)
|
||||
self.orchestrator.set_model_toggle_state(
|
||||
orchestrator_name,
|
||||
toggle_type + '_enabled',
|
||||
is_enabled
|
||||
)
|
||||
|
||||
# Call set_model_toggle_state with correct parameters based on toggle type
|
||||
if toggle_type == 'inference':
|
||||
self.orchestrator.set_model_toggle_state(
|
||||
orchestrator_name,
|
||||
inference_enabled=is_enabled
|
||||
)
|
||||
elif toggle_type == 'training':
|
||||
self.orchestrator.set_model_toggle_state(
|
||||
orchestrator_name,
|
||||
training_enabled=is_enabled
|
||||
)
|
||||
|
||||
logger.info(f"Updated {orchestrator_name} {toggle_type}_enabled = {is_enabled}")
|
||||
|
||||
# Return all current values (no change needed)
|
||||
@ -10066,7 +10001,9 @@ def create_clean_dashboard(data_provider: Optional[DataProvider] = None, orchest
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
logger.info("Received shutdown signal")
|
||||
self.shutdown() # Assuming a shutdown method exists or add one
|
||||
# Graceful shutdown - just exit
|
||||
import sys
|
||||
sys.exit(0)
|
||||
sys.exit(0)
|
||||
|
||||
# Only set signal handlers if we're in the main thread
|
||||
|
@ -513,29 +513,47 @@ class ModelsTrainingPanel:
|
||||
)
|
||||
], style={"flex": "1"}),
|
||||
|
||||
# Toggle switches with pattern matching IDs
|
||||
# Interactive toggles for inference and training
|
||||
html.Div([
|
||||
# Inference toggle
|
||||
html.Div([
|
||||
html.Label("Inf", className="text-muted small me-1", style={"font-size": "10px"}),
|
||||
dcc.Checklist(
|
||||
html.Label("Inf", className="text-muted", style={
|
||||
"font-size": "9px",
|
||||
"margin-bottom": "0",
|
||||
"margin-right": "3px",
|
||||
"font-weight": "500"
|
||||
}),
|
||||
dbc.Switch(
|
||||
id={'type': 'model-toggle', 'model': model_name, 'toggle_type': 'inference'},
|
||||
options=[{"label": "", "value": True}],
|
||||
value=[True] if model_data.get('inference_enabled', True) else [],
|
||||
className="form-check-input me-2",
|
||||
style={"transform": "scale(0.7)"}
|
||||
value=['enabled'] if model_data.get('inference_enabled', True) else [],
|
||||
className="model-toggle-switch",
|
||||
style={
|
||||
"transform": "scale(0.6)",
|
||||
"margin": "0",
|
||||
"padding": "0"
|
||||
}
|
||||
)
|
||||
], className="d-flex align-items-center me-2"),
|
||||
], className="d-flex align-items-center me-2", style={"height": "18px"}),
|
||||
# Training toggle
|
||||
html.Div([
|
||||
html.Label("Trn", className="text-muted small me-1", style={"font-size": "10px"}),
|
||||
dcc.Checklist(
|
||||
html.Label("Trn", className="text-muted", style={
|
||||
"font-size": "9px",
|
||||
"margin-bottom": "0",
|
||||
"margin-right": "3px",
|
||||
"font-weight": "500"
|
||||
}),
|
||||
dbc.Switch(
|
||||
id={'type': 'model-toggle', 'model': model_name, 'toggle_type': 'training'},
|
||||
options=[{"label": "", "value": True}],
|
||||
value=[True] if model_data.get('training_enabled', True) else [],
|
||||
className="form-check-input",
|
||||
style={"transform": "scale(0.7)"}
|
||||
value=['enabled'] if model_data.get('training_enabled', True) else [],
|
||||
className="model-toggle-switch",
|
||||
style={
|
||||
"transform": "scale(0.6)",
|
||||
"margin": "0",
|
||||
"padding": "0"
|
||||
}
|
||||
)
|
||||
], className="d-flex align-items-center")
|
||||
], className="d-flex")
|
||||
], className="d-flex align-items-center", style={"height": "18px"})
|
||||
], className="d-flex align-items-center", style={"gap": "8px"})
|
||||
], className="d-flex align-items-center mb-2"),
|
||||
|
||||
# Model metrics
|
||||
|
Reference in New Issue
Block a user