Skip to content

Commit ac85fc6

Browse files
KI7MTclaude
andcommitted
Upgrade to V22-gamma + PhysicsOverrideLayer (4.0.0)
Replace V20 model/tests with V22-gamma (17 features, safetensors, PhysicsOverrideLayer deterministic clamp). 29 tests (18 KI7MT + 11 TST-900) replace the V20 62-test suite. Python floor raised to 3.10. Bundled example_custom_paths.json with --example CLI flag. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f94c889 commit ac85fc6

32 files changed

Lines changed: 2088 additions & 14267 deletions

README.md

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,46 @@
11
# ionis-validate
22

3-
Validation suite for the IONIS V20 HF propagation model. Run 62 physics
4-
tests, predict SNR for any HF path, or batch-test your own paths — all
5-
from the command line or a browser UI, on any platform.
3+
Validation suite for the IONIS V22-gamma + PhysicsOverrideLayer HF propagation
4+
model. Run 29 physics tests (18 KI7MT operator-grounded + 11 band x time
5+
discrimination), predict SNR for any HF path, or batch-test your own paths —
6+
all from the command line or a browser UI, on any platform.
67

78
IONIS (Ionospheric Neural Inference System) predicts HF radio signal
8-
strength from WSPR, RBN, and contest data. The V20 model was trained on
9-
31 million propagation observations spanning 2005-2025.
9+
strength from WSPR, RBN, and contest data. The V22-gamma model was trained on
10+
38.7 million propagation observations spanning 2008-2026, with a deterministic
11+
PhysicsOverrideLayer for high-band night closure.
1012

1113
## Install
1214

1315
```
1416
pip install ionis-validate
1517
```
1618

17-
Requires Python 3.9+ and PyTorch 2.0+. Works on Windows, macOS, and Linux.
19+
Requires Python 3.10+ and PyTorch 2.0+. Works on Windows, macOS, and Linux.
1820

1921
## Quick Start
2022

2123
```bash
2224
# Show model and system info
2325
ionis-validate info
2426

25-
# Run the full 62-test validation suite
27+
# Run the full 29-test validation suite
2628
ionis-validate test
2729

2830
# Predict SNR for a single path
2931
ionis-validate predict \
3032
--tx-grid FN20 --rx-grid IO91 --band 20m \
31-
--sfi 150 --kp 2 --hour 14 --month 6
33+
--sfi 150 --kp 2 --hour 14 --month 6 --day-of-year 172
34+
35+
# Acid test: 10m EU path at night (override should fire)
36+
ionis-validate predict \
37+
--tx-grid DN46 --rx-grid JN48 --band 10m \
38+
--sfi 150 --kp 2 --hour 2 --month 2 --day-of-year 45
3239
```
3340

3441
## Browser UI
3542

36-
A point-and-click dashboard wrapping every command. Requires Python 3.10+.
43+
A point-and-click dashboard wrapping every command.
3744

3845
```
3946
pip install "ionis-validate[ui]"
@@ -48,19 +55,19 @@ Custom, Report, and Info.
4855
Define a set of paths in a JSON file and run them all at once:
4956

5057
```bash
58+
# Run the bundled example (2 easy, 2 medium, 2 hard)
59+
ionis-validate custom --example
60+
61+
# Run your own paths
5162
ionis-validate custom my_paths.json
5263
```
5364

5465
See the [Custom Path Tests](https://ionis-ai.com/testing/custom-paths/)
55-
documentation for the JSON format.
66+
documentation for the JSON format. V22 adds `day_of_year` and an OVR
67+
(override) column to the output.
5668

5769
## Beta Testing
5870

59-
If you are testing V20, follow the step-by-step
60-
[Beta Test Plan](https://ionis-ai.com/testing/beta-test-plan/) (Test-1
61-
through Test-9). It tells you exactly what to run, what to expect, and
62-
how to submit your results.
63-
6471
Generate a structured report for filing as a GitHub Issue:
6572

6673
```bash
@@ -82,7 +89,6 @@ GPL-3.0-or-later. See [LICENSE](LICENSE).
8289
## Links
8390

8491
- Documentation: <https://ionis-ai.com/testing/>
85-
- Beta Test Plan: <https://ionis-ai.com/testing/beta-test-plan/>
8692
- Source: <https://github.com/IONIS-AI/ionis-validate>
8793
- Issues: <https://github.com/IONIS-AI/ionis-validate/issues>
8894
- IONIS Project: <https://ionis-ai.com/>

