Spaces:
Running
Running
Upload 4 files
Browse files- scripts/run_nb2_vqe.sh +83 -0
- scripts/run_nb3_nb4.sh +128 -0
- scripts/run_nb5_30q.sh +94 -0
- scripts/run_nb5_final.sh +147 -0
scripts/run_nb2_vqe.sh
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# ============================================================
|
| 3 |
+
# QR-SPPS NB-2: VQE Ground State — 30-Qubit Execution
|
| 4 |
+
# ============================================================
|
| 5 |
+
# Run from: ~/QARPdemo
|
| 6 |
+
# cd ~/QARPdemo && sbatch run_nb2_vqe.sh
|
| 7 |
+
#
|
| 8 |
+
# All .pkl files are read/written relative to the working directory.
|
| 9 |
+
# Architecture: 40q encoded (NB1) -> 30q VQE executed (this script)
|
| 10 |
+
# Tier 0+1+2 fully retained + top-10 retail by coupling strength.
|
| 11 |
+
# E0[30q raw] = -33.5198 -> E0[40q scaled] = -44.6931 (zero error)
|
| 12 |
+
# Ansatz: RY+CNOT, depth=3, 120 params, 5 restarts, COBYLA maxiter=2000
|
| 13 |
+
#
|
| 14 |
+
# Execution: single-node, NO MPI.
|
| 15 |
+
# QARP_DISABLE_MPI=1 prevents QulacsEngine wrapper segfault on ARM A64FX.
|
| 16 |
+
# Script uses qulacs Observable API directly, not QulacsEngine.
|
| 17 |
+
#
|
| 18 |
+
# Depends on: QRSPPS_hamiltonians.pkl (NB1 Jupyter notebook)
|
| 19 |
+
# Produces: QRSPPS_vqe_results.pkl
|
| 20 |
+
# QRSPPS_vqe_convergence.png
|
| 21 |
+
# QRSPPS_quantum_vs_classical.png
|
| 22 |
+
# QRSPPS_vqe_depth_scaling.png
|
| 23 |
+
#
|
| 24 |
+
# Runtime: ~60-90 min
|
| 25 |
+
# 5 restarts x 2 scenarios x ~8 min (30q, depth=3)
|
| 26 |
+
# + depth study ~15 min (depths 1-5, 1 restart each)
|
| 27 |
+
# ============================================================
|
| 28 |
+
#SBATCH --job-name=qrspps_nb2_vqe
|
| 29 |
+
#SBATCH --nodes=4
|
| 30 |
+
#SBATCH --ntasks-per-node=12
|
| 31 |
+
#SBATCH --cpus-per-task=48
|
| 32 |
+
#SBATCH --partition=Interactive
|
| 33 |
+
#SBATCH --time=48:00:00
|
| 34 |
+
#SBATCH --output=log_nb2_vqe.txt
|
| 35 |
+
|
| 36 |
+
source ~/QARPdemo/setup_env.sh
|
| 37 |
+
|
| 38 |
+
# Disable QulacsEngine MPI wrapper - segfaults on ARM A64FX.
|
| 39 |
+
# NB2 uses qulacs Observable API directly (not QulacsEngine).
|
| 40 |
+
export QARP_DISABLE_MPI=1
|
| 41 |
+
export OMP_NUM_THREADS=48
|
| 42 |
+
|
| 43 |
+
echo "================================================================"
|
| 44 |
+
echo " QR-SPPS NB-2: VQE Ground State (30q Execution)"
|
| 45 |
+
echo "================================================================"
|
| 46 |
+
echo " Start : $(date)"
|
| 47 |
+
echo " Node : $(hostname)"
|
| 48 |
+
echo " Job : $SLURM_JOB_ID"
|
| 49 |
+
echo " Dir : $(pwd)"
|
| 50 |
+
echo ""
|
| 51 |
+
echo " 40q encoded | 30q executed"
|
| 52 |
+
echo " E0[30q] target: -33.5198"
|
| 53 |
+
echo " E0[40q] target: -44.6931 = -33.5198 x (40/30)"
|
| 54 |
+
echo "================================================================"
|
| 55 |
+
|
| 56 |
+
# Dependency check
|
| 57 |
+
if [ ! -f "QRSPPS_hamiltonians.pkl" ]; then
|
| 58 |
+
echo "ERROR: QRSPPS_hamiltonians.pkl not found in $(pwd)"
|
| 59 |
+
echo "Run NB1 Jupyter notebook first, then cd ~/QARPdemo before sbatch."
|
| 60 |
+
exit 1
|
| 61 |
+
fi
|
| 62 |
+
|
| 63 |
+
echo "Input : QRSPPS_hamiltonians.pkl ($(du -h QRSPPS_hamiltonians.pkl | cut -f1))"
|
| 64 |
+
echo ""
|
| 65 |
+
echo "=== Starting QRSPPS_NB2_VQE_30q.py ==="
|
| 66 |
+
|
| 67 |
+
python3 QRSPPS_NB2_VQE_30q.py
|
| 68 |
+
|
| 69 |
+
EXIT=$?
|
| 70 |
+
echo ""
|
| 71 |
+
echo "=== NB2 finished --- exit: $EXIT ($(date)) ==="
|
| 72 |
+
|
| 73 |
+
if [ -f "QRSPPS_vqe_results.pkl" ]; then
|
| 74 |
+
echo "Output: QRSPPS_vqe_results.pkl ($(du -h QRSPPS_vqe_results.pkl | cut -f1)) OK"
|
| 75 |
+
else
|
| 76 |
+
echo "ERROR: QRSPPS_vqe_results.pkl not created. Check log_nb2_vqe.txt."
|
| 77 |
+
exit 1
|
| 78 |
+
fi
|
| 79 |
+
|
| 80 |
+
echo ""
|
| 81 |
+
echo "Next step:"
|
| 82 |
+
echo " cd ~/QARPdemo && sbatch run_nb3_nb4.sh"
|
| 83 |
+
exit $EXIT
|
scripts/run_nb3_nb4.sh
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# ============================================================
|
| 3 |
+
# QR-SPPS NB-3 + NB-4: ADAPT-VQE Policy + DOS-QPE
|
| 4 |
+
# ============================================================
|
| 5 |
+
# Run from: ~/QARPdemo
|
| 6 |
+
# cd ~/QARPdemo && sbatch run_nb3_nb4.sh
|
| 7 |
+
#
|
| 8 |
+
# All .pkl files are read/written relative to the working directory.
|
| 9 |
+
#
|
| 10 |
+
# NB-3 (ADAPT-VQE Policy Optimisation):
|
| 11 |
+
# 6 counterfactual policies ranked by gradient screening.
|
| 12 |
+
# Warm-starts from NB2 vqe_params_sub_A (30q ansatz parameters).
|
| 13 |
+
# Each policy runs in ~0.7s (O(1) expectation values, no re-opt).
|
| 14 |
+
# Runtime: ~15 min total.
|
| 15 |
+
#
|
| 16 |
+
# NB-4 (DOS-QPE Spectral Reconstruction + Cascade Dynamics):
|
| 17 |
+
# 64 Trotter steps, T_max=15.0, dt=0.2381, Nyquist=2.10 (no aliasing).
|
| 18 |
+
# Cascade: 10 snapshots, T_casc=6.0, dt_casc=0.6.
|
| 19 |
+
# Tail risk: 6 policies x 60 temperature values.
|
| 20 |
+
# Runtime: ~20-30 min.
|
| 21 |
+
#
|
| 22 |
+
# Both scripts set QARP_DISABLE_MPI=1 internally.
|
| 23 |
+
# Execution: single-node, NO MPI for either notebook.
|
| 24 |
+
#
|
| 25 |
+
# Depends on: QRSPPS_hamiltonians.pkl (NB1)
|
| 26 |
+
# QRSPPS_vqe_results.pkl (NB2)
|
| 27 |
+
# Produces: QRSPPS_policy_results.pkl
|
| 28 |
+
# QRSPPS_dosqpe_results.pkl
|
| 29 |
+
# QRSPPS_policy_effectiveness.png
|
| 30 |
+
# QRSPPS_policy_heatmap.png
|
| 31 |
+
# QRSPPS_policy_map.png
|
| 32 |
+
# QRSPPS_policy_roi.png
|
| 33 |
+
# QRSPPS_dosqpe_full.png
|
| 34 |
+
#
|
| 35 |
+
# Expected key results (verifiable against .pkl files):
|
| 36 |
+
# NB3: Stockpile release best dE[40q] = -7.4505 (16.67% reduction)
|
| 37 |
+
# Supplier subsidy top ADAPT gradient g = 4.1955
|
| 38 |
+
# NB4: |A(0)| = 1.0000 |A(T_max)| = 0.0746
|
| 39 |
+
# E_cutoff = -43.2197 spectral_width = 1.7333
|
| 40 |
+
# cascade final mean stress = 0.7945
|
| 41 |
+
# ============================================================
|
| 42 |
+
#SBATCH --job-name=qrspps_nb3nb4
|
| 43 |
+
#SBATCH --nodes=4
|
| 44 |
+
#SBATCH --ntasks-per-node=12
|
| 45 |
+
#SBATCH --partition=Interactive
|
| 46 |
+
#SBATCH --time=48:00:00
|
| 47 |
+
#SBATCH --output=log_nb3_nb4.txt
|
| 48 |
+
|
| 49 |
+
source ~/QARPdemo/setup_env.sh
|
| 50 |
+
|
| 51 |
+
export QARP_DISABLE_MPI=1
|
| 52 |
+
export OMP_NUM_THREADS=48
|
| 53 |
+
|
| 54 |
+
echo "================================================================"
|
| 55 |
+
echo " QR-SPPS NB-3 + NB-4: ADAPT-VQE + DOS-QPE"
|
| 56 |
+
echo "================================================================"
|
| 57 |
+
echo " Start : $(date)"
|
| 58 |
+
echo " Node : $(hostname)"
|
| 59 |
+
echo " Job : $SLURM_JOB_ID"
|
| 60 |
+
echo " Dir : $(pwd)"
|
| 61 |
+
echo "================================================================"
|
| 62 |
+
|
| 63 |
+
# Dependency check
|
| 64 |
+
for PKL in QRSPPS_hamiltonians.pkl QRSPPS_vqe_results.pkl; do
|
| 65 |
+
if [ ! -f "$PKL" ]; then
|
| 66 |
+
echo "ERROR: $PKL not found in $(pwd)"
|
| 67 |
+
echo "Ensure NB1 (Jupyter) and NB2 (run_nb2_vqe.sh) completed."
|
| 68 |
+
exit 1
|
| 69 |
+
fi
|
| 70 |
+
echo "Found : $PKL ($(du -h $PKL | cut -f1))"
|
| 71 |
+
done
|
| 72 |
+
echo ""
|
| 73 |
+
|
| 74 |
+
# NB-3
|
| 75 |
+
echo "=== Starting NB-3: QRSPPS_NB3_Policy_30q.py ==="
|
| 76 |
+
echo " 6 policies via ADAPT-VQE gradient screening"
|
| 77 |
+
echo " Baseline E0[30q]=-33.5198 | E0[40q]=-44.6931"
|
| 78 |
+
echo " Start: $(date)"
|
| 79 |
+
|
| 80 |
+
python3 QRSPPS_NB3_Policy_30q.py
|
| 81 |
+
|
| 82 |
+
NB3_EXIT=$?
|
| 83 |
+
echo "NB3 exit: $NB3_EXIT ($(date))"
|
| 84 |
+
|
| 85 |
+
if [ $NB3_EXIT -ne 0 ]; then
|
| 86 |
+
echo "ERROR: NB-3 failed (exit $NB3_EXIT). NB-4 will not run."
|
| 87 |
+
exit $NB3_EXIT
|
| 88 |
+
fi
|
| 89 |
+
|
| 90 |
+
if [ ! -f "QRSPPS_policy_results.pkl" ]; then
|
| 91 |
+
echo "ERROR: QRSPPS_policy_results.pkl not created. Check log_nb3_nb4.txt."
|
| 92 |
+
exit 1
|
| 93 |
+
fi
|
| 94 |
+
echo "Output: QRSPPS_policy_results.pkl ($(du -h QRSPPS_policy_results.pkl | cut -f1)) OK"
|
| 95 |
+
echo ""
|
| 96 |
+
|
| 97 |
+
# NB-4
|
| 98 |
+
echo "=== Starting NB-4: QRSPPS_NB4_DOSQPE_30q.py ==="
|
| 99 |
+
echo " 64 Trotter steps | T_max=15.0 | dt=0.2381 | Nyquist=2.10"
|
| 100 |
+
echo " Cascade: 10 snapshots | T_casc=6.0"
|
| 101 |
+
echo " Start: $(date)"
|
| 102 |
+
|
| 103 |
+
python3 QRSPPS_NB4_DOSQPE_30q.py
|
| 104 |
+
|
| 105 |
+
NB4_EXIT=$?
|
| 106 |
+
echo "NB4 exit: $NB4_EXIT ($(date))"
|
| 107 |
+
|
| 108 |
+
if [ $NB4_EXIT -ne 0 ]; then
|
| 109 |
+
echo "ERROR: NB-4 failed (exit $NB4_EXIT). Check log_nb3_nb4.txt."
|
| 110 |
+
exit $NB4_EXIT
|
| 111 |
+
fi
|
| 112 |
+
|
| 113 |
+
if [ ! -f "QRSPPS_dosqpe_results.pkl" ]; then
|
| 114 |
+
echo "ERROR: QRSPPS_dosqpe_results.pkl not created. Check log_nb3_nb4.txt."
|
| 115 |
+
exit 1
|
| 116 |
+
fi
|
| 117 |
+
echo "Output: QRSPPS_dosqpe_results.pkl ($(du -h QRSPPS_dosqpe_results.pkl | cut -f1)) OK"
|
| 118 |
+
|
| 119 |
+
echo ""
|
| 120 |
+
echo "================================================================"
|
| 121 |
+
echo " NB-3 + NB-4 ALL DONE"
|
| 122 |
+
echo " End: $(date)"
|
| 123 |
+
echo "================================================================"
|
| 124 |
+
echo ""
|
| 125 |
+
echo "Next steps:"
|
| 126 |
+
echo " Step A: cd ~/QARPdemo && sbatch run_nb5_30q.sh (12h MPI benchmark)"
|
| 127 |
+
echo " Step B: cd ~/QARPdemo && sbatch run_nb5_final.sh (after Step A)"
|
| 128 |
+
exit 0
|
scripts/run_nb5_30q.sh
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# ============================================================
|
| 3 |
+
# QR-SPPS NB-5 Part A: MPI State-Vector Benchmark (29q + 30q)
|
| 4 |
+
# ============================================================
|
| 5 |
+
# Run from: ~/QARPdemo
|
| 6 |
+
# cd ~/QARPdemo && sbatch run_nb5_30q.sh
|
| 7 |
+
# tail -f nb5_30q_output.log
|
| 8 |
+
#
|
| 9 |
+
# Measures actual 29q and 30q state-vector evaluation times on
|
| 10 |
+
# Fujitsu A64FX using MPI-distributed state-vector simulation.
|
| 11 |
+
# These are the REAL hardware measurements that ground the
|
| 12 |
+
# exponential scaling law (R2=0.9948, doubling rate=1.1993/qubit).
|
| 13 |
+
#
|
| 14 |
+
# MPI layout (2 active ranks):
|
| 15 |
+
# rank 0 -> 29q (SV = 8,590 MB, measured ~595s)
|
| 16 |
+
# rank 1 -> 30q (SV = 17,180 MB, measured ~1192s) <- PHYSICAL CEILING
|
| 17 |
+
#
|
| 18 |
+
# Memory note (why --nodes=2 is correct):
|
| 19 |
+
# 30q state-vector = 17.2 GB raw.
|
| 20 |
+
# + MPI overhead + 40-node observable = ~20-24 GB total per rank.
|
| 21 |
+
# Each A64FX node has 28.9 GB free RAM. 2 nodes = sufficient.
|
| 22 |
+
# (4-node salloc allocation provides topology stability.)
|
| 23 |
+
#
|
| 24 |
+
# IMPORTANT: mpi4py IS imported in QRSPPS_NB5_measure30q.py intentionally.
|
| 25 |
+
# This is a standalone sbatch script - NOT run from inside Jupyter.
|
| 26 |
+
# (Importing mpi4py in Jupyter on a compute node crashes the kernel.)
|
| 27 |
+
#
|
| 28 |
+
# Depends on: nothing (standalone benchmark - does not need prior pkls)
|
| 29 |
+
# Produces: QRSPPS_mpi_scaling.pkl (saved to ~/QARPdemo/)
|
| 30 |
+
#
|
| 31 |
+
# After this completes, run:
|
| 32 |
+
# cd ~/QARPdemo && sbatch run_nb5_final.sh
|
| 33 |
+
#
|
| 34 |
+
# Runtime: ~35 min (29q ~595s + 30q ~1192s + overhead)
|
| 35 |
+
# Wall time set to 12:00:00 for safety (interactive partition limit)
|
| 36 |
+
# ============================================================
|
| 37 |
+
#SBATCH --job-name=qrspps_nb5_30q
|
| 38 |
+
#SBATCH --nodes=4
|
| 39 |
+
#SBATCH --ntasks-per-node=12
|
| 40 |
+
#SBATCH --cpus-per-task=4
|
| 41 |
+
#SBATCH --partition=Interactive
|
| 42 |
+
#SBATCH --time=48:00:00
|
| 43 |
+
#SBATCH --output=nb5_30q_output.log
|
| 44 |
+
|
| 45 |
+
source ~/QARPdemo/setup_env.sh
|
| 46 |
+
|
| 47 |
+
# NOTE: do NOT set QARP_DISABLE_MPI here.
|
| 48 |
+
# QRSPPS_NB5_measure30q.py uses mpi4py intentionally.
|
| 49 |
+
export OMP_NUM_THREADS=4
|
| 50 |
+
|
| 51 |
+
echo "================================================================"
|
| 52 |
+
echo " QR-SPPS NB-5A: MPI 29q + 30q State-Vector Benchmark"
|
| 53 |
+
echo "================================================================"
|
| 54 |
+
echo " Start : $(date)"
|
| 55 |
+
echo " Node : $(hostname)"
|
| 56 |
+
echo " Job : $SLURM_JOB_ID"
|
| 57 |
+
echo " Dir : $(pwd)"
|
| 58 |
+
echo " Nodes : $SLURM_JOB_NUM_NODES"
|
| 59 |
+
echo " Tasks : $SLURM_NTASKS"
|
| 60 |
+
echo ""
|
| 61 |
+
echo " rank 0 -> 29q (SV = 8,590 MB, ~595s)"
|
| 62 |
+
echo " rank 1 -> 30q (SV = 17,180 MB, ~1192s) <- physical memory ceiling"
|
| 63 |
+
echo ""
|
| 64 |
+
echo " 30q state-vector = 17.2 GB + MPI overhead = ~20-24 GB"
|
| 65 |
+
echo " A64FX free RAM per node = 28.9 GB: fits comfortably"
|
| 66 |
+
echo "================================================================"
|
| 67 |
+
echo ""
|
| 68 |
+
|
| 69 |
+
echo "=== Starting QRSPPS_NB5_measure30q.py via srun ==="
|
| 70 |
+
|
| 71 |
+
srun python3 QRSPPS_NB5_measure30q.py
|
| 72 |
+
|
| 73 |
+
EXIT=$?
|
| 74 |
+
echo ""
|
| 75 |
+
echo "=== srun exit: $EXIT ($(date)) ==="
|
| 76 |
+
|
| 77 |
+
# Verify output (saved to ~/QARPdemo/QRSPPS_mpi_scaling.pkl by the script)
|
| 78 |
+
MPI_PKL="$HOME/QARPdemo/QRSPPS_mpi_scaling.pkl"
|
| 79 |
+
if [ -f "$MPI_PKL" ]; then
|
| 80 |
+
echo "Output: QRSPPS_mpi_scaling.pkl ($(du -h $MPI_PKL | cut -f1)) OK"
|
| 81 |
+
else
|
| 82 |
+
echo "WARNING: QRSPPS_mpi_scaling.pkl not found at $MPI_PKL"
|
| 83 |
+
echo "Check nb5_30q_output.log for errors."
|
| 84 |
+
exit 1
|
| 85 |
+
fi
|
| 86 |
+
|
| 87 |
+
echo ""
|
| 88 |
+
echo "================================================================"
|
| 89 |
+
echo " NB-5A DONE | End: $(date)"
|
| 90 |
+
echo "================================================================"
|
| 91 |
+
echo ""
|
| 92 |
+
echo "Next step:"
|
| 93 |
+
echo " cd ~/QARPdemo && sbatch run_nb5_final.sh"
|
| 94 |
+
exit $EXIT
|
scripts/run_nb5_final.sh
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# ============================================================
|
| 3 |
+
# QR-SPPS NB-5 Part B: Scaling Fit + Full Pipeline Summary
|
| 4 |
+
# ============================================================
|
| 5 |
+
# Run from: ~/QARPdemo (AFTER run_nb5_30q.sh has completed)
|
| 6 |
+
# cd ~/QARPdemo && sbatch run_nb5_final.sh
|
| 7 |
+
#
|
| 8 |
+
# All .pkl files read/written relative to working directory.
|
| 9 |
+
# QRSPPS_mpi_scaling.pkl is read from ~/QARPdemo/ (absolute path in script).
|
| 10 |
+
#
|
| 11 |
+
# This script:
|
| 12 |
+
# 1. Loads QRSPPS_mpi_scaling.pkl (29q+30q MPI measurements from Part A)
|
| 13 |
+
# 2. Runs single-node VQE benchmark at 12-20q (real energies, real timing)
|
| 14 |
+
# 3. Fits exponential scaling law and extrapolates to 40q
|
| 15 |
+
# 4. Integrates full NB1-NB4 pipeline results (all .pkl files)
|
| 16 |
+
# 5. Adds pipeline_summary for judge cross-verification
|
| 17 |
+
# 6. Saves QRSPPS_scaling_results.pkl + all scaling plots
|
| 18 |
+
#
|
| 19 |
+
# Execution: single-node, NO MPI.
|
| 20 |
+
#
|
| 21 |
+
# Expected results (verified against QRSPPS_scaling_results.pkl):
|
| 22 |
+
# Scaling law: t(n) = 7.8785 x 2^(1.1993*n)
|
| 23 |
+
# R2 = 0.9948 (exact: 0.9947702934)
|
| 24 |
+
# Doubling = 1.1993 per qubit
|
| 25 |
+
# t(40q) = 4,709,365s = 1,308.2h
|
| 26 |
+
# 40q RAM = 17,592,186 MB = 17.6 TB
|
| 27 |
+
# Policy red. = 16.67% (Stockpile release, dE[40q]=-7.4505)
|
| 28 |
+
#
|
| 29 |
+
# Depends on: QRSPPS_mpi_scaling.pkl (run_nb5_30q.sh)
|
| 30 |
+
# QRSPPS_hamiltonians.pkl (NB1)
|
| 31 |
+
# QRSPPS_vqe_results.pkl (NB2)
|
| 32 |
+
# QRSPPS_policy_results.pkl (NB3)
|
| 33 |
+
# QRSPPS_dosqpe_results.pkl (NB4)
|
| 34 |
+
# Produces: QRSPPS_scaling_results.pkl
|
| 35 |
+
# QRSPPS_qubit_scaling_full.png
|
| 36 |
+
# QRSPPS_qubit_scaling.png
|
| 37 |
+
#
|
| 38 |
+
# Runtime: ~15-20 min
|
| 39 |
+
# ============================================================
|
| 40 |
+
#SBATCH --job-name=qrspps_nb5_final
|
| 41 |
+
#SBATCH --nodes=4
|
| 42 |
+
#SBATCH --ntasks-per-node=12
|
| 43 |
+
#SBATCH --partition=Interactive
|
| 44 |
+
#SBATCH --time=48:00:00
|
| 45 |
+
#SBATCH --output=log_nb5_final.txt
|
| 46 |
+
|
| 47 |
+
source ~/QARPdemo/setup_env.sh
|
| 48 |
+
|
| 49 |
+
export QARP_DISABLE_MPI=1
|
| 50 |
+
export OMP_NUM_THREADS=48
|
| 51 |
+
|
| 52 |
+
echo "================================================================"
|
| 53 |
+
echo " QR-SPPS NB-5B: Scaling Fit + Pipeline Summary"
|
| 54 |
+
echo "================================================================"
|
| 55 |
+
echo " Start : $(date)"
|
| 56 |
+
echo " Node : $(hostname)"
|
| 57 |
+
echo " Job : $SLURM_JOB_ID"
|
| 58 |
+
echo " Dir : $(pwd)"
|
| 59 |
+
echo ""
|
| 60 |
+
echo " Expected: R2=0.9948 | rate=1.1993/q | t(40q)=1308.2h | 17.6TB"
|
| 61 |
+
echo "================================================================"
|
| 62 |
+
|
| 63 |
+
# Dependency check (NB5_Scaling reads mpi_scaling.pkl from ~/QARPdemo/
|
| 64 |
+
# and all others as relative paths from cwd)
|
| 65 |
+
MISSING=0
|
| 66 |
+
|
| 67 |
+
MPI_PKL="$HOME/QARPdemo/QRSPPS_mpi_scaling.pkl"
|
| 68 |
+
if [ -f "$MPI_PKL" ]; then
|
| 69 |
+
echo "Found : QRSPPS_mpi_scaling.pkl ($(du -h $MPI_PKL | cut -f1))"
|
| 70 |
+
else
|
| 71 |
+
echo "MISSING: $MPI_PKL"
|
| 72 |
+
echo "Run 'sbatch run_nb5_30q.sh' first and wait for it to complete."
|
| 73 |
+
MISSING=$((MISSING+1))
|
| 74 |
+
fi
|
| 75 |
+
|
| 76 |
+
for PKL in QRSPPS_hamiltonians.pkl QRSPPS_vqe_results.pkl \
|
| 77 |
+
QRSPPS_policy_results.pkl QRSPPS_dosqpe_results.pkl; do
|
| 78 |
+
if [ -f "$PKL" ]; then
|
| 79 |
+
echo "Found : $PKL ($(du -h $PKL | cut -f1))"
|
| 80 |
+
else
|
| 81 |
+
echo "MISSING: $PKL in $(pwd)"
|
| 82 |
+
MISSING=$((MISSING+1))
|
| 83 |
+
fi
|
| 84 |
+
done
|
| 85 |
+
|
| 86 |
+
if [ $MISSING -gt 0 ]; then
|
| 87 |
+
echo ""
|
| 88 |
+
echo "ERROR: $MISSING required file(s) missing. Pipeline order:"
|
| 89 |
+
echo " NB1: Run QRSPPS_NB1_Hamiltonian_40q.ipynb in Jupyter"
|
| 90 |
+
echo " NB2: cd ~/QARPdemo && sbatch run_nb2_vqe.sh"
|
| 91 |
+
echo " NB3+4: cd ~/QARPdemo && sbatch run_nb3_nb4.sh"
|
| 92 |
+
echo " NB5A: cd ~/QARPdemo && sbatch run_nb5_30q.sh"
|
| 93 |
+
echo " NB5B: cd ~/QARPdemo && sbatch run_nb5_final.sh (this script)"
|
| 94 |
+
exit 1
|
| 95 |
+
fi
|
| 96 |
+
echo ""
|
| 97 |
+
|
| 98 |
+
echo "=== Starting QRSPPS_NB5_Scaling.py ==="
|
| 99 |
+
|
| 100 |
+
python3 QRSPPS_NB5_Scaling.py
|
| 101 |
+
|
| 102 |
+
EXIT=$?
|
| 103 |
+
echo ""
|
| 104 |
+
echo "=== NB5 scaling exit: $EXIT ($(date)) ==="
|
| 105 |
+
|
| 106 |
+
if [ ! -f "QRSPPS_scaling_results.pkl" ]; then
|
| 107 |
+
echo "ERROR: QRSPPS_scaling_results.pkl not created. Check log_nb5_final.txt."
|
| 108 |
+
exit 1
|
| 109 |
+
fi
|
| 110 |
+
echo "Output: QRSPPS_scaling_results.pkl ($(du -h QRSPPS_scaling_results.pkl | cut -f1)) OK"
|
| 111 |
+
|
| 112 |
+
# Verify the three key numbers
|
| 113 |
+
python3 - << 'PYEOF'
|
| 114 |
+
import pickle, sys
|
| 115 |
+
try:
|
| 116 |
+
with open('QRSPPS_scaling_results.pkl', 'rb') as f:
|
| 117 |
+
s = pickle.load(f)
|
| 118 |
+
print("")
|
| 119 |
+
print(" Scaling law verification (vs .pkl):")
|
| 120 |
+
print(f" R2 = {s['r_squared']:.4f} (expected 0.9948)")
|
| 121 |
+
print(f" Doubling rate = {s['doubling_rate']:.4f} (expected 1.1993)")
|
| 122 |
+
print(f" t(40q) = {s['t_40q_predicted']:.0f}s = {s['t_40q_predicted']/3600:.1f}h (expected 1308.2h)")
|
| 123 |
+
print(f" Policy E-red = {s['policy_energy_reduction_pct']:.2f}% (expected 16.67%)")
|
| 124 |
+
except Exception as e:
|
| 125 |
+
print(f" Verify failed: {e}", file=sys.stderr)
|
| 126 |
+
PYEOF
|
| 127 |
+
|
| 128 |
+
echo ""
|
| 129 |
+
echo "================================================================"
|
| 130 |
+
echo " FULL QR-SPPS PIPELINE COMPLETE"
|
| 131 |
+
echo " End: $(date)"
|
| 132 |
+
echo "================================================================"
|
| 133 |
+
echo ""
|
| 134 |
+
echo "All .pkl files for judge cross-verification:"
|
| 135 |
+
for PKL in QRSPPS_hamiltonians.pkl QRSPPS_vqe_results.pkl \
|
| 136 |
+
QRSPPS_policy_results.pkl QRSPPS_dosqpe_results.pkl \
|
| 137 |
+
QRSPPS_scaling_results.pkl; do
|
| 138 |
+
if [ -f "$PKL" ]; then
|
| 139 |
+
echo " OK $PKL ($(du -h $PKL | cut -f1))"
|
| 140 |
+
else
|
| 141 |
+
echo " -- $PKL MISSING"
|
| 142 |
+
fi
|
| 143 |
+
done
|
| 144 |
+
echo ""
|
| 145 |
+
echo "Run dashboard:"
|
| 146 |
+
echo " cd ~/QARPdemo && streamlit run dashboard.py"
|
| 147 |
+
exit $EXIT
|