Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8de5d2f
docs: change project name to HoloPASWIN
electricalgorithm Nov 22, 2025
473bba8
docs: refine project description in README.md
electricalgorithm Nov 22, 2025
fd5f0ea
feat: add version 2 - complex field support
electricalgorithm Dec 11, 2025
7e335ff
feat: add third experiment results with complex field
electricalgorithm Dec 12, 2025
a9407eb
fix(inference): adopt the inference script to v2
electricalgorithm Dec 12, 2025
6abfe17
feat: add residual connection to swin
electricalgorithm Dec 12, 2025
0877d12
feat(train): add interrupt-saves for fallbacks
electricalgorithm Dec 12, 2025
9a4e5f8
feat: improve loss by adding phase and amp
electricalgorithm Dec 13, 2025
ba8f358
feat: add experiment results
electricalgorithm Dec 13, 2025
0a6e031
feat: add experiment 8 that uses 224x224 dataset
electricalgorithm Dec 13, 2025
c24276e
refactor: remove outdated notebooks
electricalgorithm Dec 14, 2025
b9a64e6
chore: fix linting and types for pre-commit
electricalgorithm Dec 14, 2025
f187493
chore: track pth files with git-lfs
electricalgorithm Dec 14, 2025
a7fe148
feat(exp9): Complete Experiment 9 (25k samples, 8 configs) with SOTA …
electricalgorithm Jan 15, 2026
9ca4e23
feat(scripts): add hf publisher
electricalgorithm Jan 15, 2026
14bed96
docs(arch): add network arch ascii diagram
electricalgorithm Jan 31, 2026
1870a96
feat: add ablation for loss weights
electricalgorithm Jan 31, 2026
fa7567a
feat: add inference fps benchmark
electricalgorithm Jan 31, 2026
39c12ab
feat: add zoom figure producer
electricalgorithm Jan 31, 2026
a36d27a
feat: add b/s metric
electricalgorithm Jan 31, 2026
a581c5a
refactor: move scripts to scripts dir
electricalgorithm Jan 31, 2026
8e06aa3
refactor: apply ruff formatter and linters
electricalgorithm Jan 31, 2026
e171dc3
feat(testing): add ablation study scripts
electricalgorithm Feb 3, 2026
04c31d4
fix(robustness): use the correct propagator on robustness test
electricalgorithm Feb 3, 2026
a81fe8f
feat: add script for architectural comparison
electricalgorithm Feb 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
.venv
__pycache__
**/*.pth
**/*.parquet
**/*.png
checkpoints/
logs/
.DS_Store
.env
.pytest_cache/
.ruff_cache/
.cursor/
.cursor/
**/*egg-info*
77 changes: 73 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,79 @@
# HOLO-PASWIN: In-Line Holographical Physics-Aware SWIN Transformer
# HoloPASWIN v2

A research-grade deep learning project for eliminating the **twin-image problem in in-line holography** using a **physics-aware Swin-UNet architecture** trained with synthetic holograms generated via the Angular Spectrum Method.
Physics-Aware Swin Transformer for eliminating twin-image artifacts in in-line holography.

Build a modern, high-performing, physics-aware neural architecture capable of reconstructing complex object fields ( $\hat{O} = \hat{O}_{real} + i\hat{O}_{imag}$ ) from inline holograms while robustly suppressing **twin-image artifacts**, **noise**, and **aberrations**.
```
┌─────────────────────────────────────────────────────────────┐
│ HOLOPASWIN MODEL │
└─────────────────────────────────────────────────────────────┘

Input: Hologram (B,1,H,W)
┌─────────────────┐
│ Physics (ASM) │ Back-propagation to object plane
│ FFT→H*→IFFT │ Output: Dirty field (with twin image)
└────────┬────────┘
│ Complex → Real/Imag (B,2,H,W)
┌─────────────────┐
│ Swin Encoder │ Multi-scale feature extraction
│ 4 stages │ Scales: 1/4, 1/8, 1/16, 1/32
│ Channels: │ Channels: 96, 192, 384, 768
│ 96→192→384→768 │
└────┬──┬──┬──┬───┘
│ │ │ │
│ │ │ └──────────────────────┐
│ │ └──────────────┐ │
│ └──────┐ │ │
│ │ │ │
│ ▼ ▼ ▼
┌────┴─────────────────────────────────┐
│ Swin Decoder │ Upsampling with skip connections
│ 4 stages │ Scales: 1/32→1/16→1/8→1/4→1/1
│ Channels: 768→384→192→96→48→2 │
└────────────────┬─────────────────────┘
│ Correction (B,2,H,W)
┌─────┐
│ ADD │ ◄─── Dirty Input (residual connection)
└──┬──┘
Output: Clean Reconstruction (B,2,H,W)
```

