CognitiveEDA / app.py
mgbam's picture
Update app.py
51dfd28 verified
raw
history blame
3.04 kB
# app.py
# -*- coding: utf-8 -*-
#
# PROJECT: CognitiveEDA v5.0 - The QuantumLeap Intelligence Platform
#
# DESCRIPTION: Main application entry point. This script now correctly
# orchestrates UI layout and callback registration within the
# same Gradio Blocks context.
#
# SETUP: $ pip install -r requirements.txt
#
# AUTHOR: An MCP & PhD Expert in Data & AI Solutions
# VERSION: 5.1 (Context-Aware Edition: Architectural Fix)
# LAST-UPDATE: 2023-10-30 (Corrected Gradio context handling)
import warnings
import logging
import gradio as gr
# Import the UI layout and the callback LOGIC functions
from ui.layout import create_main_layout
from ui import callbacks
from core.config import settings
# --- Configuration & Setup ---
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - [%(levelname)s] - (%(filename)s:%(lineno)d) - %(message)s'
)
warnings.filterwarnings('ignore', category=FutureWarning)
def main():
"""
Primary function to build, wire up, and launch the Gradio application.
"""
logging.info(f"Starting {settings.APP_TITLE}")
# Create the top-level Blocks context. All UI and events will be defined here.
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="indigo"), title=settings.APP_TITLE) as demo:
# 1. Build the UI from the layout module.
# This function now only creates the components and returns them.
components = create_main_layout()
# 2. Register all event handlers (callbacks) within the same context.
# This is the correct pattern. We attach listeners to the components
# that were just created.
# We chain the events for a better user experience.
# First click -> generates the analyzer.
# Then, the change in the analyzer state -> generates the visuals.
analysis_complete_event = components["analyze_button"].click(
fn=callbacks.run_full_analysis,
inputs=[components["upload_button"]],
outputs=[components["state_analyzer"]]
)
# The .then() event is triggered only after the .click() event successfully completes.
analysis_complete_event.then(
fn=callbacks.generate_reports_and_visuals,
inputs=[components["state_analyzer"]],
# The outputs dictionary keys must match the component dictionary keys
outputs=list(components.values())
)
# Register other interactive callbacks
components["num_clusters"].change(
fn=callbacks.update_clustering,
inputs=[components["state_analyzer"], components["num_clusters"]],
outputs=[components["plot_cluster"], components["plot_elbow"], components["md_cluster_summary"]]
)
# (Add other .change() or .click() listeners for scatter plots, histograms, etc. here)
# 3. Launch the application
demo.launch(debug=True, server_name="0.0.0.0")
if __name__ == "__main__":
main()