pyproject.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
[project]
22
name = "ionis-validate"
3-
version = "0.3.0"
4-
description = "IONIS V20 — HF Propagation Model Validation Suite"
3+
version = "4.0.0"
4+
description = "IONIS V22-gamma + PhysicsOverrideLayer — HF Propagation Model Validation Suite"
55
readme = "README.md"
66
license = {text = "GPL-3.0-or-later"}
77
authors = [{name = "Greg Beam, KI7MT"}]
8-
requires-python = ">=3.9"
8+
requires-python = ">=3.10"
99
dependencies = [
1010
"torch>=2.0",
1111
"numpy>=1.24",
12+
"safetensors>=0.4",
1213
]
1314
classifiers = [
1415
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
1516
"Programming Language :: Python :: 3",
16-
"Programming Language :: Python :: 3.9",
1717
"Programming Language :: Python :: 3.10",
1818
"Programming Language :: Python :: 3.11",
1919
"Programming Language :: Python :: 3.12",
20+
"Programming Language :: Python :: 3.13",
2021
"Operating System :: OS Independent",
2122
"Topic :: Scientific/Engineering :: Physics",
2223
]

src/ionis_validate/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
"""IONIS V20 HF Propagation Model Validation Suite"""
2-
__version__ = "0.3.0"
1+
"""IONIS V22-gamma + PhysicsOverrideLayer — HF Propagation Model Validation Suite"""
2+
__version__ = "4.0.0"
33

44
import os as _os
55

src/ionis_validate/cli.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,23 @@
2626
}
2727