## Installation

This project uses [uv](https://github.com/astral-sh/uv) for dependency management.

1. **Install uv** (if not already installed):
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

2. **Sync Dependencies**:
Navigate to the `holopaswin` directory and run:
```bash
uv sync
```
This will create a virtual environment and install all locked dependencies from `uv.lock`.

3. **Training**:
To start training, run:
```bash
uv run src/train.py
```

## Development

## Development Setup
- **HOLO-PASWIN v2** builds upon Swin Transformer U-Net architecture.
- It accepts Hologram Intensity and outputs Complex Object (Phase & Amplitude).
- Dataset is loaded from efficient Parquet files.

### Installing Git Hooks

Expand Down
3 changes: 0 additions & 3 deletions notebooks/holopaswin_exp1.ipynb

This file was deleted.

3 changes: 0 additions & 3 deletions notebooks/holopaswin_exp2.ipynb

This file was deleted.

9 changes: 9 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ dependencies = [
"scikit-image>=0.20.0",
"matplotlib>=3.7.0",
"tqdm>=4.65.0",
"pandas>=2.3.3",
"pyarrow>=22.0.0",
]

[project.optional-dependencies]
Expand Down Expand Up @@ -110,3 +112,10 @@ module = [
]
ignore_missing_imports = true

[dependency-groups]
dev = [
"mypy>=1.19.0",
"ruff>=0.14.9",
"types-tqdm>=4.67.0.20250809",
]

76 changes: 76 additions & 0 deletions results/ablation_study/ablation_study_20260202_235539.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
Starting ablation study at Mon Feb 2 23:55:39 CET 2026
This will take approximately 20 hours to complete.
Logging to: ablation_study_20260202_235539.log

[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] SEQUENTIAL ABLATION STUDY EXECUTION
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] Output directory: results/ablation_final
[2026-02-02 22:55:40] Start time: 2026-02-02 22:55:40
[2026-02-02 22:55:40]
[2026-02-02 22:55:40]
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] EXPERIMENT 1: Loss Component Ablation
[2026-02-02 22:55:40] Expected duration: ~10 hours
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] Starting: ablation_loss_components.py
[2026-02-02 22:55:40] Args: --output-dir results/ablation_final/loss_components
[2026-02-02 22:55:40] Log file: results/ablation_final/loss_components.log
[2026-02-03 01:01:36] ✓ ablation_loss_components.py completed successfully (125.9 min)
[2026-02-03 01:01:36]
[2026-02-03 01:01:36] ================================================================================
[2026-02-03 01:01:36] EXPERIMENT 2: Loss Weight Sensitivity
[2026-02-03 01:01:36] Expected duration: ~3-4 hours
[2026-02-03 01:01:36] ================================================================================
[2026-02-03 01:01:36] Starting: ablation_loss_weights_sensitivity.py
[2026-02-03 01:01:36] Args: --output-dir results/ablation_final/loss_weights
[2026-02-03 01:01:36] Log file: results/ablation_final/loss_weights.log
[2026-02-03 03:02:05] ✓ ablation_loss_weights_sensitivity.py completed successfully (120.5 min)
[2026-02-03 03:02:05]
[2026-02-03 03:02:05] ================================================================================
[2026-02-03 03:02:05] EXPERIMENT 3: Architecture Ablation
[2026-02-03 03:02:05] Expected duration: ~8 hours
[2026-02-03 03:02:05] ================================================================================
[2026-02-03 03:02:05] Starting: ablation_architecture.py
[2026-02-03 03:02:05] Args: --output-dir results/ablation_final/architecture
[2026-02-03 03:02:05] Log file: results/ablation_final/architecture.log
[2026-02-03 07:05:09] ✓ ablation_architecture.py completed successfully (243.1 min)
[2026-02-03 07:05:09]
[2026-02-03 07:05:09] ================================================================================
[2026-02-03 07:05:09] EXPERIMENT 4: Robustness Tests
[2026-02-03 07:05:09] Expected duration: ~1 hour
[2026-02-03 07:05:09] ================================================================================
[2026-02-03 07:05:09] Starting: ablation_robustness.py
[2026-02-03 07:05:09] Args: --model-path results/ablation_final/loss_components/full_model_best.pth --output-dir results/ablation_final/robustness
[2026-02-03 07:05:09] Log file: results/ablation_final/robustness.log
[2026-02-03 07:05:16] ✗ ablation_robustness.py failed with code 1 (0.1 min)
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] ================================================================================
[2026-02-03 07:05:16] EXECUTION SUMMARY
[2026-02-03 07:05:16] ================================================================================
[2026-02-03 07:05:16] Total time: 8.16 hours (489.6 minutes)
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] ✓ SUCCESS Loss Components 125.9 min
[2026-02-03 07:05:16] ✓ SUCCESS Loss Weights 120.5 min
[2026-02-03 07:05:16] ✓ SUCCESS Architecture 243.1 min
[2026-02-03 07:05:16] ✗ FAILED Robustness 0.1 min
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] Results saved to:
[2026-02-03 07:05:16] - Loss components: results/ablation_final/loss_components
[2026-02-03 07:05:16] - Loss weights: results/ablation_final/loss_weights
[2026-02-03 07:05:16] - Architecture: results/ablation_final/architecture
[2026-02-03 07:05:16] - Robustness: results/ablation_final/robustness
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] Next steps:
[2026-02-03 07:05:16] 1. Review CSV files in each results directory
[2026-02-03 07:05:16] 2. Copy LaTeX tables to article/src/tables/
[2026-02-03 07:05:16] 3. Copy z_mismatch_plot.png to article/src/figs/
[2026-02-03 07:05:16] 4. Update article tables with actual values
[2026-02-03 07:05:16] 5. Compile article with pdflatex
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] End time: 2026-02-03 07:05:16
[2026-02-03 07:05:16] ================================================================================

