File size: 5,295 Bytes
ae8e0ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash
# ============================================================
# QR-SPPS NB-5 Part B: Scaling Fit + Full Pipeline Summary
# ============================================================
# Run from: ~/QARPdemo  (AFTER run_nb5_30q.sh has completed)
#   cd ~/QARPdemo && sbatch run_nb5_final.sh
#
# All .pkl files read/written relative to working directory.
# QRSPPS_mpi_scaling.pkl is read from ~/QARPdemo/ (absolute path in script).
#
# This script:
#   1. Loads QRSPPS_mpi_scaling.pkl (29q+30q MPI measurements from Part A)
#   2. Runs single-node VQE benchmark at 12-20q (real energies, real timing)
#   3. Fits exponential scaling law and extrapolates to 40q
#   4. Integrates full NB1-NB4 pipeline results (all .pkl files)
#   5. Adds pipeline_summary for judge cross-verification
#   6. Saves QRSPPS_scaling_results.pkl + all scaling plots
#
# Execution: single-node, NO MPI.
#
# Expected results (verified against QRSPPS_scaling_results.pkl):
#   Scaling law:  t(n) = 7.8785 x 2^(1.1993*n)
#   R2          = 0.9948   (exact: 0.9947702934)
#   Doubling    = 1.1993 per qubit
#   t(40q)      = 4,709,365s = 1,308.2h
#   40q RAM     = 17,592,186 MB = 17.6 TB
#   Policy red. = 16.67%  (Stockpile release, dE[40q]=-7.4505)
#
# Depends on:  QRSPPS_mpi_scaling.pkl    (run_nb5_30q.sh)
#              QRSPPS_hamiltonians.pkl   (NB1)
#              QRSPPS_vqe_results.pkl    (NB2)
#              QRSPPS_policy_results.pkl (NB3)
#              QRSPPS_dosqpe_results.pkl (NB4)
# Produces:    QRSPPS_scaling_results.pkl
#              QRSPPS_qubit_scaling_full.png
#              QRSPPS_qubit_scaling.png
#
# Runtime: ~15-20 min
# ============================================================
#SBATCH --job-name=qrspps_nb5_final
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=12
#SBATCH --partition=Interactive
#SBATCH --time=48:00:00
#SBATCH --output=log_nb5_final.txt

source ~/QARPdemo/setup_env.sh

export QARP_DISABLE_MPI=1
export OMP_NUM_THREADS=48

echo "================================================================"
echo " QR-SPPS NB-5B: Scaling Fit + Pipeline Summary"
echo "================================================================"
echo " Start : $(date)"
echo " Node  : $(hostname)"
echo " Job   : $SLURM_JOB_ID"
echo " Dir   : $(pwd)"
echo ""
echo " Expected: R2=0.9948 | rate=1.1993/q | t(40q)=1308.2h | 17.6TB"
echo "================================================================"

# Dependency check (NB5_Scaling reads mpi_scaling.pkl from ~/QARPdemo/
# and all others as relative paths from cwd)
MISSING=0

MPI_PKL="$HOME/QARPdemo/QRSPPS_mpi_scaling.pkl"
if [ -f "$MPI_PKL" ]; then
    echo "Found : QRSPPS_mpi_scaling.pkl  ($(du -h $MPI_PKL | cut -f1))"
else
    echo "MISSING: $MPI_PKL"
    echo "Run 'sbatch run_nb5_30q.sh' first and wait for it to complete."
    MISSING=$((MISSING+1))
fi

for PKL in QRSPPS_hamiltonians.pkl QRSPPS_vqe_results.pkl \
           QRSPPS_policy_results.pkl QRSPPS_dosqpe_results.pkl; do
    if [ -f "$PKL" ]; then
        echo "Found : $PKL  ($(du -h $PKL | cut -f1))"
    else
        echo "MISSING: $PKL in $(pwd)"
        MISSING=$((MISSING+1))
    fi
done

if [ $MISSING -gt 0 ]; then
    echo ""
    echo "ERROR: $MISSING required file(s) missing. Pipeline order:"
    echo "  NB1: Run QRSPPS_NB1_Hamiltonian_40q.ipynb in Jupyter"
    echo "  NB2: cd ~/QARPdemo && sbatch run_nb2_vqe.sh"
    echo "  NB3+4: cd ~/QARPdemo && sbatch run_nb3_nb4.sh"
    echo "  NB5A: cd ~/QARPdemo && sbatch run_nb5_30q.sh"
    echo "  NB5B: cd ~/QARPdemo && sbatch run_nb5_final.sh  (this script)"
    exit 1
fi
echo ""

echo "=== Starting QRSPPS_NB5_Scaling.py ==="

python3 QRSPPS_NB5_Scaling.py

EXIT=$?
echo ""
echo "=== NB5 scaling exit: $EXIT  ($(date)) ==="

if [ ! -f "QRSPPS_scaling_results.pkl" ]; then
    echo "ERROR: QRSPPS_scaling_results.pkl not created. Check log_nb5_final.txt."
    exit 1
fi
echo "Output: QRSPPS_scaling_results.pkl  ($(du -h QRSPPS_scaling_results.pkl | cut -f1))  OK"

# Verify the three key numbers
python3 - << 'PYEOF'
import pickle, sys
try:
    with open('QRSPPS_scaling_results.pkl', 'rb') as f:
        s = pickle.load(f)
    print("")
    print("  Scaling law verification (vs .pkl):")
    print(f"    R2            = {s['r_squared']:.4f}   (expected 0.9948)")
    print(f"    Doubling rate = {s['doubling_rate']:.4f} (expected 1.1993)")
    print(f"    t(40q)        = {s['t_40q_predicted']:.0f}s = {s['t_40q_predicted']/3600:.1f}h  (expected 1308.2h)")
    print(f"    Policy E-red  = {s['policy_energy_reduction_pct']:.2f}%  (expected 16.67%)")
except Exception as e:
    print(f"  Verify failed: {e}", file=sys.stderr)
PYEOF

echo ""
echo "================================================================"
echo " FULL QR-SPPS PIPELINE COMPLETE"
echo " End: $(date)"
echo "================================================================"
echo ""
echo "All .pkl files for judge cross-verification:"
for PKL in QRSPPS_hamiltonians.pkl QRSPPS_vqe_results.pkl \
           QRSPPS_policy_results.pkl QRSPPS_dosqpe_results.pkl \
           QRSPPS_scaling_results.pkl; do
    if [ -f "$PKL" ]; then
        echo "  OK  $PKL  ($(du -h $PKL | cut -f1))"
    else
        echo "  --  $PKL  MISSING"
    fi
done
echo ""
echo "Run dashboard:"
echo "  cd ~/QARPdemo && streamlit run dashboard.py"
exit $EXIT