Tatopenn's picture
Sync dashboard_core/ from v8.1.33
d2486ac verified
Raw
History Blame Contribute Delete
2.71 kB
"""
Scalar metric formatting/computation shared between build_panel_overview
and the native st.metric grid.
Split out of the former monolithic dashboard_core.py (Phase 1 of the
dashboard refactor) -- pure move, no behavior change.
"""
from typing import Dict
import numpy as np
def _format_duration_ms(ms: float) -> str:
if ms >= 1000:
return f'{ms / 1000:.2f} s'
return f'{ms:.1f} ms'
def compute_overview_metrics(res: Dict, noise_model: str = 'ideal', noise_p: float = 0.0) -> list:
"""The 13 scalar metrics shown in the Overview panel, as a list of
{'label', 'value', 'help'} dicts — `value` is kept short so it never
overflows a fixed-width st.metric tile (e.g. a 15-qubit dominant-state
bitstring or "2^15 = 32768" both blow past that width); `help` carries
the full-precision original as a hover tooltip. Single source of truth
for both build_panel_overview (which no longer renders these as
matplotlib text — illegible once scaled down in a browser) and the
native st.metric grid the UI renders instead."""
prob = res['prob']
idx_max = res['idx_max']
n_qubits = res['n_qubits']
n_states = len(prob)
prob_max = prob[idx_max]
concurrence = 1.0 - prob_max
spectral_std = float(np.std(prob))
purity_approx = float(np.sum(prob ** 2))
t_ms = res["tempo"] * 1e3
return [
{'label': 'Qubits', 'value': f'{n_qubits}', 'help': None},
{'label': 'Hilbert Dim', 'value': f'{n_states:,}', 'help': f'2^{n_qubits} basis states'},
{'label': 'Gates', 'value': f'{res["porte_count"]}', 'help': 'Gates processed'},
{'label': 'Entropy', 'value': f'{res["entropy"]:.4f} bit', 'help': f'Shannon entropy: {res["entropy"]:.6f} bit'},
{'label': 'Concurrence', 'value': f'{concurrence:.4f}', 'help': f'Concurrence index: {concurrence:.6f}'},
{'label': 'Purity', 'value': f'{purity_approx:.4f}', 'help': f'Tr(ρ²) = {purity_approx:.6f}'},
{'label': 'Spectral σ', 'value': f'{spectral_std:.4f}', 'help': f'Spectral std-dev: {spectral_std:.7f}'},
{'label': 'Top State', 'value': f'#{idx_max}', 'help': f'|{res["stato_dominante"]}⟩'},
{'label': 'P(top)', 'value': f'{prob_max:.4f}', 'help': f'Probability of dominant state: {prob_max:.6f}'},
{'label': 'RAM', 'value': f'{res["ram"]:.2f} MB', 'help': f'Statevector memory: {res["ram"]:.6f} MB'},
{'label': 'Time', 'value': _format_duration_ms(t_ms), 'help': f'Wall-clock: {t_ms:.3f} ms'},
{'label': 'Noise', 'value': noise_model, 'help': 'Noise model applied to this run'},
{'label': 'Noise p', 'value': f'{noise_p:.3f}', 'help': f'Noise probability: {noise_p:.4f}'},
]