Ablation study completed at Tue Feb 3 08:05:16 CET 2026
Results are in: results/ablation_final/
Shell log saved to: ablation_study_20260202_235539.log
63 changes: 63 additions & 0 deletions results/ablation_study/architecture.log

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions results/ablation_study/architecture/architecture_ablation.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
model,model_id,num_parameters,inference_time_ms,training_time_sec,best_val_loss,amp_ssim,phase_ssim,amp_psnr,phase_psnr,freq_ssim,bs_ratio
"HoloPASWIN (Swin-Tiny, Pretrained, Residual)",swin_pretrained_residual,30883820,12.147433757781982,1386.3456587791443,0.18496015738873256,0.8970394458833664,0.937056549917808,37.65529804884799,43.58432071069855,0.14945638298392874,0.6815521614325624
"ResNet-18 U-Net (Pretrained, Residual)",resnet18_pretrained_residual,15559842,9.034426212310791,958.1014878749847,0.4587241330790141,0.47471485622771775,0.7523955224838984,29.249287768628708,41.07767062065633,-0.10465396731275439,0.7102488699038664
"HoloPASWIN (Swin-Tiny, Pretrained, Direct)",swin_pretrained_direct,30883820,13616.046197414398,1613.4761559963226,0.1556178300626694,0.9704758093909414,0.958927794765349,41.20732633444617,44.604655123042804,0.2502256519645422,0.5659946480225171
"HoloPASWIN (Swin-Tiny, From Scratch, Residual)",swin_scratch_residual,30883820,39.06041860580444,8441.657612085342,0.14487511510886844,0.9526423536533443,0.9567646939222026,38.84532393151695,42.090110098302475,0.28041522251086287,1.2115895154495393
15 changes: 15 additions & 0 deletions results/ablation_study/architecture/architecture_table.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
\begin{table}[h]
\centering
\caption{Architecture ablation study comparing Swin Transformer vs ResNet-18, residual vs direct reconstruction, and pretrained vs from-scratch training.}
\label{tab:architecture_ablation}
\scriptsize
\begin{tabular}{@{}lcccccc@{}}
\toprule
\textbf{Model} & \textbf{Params (M)} & \textbf{Inf. Time (ms)} & \textbf{Phase PSNR} & \textbf{Phase SSIM} & \textbf{B/S Ratio} \\ \midrule
HoloPASWIN (Swin-Tiny, Pretrained, Residual) & 30.88 & 12.1 & 43.58 & 0.9371 & 0.6816 \\
ResNet-18 U-Net (Pretrained, Residual) & 15.56 & 9.0 & 41.08 & 0.7524 & 0.7102 \\
HoloPASWIN (Swin-Tiny, Pretrained, Direct) & 30.88 & 13616.0 & 44.60 & 0.9589 & 0.5660 \\
HoloPASWIN (Swin-Tiny, From Scratch, Residual) & 30.88 & 39.1 & 42.09 & 0.9568 & 1.2116 \\
\bottomrule
\end{tabular}
\end{table}
63 changes: 63 additions & 0 deletions results/ablation_study/loss_components.log

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions results/ablation_study/loss_components/ablation_results.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
config_name,config_id,training_time_sec,best_val_loss,amp_ssim,phase_ssim,amp_psnr,phase_psnr,freq_ssim,bs_ratio
Full Model (Baseline),full_model,1396.5777411460876,0.1689160324278332,0.9591731344876756,0.9679168719273492,37.72111893437823,45.57350964001303,0.212460134640332,0.374627482566622
Full - L_freq,no_freq,1413.2068510055542,0.026857876617993628,0.7303544944024373,0.9655956369427163,34.74318675465086,46.574444171130914,-0.022423141127542526,0.5300978468731046
Full - L_phy,no_phy,1594.3169980049133,0.1562851546775727,0.8704455189791516,0.961978000050189,37.17501457953428,44.13533834375469,0.2285210327001943,0.7219058168270895
Only L_complex,only_complex,1569.116487979889,0.021731258029975588,0.6296047793003886,0.9713036532540739,33.87423366601785,46.83406757897833,-0.07376106024671542,0.5267030513214488
"Pure Spatial (no L_freq, no L_phy)",pure_spatial,1395.5910940170288,0.024972101791747033,0.6252144627465249,0.9525428230300735,33.29202170586924,44.721528451134866,-0.06412226380691187,0.6361389030071516
15 changes: 15 additions & 0 deletions results/ablation_study/loss_components/ablation_table.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
\begin{table}[h]
\centering
\caption{Loss function component ablation study. All models trained for 5 epochs on 25,000 samples.}
\label{tab:loss_component_ablation}
\begin{tabular}{@{}lcccccc@{}}
\toprule
\textbf{Configuration} & \textbf{Amp SSIM} & \textbf{Phase SSIM} & \textbf{Phase PSNR} & \textbf{Freq SSIM} & \textbf{B/S Ratio} \\ \midrule
Full Model (Baseline) & 0.9592 & 0.9679 & 45.57 & 0.2125 & 0.3746 \\
Full - L_freq & 0.7304 & 0.9656 & 46.57 & -0.0224 & 0.5301 \\
Full - L_phy & 0.8704 & 0.9620 & 44.14 & 0.2285 & 0.7219 \\
Only L_complex & 0.6296 & 0.9713 & 46.83 & -0.0738 & 0.5267 \\
Pure Spatial (no L_freq, no L_phy) & 0.6252 & 0.9525 & 44.72 & -0.0641 & 0.6361 \\
\bottomrule
\end{tabular}
\end{table}
4 changes: 4 additions & 0 deletions results/ablation_study/loss_components/full_model_history.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
train_loss,val_loss,epoch
0.3789018812417984,0.23248187369770473,1
0.23278295228481294,0.18489884052957808,2
0.1911716034412384,0.1689160324278332,3
4 changes: 4 additions & 0 deletions results/ablation_study/loss_components/no_freq_history.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
train_loss,val_loss,epoch
0.0881531357705593,0.03953465228042905,1
0.03408360904753208,0.035909083272729604,2
0.0296357734978199,0.026857876617993628,3
4 changes: 4 additions & 0 deletions results/ablation_study/loss_components/no_phy_history.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
train_loss,val_loss,epoch
0.3440481254577637,0.21518866741468037,1
0.18709273314476013,0.1647950524375552,2
0.16642933180332184,0.1562851546775727,3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
train_loss,val_loss,epoch
0.06533894625306129,0.030536581067338822,1
0.024858536159992218,0.021731258029975588,2
0.020725958310067655,0.023033877036401203,3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
train_loss,val_loss,epoch
0.0922015791118145,0.04076199269010907,1
0.03314999188482761,0.03344916005337995,2
0.02780363717675209,0.024972101791747033,3
45 changes: 45 additions & 0 deletions results/ablation_study/loss_weights.log

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions results/ablation_study/loss_weights/lambda_sensitivity.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
config,lambda_phy,amp_ssim,phase_ssim,amp_psnr,phase_psnr,freq_ssim,bs_ratio
No Physics (λ=0.0),0.0,0.8362126284857192,0.9485394833479281,36.56277850857484,43.27810880819259,0.19819815184803266,0.8650377859031001
Current (λ=0.1),0.1,0.9277890965142687,0.9695644435414934,38.426569654699215,45.90852256750022,0.23131856952639637,0.47128404917255523
High Physics (λ=0.2),0.2,0.9040665044904769,0.9635805658961512,38.69888800668452,45.41432580026462,0.2308427794923376,0.49929088282008327
4 changes: 4 additions & 0 deletions results/ablation_study/loss_weights/weight_sensitivity.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
config,final_val_loss
Amp-heavy (0.5/0.2/0.15/0.15),0.1537831380726799
Balanced (0.4/0.2/0.2/0.2) [Current],0.17710744506782955
Phase-heavy (0.3/0.3/0.2/0.2),0.18449455830785963
68 changes: 68 additions & 0 deletions results/ablation_study/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] SEQUENTIAL ABLATION STUDY EXECUTION
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] Output directory: results/ablation_final
[2026-02-02 22:55:40] Start time: 2026-02-02 22:55:40
[2026-02-02 22:55:40]
[2026-02-02 22:55:40]
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] EXPERIMENT 1: Loss Component Ablation
[2026-02-02 22:55:40] Expected duration: ~10 hours
[2026-02-02 22:55:40] ================================================================================
[2026-02-02 22:55:40] Starting: ablation_loss_components.py
[2026-02-02 22:55:40] Args: --output-dir results/ablation_final/loss_components
[2026-02-02 22:55:40] Log file: results/ablation_final/loss_components.log
[2026-02-03 01:01:36] ✓ ablation_loss_components.py completed successfully (125.9 min)
[2026-02-03 01:01:36]
[2026-02-03 01:01:36] ================================================================================
[2026-02-03 01:01:36] EXPERIMENT 2: Loss Weight Sensitivity
[2026-02-03 01:01:36] Expected duration: ~3-4 hours
[2026-02-03 01:01:36] ================================================================================
[2026-02-03 01:01:36] Starting: ablation_loss_weights_sensitivity.py
[2026-02-03 01:01:36] Args: --output-dir results/ablation_final/loss_weights
[2026-02-03 01:01:36] Log file: results/ablation_final/loss_weights.log
[2026-02-03 03:02:05] ✓ ablation_loss_weights_sensitivity.py completed successfully (120.5 min)
[2026-02-03 03:02:05]
[2026-02-03 03:02:05] ================================================================================
[2026-02-03 03:02:05] EXPERIMENT 3: Architecture Ablation
[2026-02-03 03:02:05] Expected duration: ~8 hours
[2026-02-03 03:02:05] ================================================================================
[2026-02-03 03:02:05] Starting: ablation_architecture.py
[2026-02-03 03:02:05] Args: --output-dir results/ablation_final/architecture
[2026-02-03 03:02:05] Log file: results/ablation_final/architecture.log
[2026-02-03 07:05:09] ✓ ablation_architecture.py completed successfully (243.1 min)
[2026-02-03 07:05:09]
[2026-02-03 07:05:09] ================================================================================
[2026-02-03 07:05:09] EXPERIMENT 4: Robustness Tests
[2026-02-03 07:05:09] Expected duration: ~1 hour
[2026-02-03 07:05:09] ================================================================================
[2026-02-03 07:05:09] Starting: ablation_robustness.py
[2026-02-03 07:05:09] Args: --model-path results/ablation_final/loss_components/full_model_best.pth --output-dir results/ablation_final/robustness
[2026-02-03 07:05:09] Log file: results/ablation_final/robustness.log
[2026-02-03 07:05:16] ✗ ablation_robustness.py failed with code 1 (0.1 min)
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] ================================================================================
[2026-02-03 07:05:16] EXECUTION SUMMARY
[2026-02-03 07:05:16] ================================================================================
[2026-02-03 07:05:16] Total time: 8.16 hours (489.6 minutes)
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] ✓ SUCCESS Loss Components 125.9 min
[2026-02-03 07:05:16] ✓ SUCCESS Loss Weights 120.5 min
[2026-02-03 07:05:16] ✓ SUCCESS Architecture 243.1 min
[2026-02-03 07:05:16] ✗ FAILED Robustness 0.1 min
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] Results saved to:
[2026-02-03 07:05:16] - Loss components: results/ablation_final/loss_components
[2026-02-03 07:05:16] - Loss weights: results/ablation_final/loss_weights
[2026-02-03 07:05:16] - Architecture: results/ablation_final/architecture
[2026-02-03 07:05:16] - Robustness: results/ablation_final/robustness
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] Next steps:
[2026-02-03 07:05:16] 1. Review CSV files in each results directory
[2026-02-03 07:05:16] 2. Copy LaTeX tables to article/src/tables/
[2026-02-03 07:05:16] 3. Copy z_mismatch_plot.png to article/src/figs/
[2026-02-03 07:05:16] 4. Update article tables with actual values
[2026-02-03 07:05:16] 5. Compile article with pdflatex
[2026-02-03 07:05:16]
[2026-02-03 07:05:16] End time: 2026-02-03 07:05:16
[2026-02-03 07:05:16] ================================================================================
Loading