File size: 5,101 Bytes
fa6bd30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os

# Ensure output directory exists
# Ensure output directory exists
# Output to ../papers relative to this script
output_dir = os.path.join(os.path.dirname(__file__), "..", "papers")
os.makedirs(output_dir, exist_ok=True)

# Set style for scientific publication
plt.style.use('default') 
# Use a simple, clean style since 'seaborn-whitegrid' might not be available or 'seaborn' not installed
# We will manually set grid and aesthetic
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'Liberation Sans']
plt.rcParams['figure.dpi'] = 300

# Color palette (Scientific Blue/Orange)
c_blue = '#1f77b4'
c_orange = '#ff7f0e'
c_green = '#2ca02c'
c_red = '#d62728'

# --- Metric 1: F1 Improvement (Bar Chart) ---
def plot_f1_improvement():
    data = {
        'Strategy': ['Baseline (Fixed τ)', 'Optimized (Adaptive τ)', 'Breakthrough (Argmax)'],
        'F1 Score': [81.3, 98.4, 99.6],
        'Recall': [75.8, 100.0, 99.5]
    }
    df = pd.DataFrame(data)
    
    fig, ax = plt.subplots(figsize=(8, 5))
    x = np.arange(len(df['Strategy']))
    width = 0.35
    
    rects1 = ax.bar(x - width/2, df['F1 Score'], width, label='F1 Score', color=c_blue, alpha=0.8, edgecolor='black')
    rects2 = ax.bar(x + width/2, df['Recall'], width, label='Recall', color=c_green, alpha=0.8, edgecolor='black')
    
    ax.set_ylabel('Performance (%)', fontsize=12, fontweight='bold')
    ax.set_title('Figure 1: Atomic VSA Optimization Trajectory', fontsize=14, fontweight='bold', pad=15)
    ax.set_xticks(x)
    ax.set_xticklabels(df['Strategy'], fontsize=10, rotation=0)
    ax.set_ylim(60, 105)
    ax.legend(loc='lower right')
    ax.grid(axis='y', linestyle='--', alpha=0.5)
    
    # Add value labels
    def autolabel(rects):
        for rect in rects:
            height = rect.get_height()
            ax.annotate(f'{height}%',
                        xy=(rect.get_x() + rect.get_width() / 2, height),
                        xytext=(0, 3),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='center', va='bottom', fontweight='bold')

    autolabel(rects1)
    autolabel(rects2)
    
    plt.tight_layout()
    save_path = os.path.join(output_dir, "fig1_optimization_trajectory.png")
    plt.savefig(save_path)
    print(f"Generated: {save_path}")
    plt.close()

# --- Metric 2: SNR Gap Analysis (Horizontal Bar Chart) ---
def plot_snr_gap():
    # Data from Table 1 in the paper
    conditions = [
        'Acanthamoebiasis', 'Cholera', 'Resp. Tuberculosis', 
        'Malaria (P. falc)', 'Plasmodium w/ Complications', 
        'Acute Hep B', 'Acute Hep A', 'Typhoid Fever'
    ]
    snr_gaps = [0.603, 0.482, 0.324, 0.229, 0.188, 0.017, 0.000, 0.000]
    colors = [c_green if x > 0.1 else (c_orange if x > 0 else c_red) for x in snr_gaps]
    
    fig, ax = plt.subplots(figsize=(10, 6))
    y_pos = np.arange(len(conditions))
    
    bars = ax.barh(y_pos, snr_gaps, color=colors, edgecolor='black', alpha=0.8)
    ax.set_yticks(y_pos)
    ax.set_yticklabels(conditions)
    ax.invert_yaxis()  # labels read top-to-bottom
    ax.set_xlabel('Resonance Gap (SNR)', fontsize=12, fontweight='bold')
    ax.set_title('Figure 2: The Holographic Limit (Resonance Gap Analysis)', fontsize=14, fontweight='bold', pad=15)
    ax.axvline(x=0.05, color='red', linestyle='--', label='Noise Floor (0.05)')
    ax.legend()
    ax.grid(axis='x', linestyle='--', alpha=0.5)

    # Add value labels
    for i, v in enumerate(snr_gaps):
        ax.text(v + 0.01, i + 0.1, f'{v:.3f}', color='black', fontweight='bold')

    plt.tight_layout()
    save_path = os.path.join(output_dir, "fig2_snr_analysis.png")
    plt.savefig(save_path)
    print(f"Generated: {save_path}")
    plt.close()

# --- Metric 3: Speedup (Log Scale) ---
def plot_speedup():
    labels = ['Atomic VSA', 'Neural Net (Inference)']
    times_us = [42, 50000] # 42us vs 50ms (50,000us)
    
    fig, ax = plt.subplots(figsize=(8, 4))
    y_pos = np.arange(len(labels))
    
    rects = ax.barh(y_pos, times_us, color=[c_green, c_red], edgecolor='black')
    ax.set_yticks(y_pos)
    ax.set_yticklabels(labels)
    ax.invert_yaxis()
    ax.set_xlabel('Inference Time (microseconds) - Log Scale', fontsize=12, fontweight='bold')
    ax.set_title('Figure 3: Computational Efficiency (Log Scale)', fontsize=14, fontweight='bold')
    ax.set_xscale('log')
    ax.grid(axis='x', linestyle='--', alpha=0.5)
    
    for i, v in enumerate(times_us):
        label = f"{v} µs" if v < 1000 else f"{v/1000} ms"
        ax.text(v * 1.1, i, label, va='center', fontweight='bold')

    plt.tight_layout()
    save_path = os.path.join(output_dir, "fig3_speedup.png")
    plt.savefig(save_path)
    print(f"Generated: {save_path}")
    plt.close()

if __name__ == "__main__":
    plot_f1_improvement()
    plot_snr_gap()
    plot_speedup()