File size: 4,210 Bytes
a1ac14e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ccfe614
a1ac14e
 
 
 
 
 
 
 
 
 
 
 
 
 
7243e58
 
a1ac14e
 
 
 
 
7243e58
a1ac14e
 
 
 
 
a8a1b3d
a1ac14e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7243e58
a1ac14e
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import streamlit as st
import pandas as pd
import plotly.graph_objects as go
import numpy as np

def show():
    st.title("Benchmark Results Dashboard")

    @st.cache_data
    def load_data():
        """Load and process benchmark results, handling zero accuracy."""
        try:
            df = pd.read_csv('data/processed_results.csv')
        except FileNotFoundError:
            st.error("File 'processed_results.csv' not found.")
            st.stop()

        epsilon = 1e-6
        num_zero_acc = (df['accuracy'] <= 0).sum()
        if num_zero_acc > 0:
            # st.warning(f"Found {num_zero_acc} zero/negative accuracy values. Replacing with {epsilon}.")
            df.loc[df['accuracy'] <= 0, 'accuracy'] = epsilon

        df['log_accuracy'] = np.log(df['accuracy'])
        return df

    df = load_data()

    # Filters
    st.header("Filters")

    col1, col2, col3 = st.columns(3)

    with col1:
        datasets = df['dataset'].unique()
        selected_datasets = st.multiselect("Dataset(s)", datasets, default=['symbolic']) # Default to 'symbolic'

        filtered_df = df[df['dataset'].isin(selected_datasets)]

        lengths = sorted(filtered_df['length'].unique())
        # Disable length filter if no datasets are selected
        disabled = not selected_datasets
        selected_lengths = st.multiselect("Length(s)", lengths, default=[0] if not disabled and 0 in lengths else [], disabled=disabled) # Default to 0 if available


    with col2:
        # Single Model Multiselect (filtered by selected datasets)
        available_models = filtered_df['model'].unique()
        selected_models = st.multiselect("Model(s)", available_models, default=['llama-3.1-8b-instruct','qwen-2.5-7b-instruct','llama-3.1-70b-instruct','qwen-2.5-72b-instruct','deepseek-v3'])

    with col3:
        min_op, max_op = st.slider("Op Range", int(filtered_df['op'].min()), int(filtered_df['op'].max()), (int(filtered_df['op'].min()), int(filtered_df['op'].max())))
        min_acc, max_acc = st.slider("Accuracy Range", float(filtered_df['accuracy'].min()), float(filtered_df['accuracy'].max()), (float(filtered_df['accuracy'].min()), float(filtered_df['accuracy'].max())))


    filtered_df = filtered_df[filtered_df['model'].isin(selected_models) & filtered_df['length'].isin(selected_lengths)]


    filtered_df = filtered_df[(filtered_df['op'] >= min_op) & (filtered_df['op'] <= max_op) & (filtered_df['accuracy'] >= min_acc) & (filtered_df['accuracy'] <= max_acc)]


    if filtered_df.empty:
        st.warning("No data for selected filters.")
        st.stop()

    def plot_data(filtered_df, selected_models, selected_lengths, log_scale=False):
        """Plots data vs N, showing different datasets for the same model."""
        fig = go.Figure()

        for model in selected_models:
            for length in selected_lengths:
                for dataset in filtered_df['dataset'].unique():
                    subset_df = filtered_df[(filtered_df['model'] == model) & (filtered_df['length'] == length) & (filtered_df['dataset'] == dataset)]
                    if not subset_df.empty:
                        y_data = subset_df['log_accuracy'] if log_scale else subset_df['accuracy']
                        fig.add_trace(go.Scatter(
                            x=subset_df['op'],
                            y=y_data,
                            mode='lines+markers',
                            name=f'{model} Length {length} ({dataset})',
                            marker=dict(size=6)
                        ))

        y_title = "Log(Accuracy)" if log_scale else "Accuracy"
        fig.update_layout(title=f"{y_title} vs Op", xaxis_title="Op", yaxis_title=y_title, width=800, height=600)
        return fig

    view_option = st.radio("View", ["Accuracy", "Log(Accuracy)"])

    if view_option == "Accuracy":
        fig = plot_data(filtered_df, selected_models, selected_lengths, log_scale=False)
    else:  # Log(Accuracy)
        fig = plot_data(filtered_df, selected_models, selected_lengths, log_scale=True)

    st.plotly_chart(fig, use_container_width=True)

    if st.checkbox("Show Data Table"):
        st.subheader("Filtered Data")
        st.write(filtered_df)