2828
USAGE = """\
29-
ionis-validate — IONIS V20 HF Propagation Model Validation Suite
29+
ionis-validate — IONIS V22-gamma + PhysicsOverrideLayer Validation Suite
3030
3131
Usage:
3232
ionis-validate <command> [options]
3333
3434
Commands:
35-
test Run the full 62-test validation suite
36-
predict Predict SNR for a single HF path
37-
custom Run batch predictions from a JSON file
35+
test Run the full 29-test validation suite (KI7MT + TST-900)
36+
predict Predict SNR for a single HF path (with PhysicsOverrideLayer)
37+
custom Run batch predictions from a JSON file (--example for demo)
3838
report Generate a beta test report for GitHub Issues
3939
info Show model and system information
4040
ui Launch browser-based validation dashboard
4141
4242
Examples:
4343
ionis-validate test
44-
ionis-validate predict --tx-grid FN20 --rx-grid IO91 --band 20m --sfi 150 --kp 2 --hour 14 --month 6
44+
ionis-validate predict --tx-grid FN20 --rx-grid IO91 --band 20m --sfi 150 --kp 2 --hour 14 --month 6 --day-of-year 172
45+
ionis-validate custom --example
4546
ionis-validate custom my_paths.json
4647
ionis-validate info
4748
Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
{
2-
"version": "v20",
3-
"phase": "Production",
4-
"checkpoint": "ionis_v20.pth",
2+
"version": "v22",
3+
"variant": "gamma",
4+
"phase": "Production (Phase 4.0)",
5+
"checkpoint": "ionis_v22_gamma.safetensors",
56

67
"model": {
78
"architecture": "IonisGate",
8-
"dnn_dim": 11,
9+
"dnn_dim": 15,
910
"hidden_dim": 256,
1011
"sidecar_hidden": 8,
11-
"input_dim": 13,
12-
"sfi_idx": 11,
13-
"kp_penalty_idx": 12,
12+
"input_dim": 17,
13+
"sfi_idx": 15,
14+
"kp_penalty_idx": 16,
1415
"gate_init_bias": -0.693
1516
},
1617

@@ -39,7 +40,9 @@
3940
"features": [
4041
"distance", "freq_log", "hour_sin", "hour_cos",
4142
"az_sin", "az_cos", "lat_diff", "midpoint_lat",
42-
"season_sin", "season_cos", "day_night_est",
43+
"season_sin", "season_cos", "vertex_lat",
44+
"tx_solar_dep", "rx_solar_dep",
45+
"freq_x_tx_dark", "freq_x_rx_dark",
4346
"sfi", "kp_penalty"
4447
],
4548

@@ -70,9 +73,10 @@
7073
},
7174

7275
"validation": {
73-
"pearson_min": 0.48,
74-
"kp_storm_min": 3.0,
75-
"sfi_benefit_min": 0.4
76+
"pearson_min": 0.46,
77+
"kp_storm_min": 1.0,
78+
"sfi_benefit_min": 0.4,
79+
"tst900_min": 8
7680
},
7781

7882
"clickhouse": {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"description": "Example custom paths — 2 easy, 2 medium, 2 hard",
3+
"conditions": {
4+
"sfi": 150,
5+
"kp": 2
6+
},
7+
"paths": [
8+
{
9+
"label": "Easy: 20m NA-EU midday summer",
10+
"tx_grid": "FN31",
11+
"rx_grid": "IO91",
12+
"band": "20m",
13+
"hour": 14,
14+
"month": 6,
15+
"day_of_year": 172,
16+
"expect_open": true,
17+
"mode": "FT8"
18+
},
19+
{
20+
"label": "Easy: 40m domestic NA night",
21+
"tx_grid": "DN13",
22+
"rx_grid": "EM73",
23+
"band": "40m",
24+
"hour": 4,
25+
"month": 1,
26+
"day_of_year": 15,
27+
"expect_open": true,
28+
"mode": "FT8"
29+
},
30+
{
31+
"label": "Medium: 15m NA-JA winter midday",
32+
"tx_grid": "CN87",
33+
"rx_grid": "PM95",
34+
"band": "15m",
35+
"hour": 22,
36+
"month": 12,
37+
"day_of_year": 355,
38+
"expect_open": true,
39+
"mode": "FT8"
40+
},
41+
{
42+
"label": "Medium: 20m NA-VK evening",
43+
"tx_grid": "FM18",
44+
"rx_grid": "QF56",
45+
"band": "20m",
46+
"hour": 10,
47+
"month": 3,
48+
"day_of_year": 80,
49+
"expect_open": true
50+
},
51+
{
52+
"label": "Hard: 10m EU night — override should fire",
53+
"tx_grid": "DN46",
54+
"rx_grid": "JN48",
55+
"band": "10m",
56+
"hour": 2,
57+
"month": 2,
58+
"day_of_year": 45,
59+
"expect_open": false,
60+
"mode": "FT8"
61+
},
62+
{
63+
"label": "Hard: 160m transatlantic winter night",
64+
"tx_grid": "FN42",
65+
"rx_grid": "IO81",
66+
"band": "160m",
67+
"hour": 3,
68+
"month": 1,
69+
"day_of_year": 15,
70+
"sfi": 80,
71+
"kp": 1,
72+
"expect_open": true
73+
}
74+
]
75+
}
-806 KB
Binary file not shown.
805 KB
Binary file not shown.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"version": "v22",
3+
"variant": "gamma",
4+
"architecture": "IonisGate",
5+
"phase": "Production (Phase 4.0)",
6+
"date_range": "2008-03-11 to 2026-02-21",
7+
"sample_size": 38760089,
8+
"epoch": 100,
9+
"val_rmse": 0.8346196287579953,
10+
"val_pearson": 0.4591027498245239,
11+
"sfi_benefit": 0.48183250427246094,
12+
"storm_cost": 2.8148746490478516,
13+
"rbn_full_sample": 0,
14+
"tst900_score": "9/11",
15+
"ki7mt_hard_pass": "16/17 raw, 17/17 with PhysicsOverrideLayer",
16+
"physics_override": "IF freq>=21MHz AND tx_solar<-6 AND rx_solar<-6 AND pred>-1.0sigma THEN clamp -1.0sigma",
17+
"dnn_dim": 15,
18+
"sidecar_hidden": 8,
19+
"input_dim": 17,
20+
"features": [
21+
"distance", "freq_log", "hour_sin", "hour_cos",
22+
"az_sin", "az_cos", "lat_diff", "midpoint_lat",
23+
"season_sin", "season_cos", "vertex_lat",
24+
"tx_solar_dep", "rx_solar_dep",
25+
"freq_x_tx_dark", "freq_x_rx_dark",
26+
"sfi", "kp_penalty"
27+
],
28+
"v16_physics_laws": [
29+
"IonisGate architecture (gates from trunk output 256-dim)",
30+
"HuberLoss(delta=1.0)",
31+
"Gate variance loss",
32+
"Defibrillator init (weights 0.8-1.2, fc2.bias=-10)",
33+
"Weight clamp [0.5, 2.0] after every step",
34+
"Data recipe: WSPR + DXpedition + Contest (no RBN Full)"
35+
]
36+
}

0 commit comments

Comments
 (0)