Spaces:
Sleeping
Sleeping
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()
|