525GradioApp / analysis_runner.py
Ryan
update
e66f533
raw
history blame
8.05 kB
import logging
import traceback
import gradio as gr
from processors.bow_processor import process_bow_analysis
from processors.ngram_processor import process_ngram_analysis
from processors.topic_processor import process_topic_modeling
from processors.classifier_processor import process_classifier_analysis
from processors.bias_processor import process_bias_detection
# Set up logging
logger = logging.getLogger('gradio_app.analysis_runner')
# Try to use the improved version of process_analysis_request if available
try:
from improved_analysis_handler import process_analysis_request
logger.info("Using improved analysis handler")
except ImportError:
logger.info("Using original analysis handler")
from ui.analysis_screen import process_analysis_request
def run_analysis(dataset, selected_analysis, ngram_n, ngram_top, topic_count):
"""
Run the selected analysis on the provided dataset and return visualization components
Args:
dataset (dict): The dataset to analyze
selected_analysis (str): The type of analysis to run
ngram_n (int): N-gram size for N-gram analysis
ngram_top (int): Number of top N-grams to display
topic_count (int): Number of topics for topic modeling
Returns:
tuple: Updated visualization components
"""
try:
# Create parameter dictionary
parameters = {
"ngram_n": ngram_n,
"ngram_top": ngram_top,
"topic_count": topic_count
}
logger.info(f"Running analysis with selected type: {selected_analysis}")
logger.info(f"Parameters: {parameters}")
if not dataset or "entries" not in dataset or not dataset["entries"]:
return default_no_dataset()
# Process the analysis request - passing selected_analysis as a string
analysis_results, _ = process_analysis_request(dataset, selected_analysis, parameters)
# If there's an error or no results
if not analysis_results or "analyses" not in analysis_results or not analysis_results["analyses"]:
return default_no_results()
# Extract information to display in components
prompt = list(analysis_results["analyses"].keys())[0]
analyses = analysis_results["analyses"][prompt]
# Check for messages from placeholder analyses
if "message" in analyses:
return default_message_response(analyses["message"])
# Route to the appropriate processor based on analysis type
if selected_analysis == "Bag of Words" and "bag_of_words" in analyses:
return process_bow_analysis(analysis_results, prompt, analyses)
elif selected_analysis == "N-gram Analysis" and "ngram_analysis" in analyses:
return process_ngram_analysis(analysis_results, prompt, analyses)
elif selected_analysis == "Topic Modeling" and "topic_modeling" in analyses:
return process_topic_modeling(analysis_results, prompt, analyses)
elif selected_analysis == "Classifier" and "classifier" in analyses:
return process_classifier_analysis(analysis_results, prompt, analyses)
elif selected_analysis == "Bias Detection" and "bias_detection" in analyses:
return process_bias_detection(analysis_results, prompt, analyses)
# If we don't have visualization data from any analysis
return default_no_visualization(analysis_results)
except Exception as e:
error_msg = f"Error in analysis: {str(e)}\n{traceback.format_exc()}"
logger.error(error_msg)
return default_error_response(error_msg, str(e))
def default_no_dataset():
"""Return default component updates when no dataset is loaded"""
return (
{}, # analysis_results_state
False, # analysis_output visibility
False, # visualization_area_visible
gr.update(visible=False), # analysis_title
gr.update(visible=False), # prompt_title
gr.update(visible=False), # models_compared
gr.update(visible=False), # model1_title
gr.update(visible=False), # model1_words
gr.update(visible=False), # model2_title
gr.update(visible=False), # model2_words
gr.update(visible=False), # similarity_metrics_title
gr.update(visible=False), # similarity_metrics
True, # status_message_visible
gr.update(visible=True, value="❌ **Error:** No dataset loaded. Please create or load a dataset first."),
# status_message
gr.update(visible=False) # bias_visualizations
)
def default_no_results():
"""Return default component updates when no analysis results are found"""
return (
{}, # analysis_results_state
False, # analysis_output visibility
False, # visualization_area_visible
gr.update(visible=False), # analysis_title
gr.update(visible=False), # prompt_title
gr.update(visible=False), # models_compared
gr.update(visible=False), # model1_title
gr.update(visible=False), # model1_words
gr.update(visible=False), # model2_title
gr.update(visible=False), # model2_words
gr.update(visible=False), # similarity_metrics_title
gr.update(visible=False), # similarity_metrics
True, # status_message_visible
gr.update(visible=True, value="❌ **No results found.** Try a different analysis option."), # status_message
gr.update(visible=False) # bias_visualizations
)
def default_message_response(message):
"""Return default component updates for a simple message response"""
return (
{}, # analysis_results_state
False, # analysis_output visibility
False, # visualization_area_visible
gr.update(visible=False), # analysis_title
gr.update(visible=False), # prompt_title
gr.update(visible=False), # models_compared
gr.update(visible=False), # model1_title
gr.update(visible=False), # model1_words
gr.update(visible=False), # model2_title
gr.update(visible=False), # model2_words
gr.update(visible=False), # similarity_metrics_title
gr.update(visible=False), # similarity_metrics
True, # status_message_visible
gr.update(visible=True, value=f"ℹ️ **{message}**"), # status_message
gr.update(visible=False) # bias_visualizations
)
def default_no_visualization(analysis_results):
"""Return a default set of component updates when no visualization can be shown"""
return (
analysis_results,
False,
False,
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
True,
gr.update(visible=True,
value="❌ **No visualization data found.** Make sure to select a valid analysis option."),
gr.update(visible=False) # bias_visualizations - Hide it
)
def default_error_response(error_msg, error_summary):
"""Return default component updates for an error response"""
return (
{"error": error_msg}, # analysis_results_state
True, # analysis_output visibility (show raw JSON for debugging)
False, # visualization_area_visible
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
True, # status_message_visible
gr.update(visible=True, value=f"❌ **Error during analysis:**\n\n```\n{error_summary}\n```"), # status_message
gr.update(visible=False) # bias_visualizations - Hide it during errors
)