yushuang88 commited on
Commit
8f89e30
·
verified ·
1 Parent(s): 31babe4

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ results/training_curves.png filter=lfs diff=lfs merge=lfs -text
37
+ results/validation_examples.png filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ tags:
6
+ - OneScience
7
+ - fluid-dynamics
8
+ library_name: pytorch
9
+ ---
10
+
11
+ # LiNO
12
+
13
+ ## Model
14
+
15
+ This package reproduces the one-dimensional viscous Burgers final-state prediction experiment. The trained checkpoint is `weight/best_model.pth`; model code, configuration, training, inference, and visualization scripts are included. The package was trained once; reported numbers are not guarantees for another run.
16
+
17
+ ## Data
18
+
19
+ Download only the needed file from [OneScience/fno](https://www.modelscope.cn/datasets/OneScience/fno) with `modelscope download OneScience/fno data/burgers_data_R10.mat --repo-type dataset --local_dir ./data`. The model reads `data/data/burgers_data_R10.mat`.
20
+
21
+ Data provenance: [https://www.modelscope.cn/datasets/OneScience/fno](https://www.modelscope.cn/datasets/OneScience/fno).
22
+
23
+ ## Usage
24
+
25
+ ```bash
26
+ hf download OneScience-Group/LiNO --local-dir ./LiNO
27
+ cd LiNO
28
+ pip install -r requirements.txt
29
+ python scripts/inference.py
30
+ python scripts/result.py
31
+ ```
32
+
33
+ For training, run `python scripts/train.py` after installing the appropriate accelerator-enabled PyTorch environment and downloading the data above. See `config/config.yaml` for experiment parameters. Preserve the included checkpoint before retraining.
34
+
35
+ ## Result and citation
36
+
37
+ validation relative L2: 0.00816638; paper Table 1: 0.0109. See `results/` for the recorded outputs and the [original paper or data page](https://arxiv.org/abs/2606.03262) for the research context. The dataset license, where not separately stated by its author, must not be inferred from the code license.
config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "lino_burgers",
3
+ "architectures": [
4
+ "LiNO"
5
+ ],
6
+ "framework": "pytorch",
7
+ "experiment": "one-dimensional viscous Burgers final-state prediction",
8
+ "checkpoint": "weight/best_model.pth",
9
+ "dataset": "OneScience/fno"
10
+ }
config/config.yaml ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ seed: 42
2
+ data:
3
+ directory: data/data
4
+ filename: burgers_data_R10.mat
5
+ input_key: a
6
+ target_key: u
7
+ expected_shape: [2048, 8192]
8
+ resolution: 256
9
+ n_train: 1600
10
+ n_val: 448
11
+ interpolation: linear
12
+ normalization_eps: 1.0e-5
13
+ model:
14
+ in_channels: 2
15
+ out_channels: 1
16
+ width: 128
17
+ depth: 8
18
+ scattering: efficient
19
+ rate_range: 0.25
20
+ eps: 1.0e-6
21
+ training:
22
+ epochs: 500
23
+ batch_size: 4
24
+ learning_rate: 0.001
25
+ weight_decay: 1.0e-5
26
+ betas: [0.9, 0.999]
27
+ optimizer_eps: 1.0e-8
28
+ scheduler_step: 5
29
+ scheduler_gamma: 0.96
30
+ grad_clip: 1.0
31
+ num_workers: 0
32
+ log_interval: 50
33
+ device: cuda
34
+ checkpoint: weight/best_model.pth
35
+ last_checkpoint: weight/last_model.pth
36
+ inference:
37
+ batch_size: 4
38
+ device: cuda
39
+ results:
40
+ directory: results
model/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .lino import LiNO
2
+
3
+ __all__ = ["LiNO"]
model/lino.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Independent implementation of LiNO, arXiv:2606.03262, Eqs. (5)-(44).
2
+
3
+ Only the efficient scattering variant for one-dimensional fields is implemented.
4
+ Unspecified numerical choices are documented in results/reproduction_spec.md.
5
+ """
6
+
7
+ import torch
8
+ from torch import nn
9
+ from torch.nn import functional as F
10
+
11
+
12
+ class AdaptiveMirror(nn.Module):
13
+ def __init__(self, width, eps):
14
+ super().__init__()
15
+ self.direction = nn.Linear(width, width)
16
+ self.eps = eps
17
+
18
+ def forward(self, field):
19
+ normal = F.normalize(self.direction(field), dim=-1, eps=self.eps)
20
+ component = (field * normal).sum(-1, keepdim=True)
21
+ return field - 2 * component * normal
22
+
23
+
24
+ class AdaptiveRefraction(nn.Module):
25
+ def __init__(self, width, rate_range, eps):
26
+ super().__init__()
27
+ self.direction = nn.Linear(width, width)
28
+ self.contrast = nn.Parameter(torch.zeros(()))
29
+ self.rate_range, self.eps = rate_range, eps
30
+
31
+ def forward(self, field):
32
+ normal = F.normalize(self.direction(field), dim=-1, eps=self.eps)
33
+ normal_component = (field * normal).sum(-1, keepdim=True) * normal
34
+ return field + self.rate_range * self.contrast.tanh() * normal_component
35
+
36
+
37
+ class EfficientScattering(nn.Module):
38
+ def __init__(self, width, eps):
39
+ super().__init__()
40
+ self.query = nn.Linear(width, width, bias=False)
41
+ self.key = nn.Linear(width, width, bias=False)
42
+ self.value = nn.Linear(width, width, bias=False)
43
+ self.coordinates = nn.Sequential(nn.Linear(1, width), nn.GELU(), nn.Linear(width, width))
44
+ self.diffusion = nn.Conv1d(width, width, 3, padding=1, groups=width, bias=False)
45
+ self.local_projection = nn.Linear(width, width, bias=False)
46
+ self.local_logit = nn.Parameter(torch.tensor(-1.0))
47
+ self.log_strength = nn.Parameter(torch.tensor(-2.0))
48
+ self.scale, self.eps = width ** -0.5, eps
49
+
50
+ def forward(self, field, grid):
51
+ position = self.coordinates(grid)
52
+ query = F.elu(self.query(field) * self.scale + position) + 1
53
+ key = F.elu(self.key(field) * self.scale + position) + 1
54
+ value = self.value(field)
55
+ # Eq. (33): aggregate over space before contracting each query.
56
+ summary = key.transpose(1, 2) @ value
57
+ numerator = query @ summary
58
+ denominator = (query * key.sum(1, keepdim=True)).sum(-1, keepdim=True)
59
+ global_average = numerator / (denominator + self.eps)
60
+ local_field = self.diffusion(field.transpose(1, 2)).transpose(1, 2)
61
+ local_average = self.local_projection(local_field)
62
+ beta = self.local_logit.sigmoid()
63
+ average = (1 - beta) * global_average + beta * local_average
64
+ return self.log_strength.exp() * (average - field)
65
+
66
+
67
+ class LightBlock(nn.Module):
68
+ def __init__(self, width, rate_range, eps):
69
+ super().__init__()
70
+ self.before_light = nn.LayerNorm(width)
71
+ self.before_ffn = nn.LayerNorm(width)
72
+ self.mirror = AdaptiveMirror(width, eps)
73
+ self.refraction = AdaptiveRefraction(width, rate_range, eps)
74
+ self.scattering = EfficientScattering(width, eps)
75
+ self.gate = nn.Sequential(nn.Linear(width, 2 * width), nn.GELU(), nn.Linear(2 * width, 3))
76
+ self.mix_projection = nn.Linear(width, width)
77
+ self.ffn = nn.Sequential(nn.Linear(width, 2 * width), nn.GELU(), nn.Linear(2 * width, width))
78
+
79
+ def forward(self, field, grid):
80
+ normalized = self.before_light(field)
81
+ weights = self.gate(normalized.mean(1)).softmax(-1)
82
+ branches = (self.mirror(normalized), self.refraction(normalized), self.scattering(normalized, grid))
83
+ mixture = sum(weights[:, i, None, None] * branch for i, branch in enumerate(branches))
84
+ field = field + self.mix_projection(mixture)
85
+ return field + self.ffn(self.before_ffn(field))
86
+
87
+
88
+ class LiNO(nn.Module):
89
+ """[batch, space, 2] -> [batch, space, 1], normalized field and x input."""
90
+
91
+ def __init__(self, in_channels=2, out_channels=1, width=128, depth=8,
92
+ scattering="efficient", rate_range=0.25, eps=1e-6):
93
+ super().__init__()
94
+ if scattering != "efficient":
95
+ raise ValueError("This experiment requires efficient scattering")
96
+ self.architecture = dict(in_channels=in_channels, out_channels=out_channels,
97
+ width=width, depth=depth, scattering=scattering,
98
+ rate_range=rate_range, eps=eps)
99
+ self.lift = nn.Linear(in_channels, width)
100
+ self.blocks = nn.ModuleList([LightBlock(width, rate_range, eps) for _ in range(depth)])
101
+ self.project = nn.Linear(width, out_channels)
102
+
103
+ def forward(self, inputs):
104
+ if inputs.ndim != 3 or inputs.shape[-1] != self.architecture["in_channels"]:
105
+ raise ValueError(f"Expected [B,N,{self.architecture['in_channels']}], got {inputs.shape}")
106
+ grid = torch.linspace(0, 1, inputs.shape[1], device=inputs.device, dtype=inputs.dtype).view(1, -1, 1)
107
+ field = self.lift(inputs)
108
+ for block in self.blocks:
109
+ field = block(field, grid)
110
+ return self.project(field)
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ torch>=2.0
2
+ numpy>=1.24
3
+ scipy>=1.10
4
+ PyYAML>=6.0
5
+ matplotlib>=3.7
results/error_distribution.png ADDED
results/history.csv ADDED
The diff for this file is too large to render. See raw diff
 
results/metrics.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "n_validation": 448,
3
+ "checkpoint_epoch": 495,
4
+ "best_epoch": 495,
5
+ "validation_relative_l2": 0.00816638395190239,
6
+ "validation_relative_l2_std": 0.0073033287189900875,
7
+ "validation_mse_physical": 5.692711056326516e-05,
8
+ "validation_rmse_physical": 0.00754500599578023,
9
+ "checkpoint_recorded_relative_l2": 0.008166384883224964,
10
+ "reload_metric_absolute_difference": 9.313225746154785e-10,
11
+ "paper_table1_relative_l2": 0.0109,
12
+ "ratio_to_paper": 0.7492095368717788,
13
+ "inference_seconds": 7.967788686975837,
14
+ "checkpoint_sha256": "82ca744dfb18510e680edf20b02213a585c6d859d269a2775c7192be8f67f821",
15
+ "device": "BW"
16
+ }
results/per_sample_metrics.csv ADDED
@@ -0,0 +1,449 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ validation_index,source_index,relative_l2,mse_physical
2
+ 0,1354,0.00711664417758584,2.228247467428446e-06
3
+ 1,1059,0.010785155929625034,4.252611688571051e-06
4
+ 2,1871,0.005162909626960754,3.0164053441694705e-06
5
+ 3,244,0.0052434164099395275,3.2187308534048498e-06
6
+ 4,2007,0.003628770587965846,3.532600430844468e-06
7
+ 5,830,0.015044189989566803,0.00023930144379846752
8
+ 6,1589,0.008218521252274513,3.109377212240361e-05
9
+ 7,1842,0.00549214007332921,2.5418987661396386e-06
10
+ 8,1517,0.012739766389131546,6.365851731970906e-06
11
+ 9,669,0.00572951091453433,4.729304237116594e-06
12
+ 10,789,0.010234244167804718,2.6733359845820814e-05
13
+ 11,848,0.019002048298716545,0.00015161947521846741
14
+ 12,1350,0.003998751286417246,4.376272045192309e-06
15
+ 13,263,0.011608125641942024,0.00010688892507459968
16
+ 14,1479,0.007870284840464592,2.205451210102183e-06
17
+ 15,1676,0.0061773089691996574,3.1959466468833853e-06
18
+ 16,544,0.00969443004578352,1.4994059711170848e-05
19
+ 17,1353,0.009250371716916561,4.530145815806463e-06
20
+ 18,498,0.006371534429490566,5.431620593299158e-06
21
+ 19,1057,0.01664942130446434,6.8221042965888046e-06
22
+ 20,107,0.008694815449416637,3.933975676773116e-05
23
+ 21,1757,0.0058263326063752174,9.728351869853213e-06
24
+ 22,1143,0.005022606812417507,6.099335678300122e-06
25
+ 23,114,0.01071125827729702,2.432240580674261e-05
26
+ 24,1064,0.004666423425078392,2.2512263058160897e-06
27
+ 25,1484,0.00266086682677269,1.5564339719276177e-06
28
+ 26,1722,0.0030059986747801304,3.0047604013816454e-06
29
+ 27,133,0.0037198467180132866,3.4626395972736645e-06
30
+ 28,302,0.004690419416874647,3.3762889870558865e-06
31
+ 29,213,0.005868017673492432,9.989330465032253e-06
32
+ 30,322,0.012917899526655674,2.353449417569209e-05
33
+ 31,1279,0.004816899076104164,2.2847239051770885e-06
34
+ 32,157,0.019599126651883125,0.00040160721982829273
35
+ 33,749,0.003745520254597068,4.128196906094672e-06
36
+ 34,410,0.012028106488287449,4.210285169392591e-06
37
+ 35,641,0.0063367267139256,2.3856234747654526e-06
38
+ 36,1368,0.014181560836732388,2.7539140319277067e-06
39
+ 37,813,0.0046987757086753845,9.029875400301535e-06
40
+ 38,172,0.0034006694331765175,1.6219134977291105e-06
41
+ 39,153,0.009642045944929123,1.48695835378021e-05
42
+ 40,32,0.0027958983555436134,1.3832310514771962e-06
43
+ 41,247,0.00933319702744484,1.196909124701051e-05
44
+ 42,2030,0.0037242486141622066,7.3754554250626825e-06
45
+ 43,736,0.004845266696065664,8.737778443901334e-06
46
+ 44,696,0.004661208018660545,4.865990376856644e-06
47
+ 45,953,0.0026221654843539,1.158457621386333e-06
48
+ 46,1581,0.004557488951832056,6.879689863126259e-06
49
+ 47,198,0.00576527277007699,3.3386775157850934e-06
50
+ 48,1784,0.005012583453208208,3.0111359592410736e-06
51
+ 49,1811,0.007315428461879492,4.302055003790883e-06
52
+ 50,1538,0.007978163659572601,5.748988769482821e-06
53
+ 51,882,0.002347120549529791,1.7831223431130638e-06
54
+ 52,461,0.013186206109821796,7.488267146982253e-05
55
+ 53,1299,0.020793089643120766,1.585311838425696e-05
56
+ 54,179,0.003769457573071122,2.198094989580568e-06
57
+ 55,998,0.013764363713562489,8.778295523370616e-06
58
+ 56,553,0.005928783677518368,1.8829905457096174e-05
59
+ 57,356,0.0062231747433543205,7.193594683485571e-06
60
+ 58,633,0.002795632230117917,2.6581233214528766e-06
61
+ 59,363,0.008872496895492077,1.54593162733363e-05
62
+ 60,1994,0.0035931093152612448,3.928405931219459e-06
63
+ 61,2002,0.006632464937865734,3.3086480470956303e-06
64
+ 62,819,0.02143709734082222,1.6978867279249243e-05
65
+ 63,132,0.007151931058615446,2.6269772206433117e-06
66
+ 64,1628,0.008993059396743774,2.0662308088503778e-05
67
+ 65,1972,0.0035680285654962063,2.0197676349198446e-06
68
+ 66,195,0.003384748473763466,4.691950834967429e-06
69
+ 67,1952,0.003126608207821846,2.5505437406536657e-06
70
+ 68,1603,0.018666958436369896,3.578422820282867e-06
71
+ 69,720,0.008143308572471142,1.3676560229214374e-05
72
+ 70,1631,0.0042767697013914585,2.143120354958228e-06
73
+ 71,421,0.006716794800013304,5.242467523203231e-06
74
+ 72,175,0.007178325671702623,3.721777829923667e-06
75
+ 73,1159,0.008334536105394363,5.3721108997706324e-05
76
+ 74,981,0.007647104095667601,2.6886073101195507e-05
77
+ 75,935,0.020851990208029747,1.29914242279483e-05
78
+ 76,82,0.002792434999719262,1.4789338820264675e-06
79
+ 77,296,0.004027648363262415,3.1183467399387155e-06
80
+ 78,1649,0.01279111672192812,9.122803930949885e-06
81
+ 79,361,0.00341061525978148,1.1060423048547818e-06
82
+ 80,197,0.0032491153106093407,1.8587033991934732e-06
83
+ 81,414,0.007140381261706352,7.946927325974684e-06
84
+ 82,1920,0.012520487420260906,1.4377383195096627e-05
85
+ 83,1418,0.0069588422775268555,5.312482244335115e-06
86
+ 84,645,0.004067427013069391,1.7168031263281591e-06
87
+ 85,1480,0.00808851420879364,1.7206006305059418e-05
88
+ 86,519,0.008796729147434235,8.398666977882385e-06
89
+ 87,1045,0.002732536057010293,1.5921785916361841e-06
90
+ 88,1177,0.010690517723560333,3.6772808016394265e-06
91
+ 89,667,0.003798455698415637,4.017812443635194e-06
92
+ 90,535,0.00454864464700222,1.0694540151234833e-06
93
+ 91,240,0.006262573413550854,1.0844333701243158e-05
94
+ 92,275,0.004725808743387461,3.7141551274544327e-06
95
+ 93,1935,0.0028266427107155323,2.847625182766933e-06
96
+ 94,1215,0.004531280603259802,2.915439836215228e-06
97
+ 95,853,0.0073411366902291775,3.0972817057772772e-06
98
+ 96,29,0.042283203452825546,0.0008643245091661811
99
+ 97,1910,0.007519978564232588,3.6901587918691803e-06
100
+ 98,1716,0.00588527787476778,1.029815393849276e-05
101
+ 99,1070,0.007567178923636675,4.370492661109893e-06
102
+ 100,1268,0.0037215552292764187,4.299009106034646e-06
103
+ 101,1020,0.0036112633533775806,1.587126575941511e-06
104
+ 102,809,0.002513773972168565,1.20823153793026e-06
105
+ 103,1578,0.0029218075796961784,3.3401120163034648e-06
106
+ 104,1009,0.0051346151158213615,1.6821747976791812e-06
107
+ 105,1642,0.0055000693537294865,1.7480095948485541e-06
108
+ 106,740,0.007054322399199009,1.187104317068588e-05
109
+ 107,1690,0.014540429227054119,1.9091479771304876e-05
110
+ 108,700,0.011463710106909275,1.1331908353895415e-05
111
+ 109,675,0.004370935261249542,4.6980921979411505e-06
112
+ 110,1610,0.00915885716676712,3.38802283295081e-06
113
+ 111,1467,0.006509630940854549,1.5838497347431257e-05
114
+ 112,1636,0.004922507796436548,6.1838491092203185e-06
115
+ 113,108,0.017360197380185127,0.00022067446843720973
116
+ 114,1080,0.0032281489111483097,5.566618710872717e-06
117
+ 115,849,0.01752321608364582,0.0001538078358862549
118
+ 116,512,0.007081252988427877,2.5792778615141287e-06
119
+ 117,1911,0.006580441724509001,4.6004706746316515e-06
120
+ 118,1456,0.003888176754117012,2.21880804929242e-06
121
+ 119,55,0.005579050630331039,1.9931894712499343e-05
122
+ 120,1337,0.011543052271008492,3.0953284294810146e-05
123
+ 121,515,0.003227449720725417,2.492949988663895e-06
124
+ 122,1850,0.008269901387393475,6.460763870563824e-06
125
+ 123,1461,0.008146455511450768,2.7601123292697594e-05
126
+ 124,1624,0.003822250757366419,3.919851224054582e-06
127
+ 125,36,0.004014691337943077,8.048156701079279e-07
128
+ 126,918,0.007225134409964085,6.6003863139485475e-06
129
+ 127,1958,0.0026516695506870747,3.702624780999031e-06
130
+ 128,1969,0.0030631728004664183,3.6276649097999325e-06
131
+ 129,404,0.0036572958342731,4.012888439319795e-06
132
+ 130,704,0.007990003563463688,4.7529852054140065e-06
133
+ 131,587,0.0027365279383957386,1.00052056950517e-06
134
+ 132,948,0.0030345760751515627,4.294182417652337e-06
135
+ 133,1627,0.0053206393495202065,1.541033088869881e-05
136
+ 134,330,0.00736326863989234,1.3518520063371398e-05
137
+ 135,66,0.006047214847058058,7.814413038431667e-06
138
+ 136,1619,0.10730504244565964,0.009693462401628494
139
+ 137,1010,0.004168729763478041,3.0554961085726973e-06
140
+ 138,1694,0.005540387239307165,1.9312731183163123e-06
141
+ 139,2031,0.007648906204849482,1.4060121884540422e-06
142
+ 140,1779,0.012713056989014149,5.5292716751864646e-06
143
+ 141,1641,0.007197896484285593,2.101934569509467e-06
144
+ 142,1618,0.019664501771330833,1.6306255929521285e-05
145
+ 143,348,0.008284248411655426,4.732074557978194e-06
146
+ 144,797,0.00511737447232008,3.7504210013139527e-06
147
+ 145,588,0.013640097342431545,5.1176648412365466e-05
148
+ 146,621,0.008323821239173412,1.324365621258039e-05
149
+ 147,485,0.007083057425916195,6.150289664219599e-06
150
+ 148,1388,0.0036290495190769434,3.5542284422263037e-06
151
+ 149,10,0.0028073242865502834,3.2556413316342514e-06
152
+ 150,1891,0.012974357232451439,1.1344506674504373e-05
153
+ 151,1369,0.013003332540392876,6.618884526687907e-06
154
+ 152,1562,0.007046903949230909,7.281198577402392e-06
155
+ 153,332,0.004483971279114485,1.2004069503745995e-05
156
+ 154,374,0.004115441348403692,3.4746692563203396e-06
157
+ 155,1663,0.019288672134280205,1.3687284081242979e-05
158
+ 156,474,0.004325499292463064,1.227297616424039e-05
159
+ 157,1817,0.007227790541946888,1.0742267477326095e-05
160
+ 158,124,0.008479476906359196,2.7071755539509468e-05
161
+ 159,1882,0.003726779716089368,6.124154424469452e-06
162
+ 160,391,0.004102138802409172,3.299048330518417e-06
163
+ 161,1729,0.0033820546232163906,2.4511455194442533e-06
164
+ 162,1665,0.008583535440266132,4.2541632865322754e-05
165
+ 163,1717,0.008087593130767345,1.9825234630843624e-05
166
+ 164,1650,0.003806405933573842,2.5486547201580834e-06
167
+ 165,1713,0.012836662121117115,3.0457704269792885e-06
168
+ 166,962,0.0034183457028120756,1.349240733361512e-06
169
+ 167,2013,0.019023047760128975,1.2403854270814918e-05
170
+ 168,607,0.007387745194137096,7.288029792107409e-06
171
+ 169,1990,0.0040338290855288506,7.712176739005372e-06
172
+ 170,639,0.005095656495541334,1.3750841389992274e-06
173
+ 171,992,0.00892646238207817,2.4165572540368885e-05
174
+ 172,1397,0.0046632359735667706,2.351958301005652e-06
175
+ 173,1272,0.006540737114846706,3.374452717253007e-06
176
+ 174,1164,0.016469566151499748,0.00017030596791300923
177
+ 175,164,0.0041435095481574535,4.602671651809942e-06
178
+ 176,1889,0.022296158596873283,6.518412646983052e-06
179
+ 177,986,0.004043533466756344,2.686835159693146e-06
180
+ 178,7,0.013829351402819157,5.607424827758223e-05
181
+ 179,606,0.0027078907005488873,1.2415016499289777e-06
182
+ 180,2029,0.007753848563879728,4.121092388231773e-06
183
+ 181,1885,0.005217907018959522,1.32902923724032e-05
184
+ 182,355,0.005100321490317583,2.420761575194774e-06
185
+ 183,176,0.005044558551162481,2.3335118385148235e-05
186
+ 184,147,0.003967367112636566,3.418270807742374e-06
187
+ 185,1700,0.010935924015939236,5.736328603234142e-06
188
+ 186,1907,0.003110045799985528,2.943419985967921e-06
189
+ 187,146,0.004360048566013575,3.836929408862488e-06
190
+ 188,733,0.0048963348381221294,8.526852070644964e-06
191
+ 189,982,0.004025869537144899,5.162616616871674e-06
192
+ 190,786,0.019575435668230057,0.0003581016790121794
193
+ 191,615,0.004903280176222324,4.797236215381417e-06
194
+ 192,1326,0.010631110519170761,7.894624104665127e-06
195
+ 193,609,0.00532852066680789,6.722496891597984e-06
196
+ 194,194,0.00886658113449812,4.482977237785235e-05
197
+ 195,793,0.03469729423522949,1.0402447514934465e-05
198
+ 196,1922,0.00411422923207283,3.1146234960033325e-06
199
+ 197,1584,0.0060142893344163895,4.736370101454668e-06
200
+ 198,432,0.0032389943953603506,3.604426638048608e-06
201
+ 199,1039,0.006015590392053127,4.903671651845798e-06
202
+ 200,459,0.009616490453481674,4.5235959987621754e-05
203
+ 201,742,0.010077573359012604,7.093654858181253e-06
204
+ 202,1938,0.008122463710606098,4.580372660711873e-06
205
+ 203,1128,0.010109210386872292,6.74665125188767e-06
206
+ 204,103,0.005802322179079056,3.743682555068517e-06
207
+ 205,578,0.012403568252921104,1.8914575775852427e-05
208
+ 206,728,0.006744010839611292,3.883196313836379e-06
209
+ 207,1831,0.005485731642693281,1.2956005775777157e-05
210
+ 208,891,0.009195090271532536,5.087063618702814e-05
211
+ 209,1105,0.005199302453547716,4.14807936977013e-06
212
+ 210,389,0.004813362844288349,3.6206770346325357e-06
213
+ 211,125,0.003863641992211342,6.724615559505764e-06
214
+ 212,647,0.005339846480637789,8.588672244513873e-06
215
+ 213,1184,0.0024689394049346447,2.2673909825243754e-06
216
+ 214,1708,0.005369075108319521,1.3682290955330245e-05
217
+ 215,473,0.007041593082249165,1.8022434232989326e-05
218
+ 216,575,0.004418318625539541,4.6003988245502114e-06
219
+ 217,216,0.00951248686760664,4.5657863665837795e-05
220
+ 218,2043,0.006146934349089861,4.89267949888017e-06
221
+ 219,1799,0.005772029515355825,2.974374865516438e-06
222
+ 220,1431,0.013288415968418121,1.0651011507434305e-05
223
+ 221,689,0.0037264851853251457,2.172588210669346e-06
224
+ 222,288,0.005814157426357269,1.0468536856933497e-05
225
+ 223,796,0.006957488600164652,1.262526711798273e-05
226
+ 224,2020,0.012441140599548817,9.596064046490937e-06
227
+ 225,1826,0.018880100920796394,2.1600959371426143e-05
228
+ 226,1092,0.003720294451341033,3.3361673104082e-06
229
+ 227,373,0.012661045417189598,4.408223958307644e-06
230
+ 228,1050,0.009667755104601383,3.820172423729673e-06
231
+ 229,567,0.009975378401577473,2.7452044378151186e-05
232
+ 230,1537,0.007347908802330494,1.813111884985119e-05
233
+ 231,1515,0.005835228133946657,2.458348717482295e-06
234
+ 232,993,0.005520327016711235,4.950969014316797e-06
235
+ 233,1670,0.008548024110496044,6.063990895199822e-06
236
+ 234,320,0.0032920464873313904,2.2883455130795483e-06
237
+ 235,1225,0.0061637843027710915,1.2297085049794987e-05
238
+ 236,711,0.006888331845402718,5.832199349242728e-06
239
+ 237,1387,0.011138519272208214,0.0001003342040348798
240
+ 238,1018,0.006726689636707306,1.0698750884330366e-05
241
+ 239,558,0.008592606522142887,6.235577893676236e-05
242
+ 240,1849,0.008622732944786549,4.239862391841598e-05
243
+ 241,678,0.0068213543854653835,3.0620969482697546e-05
244
+ 242,1005,0.006941300351172686,2.6587995307636447e-06
245
+ 243,581,0.005243408959358931,3.408073553146096e-06
246
+ 244,995,0.010606508702039719,2.8171954909339547e-05
247
+ 245,72,0.007090189028531313,3.0799437809037045e-06
248
+ 246,128,0.00782877579331398,4.992010872229002e-06
249
+ 247,903,0.01586243323981762,3.3353462640661746e-05
250
+ 248,282,0.005650964565575123,5.474219506140798e-06
251
+ 249,846,0.004851967096328735,7.642621312697884e-06
252
+ 250,1506,0.01186172291636467,1.9330374925630167e-05
253
+ 251,1574,0.003297090530395508,3.5328187095728936e-06
254
+ 252,403,0.004496660083532333,8.701007573108654e-06
255
+ 253,654,0.008243845775723457,2.982130172313191e-05
256
+ 254,1192,0.0047381785698235035,3.98824704461731e-06
257
+ 255,628,0.0075777145102620125,1.2183518265374005e-05
258
+ 256,2028,0.014243428595364094,7.416352218569955e-06
259
+ 257,1887,0.010272026993334293,5.138946289662272e-05
260
+ 258,769,0.004848693031817675,6.368166850734269e-06
261
+ 259,239,0.008136006072163582,1.1608078239078168e-05
262
+ 260,1417,0.004709509667009115,5.926028734393185e-06
263
+ 261,8,0.01162799820303917,6.691028829663992e-06
264
+ 262,341,0.010172762908041477,1.0251277672068682e-05
265
+ 263,703,0.004452997352927923,3.976739208155777e-06
266
+ 264,862,0.003690241137519479,5.862432317371713e-06
267
+ 265,58,0.0031082502100616693,3.819268840743462e-06
268
+ 266,1495,0.005842810031026602,3.625386398198316e-06
269
+ 267,783,0.016494691371917725,8.196604539989494e-06
270
+ 268,1916,0.0034309595357626677,1.7432229242331232e-06
271
+ 269,1277,0.011952207423746586,7.015356823103502e-05
272
+ 270,1974,0.010369701310992241,5.504167802428128e-06
273
+ 271,1462,0.012274852022528648,8.835029802867211e-06
274
+ 272,1545,0.007033115718513727,2.4022890556807397e-06
275
+ 273,709,0.0051637087017297745,5.795956440124428e-06
276
+ 274,1077,0.009799906052649021,5.087582758278586e-05
277
+ 275,803,0.003923915792256594,2.7785342808783753e-06
278
+ 276,697,0.0038375132717192173,3.3220028399227886e-06
279
+ 277,17,0.004452887456864119,1.257343910765485e-06
280
+ 278,478,0.0029366472736001015,1.5259664678524132e-06
281
+ 279,1917,0.0054441094398498535,1.1282214472885244e-05
282
+ 280,331,0.012705250643193722,1.1212253411940765e-05
283
+ 281,312,0.008039274252951145,2.786834784274106e-06
284
+ 282,791,0.005858445540070534,1.2905632502224762e-05
285
+ 283,170,0.003654841333627701,4.103749688511016e-06
286
+ 284,1980,0.0044944570399820805,1.0028017641161568e-05
287
+ 285,739,0.007183007430285215,3.359556558280019e-06
288
+ 286,1866,0.006785457953810692,1.747641545080114e-05
289
+ 287,1621,0.010399449616670609,1.424878337275004e-05
290
+ 288,1344,0.004574065562337637,3.998399733973201e-06
291
+ 289,1440,0.04486759379506111,0.0022540211211889982
292
+ 290,1752,0.015797685831785202,2.512159335310571e-05
293
+ 291,1561,0.019587213173508644,0.0002099344419548288
294
+ 292,118,0.011328237131237984,1.4373837075254414e-05
295
+ 293,1964,0.00373033806681633,1.0633656302161398e-06
296
+ 294,463,0.020888056606054306,0.00036138854920864105
297
+ 295,1786,0.007830035872757435,2.078150828310754e-06
298
+ 296,1061,0.03998783230781555,0.0017642977181822062
299
+ 297,369,0.003534087911248207,2.1010489490436157e-06
300
+ 298,1783,0.004086033906787634,3.828612534562126e-06
301
+ 299,871,0.004295507445931435,2.4805624434520723e-06
302
+ 300,1659,0.008249734528362751,2.0233308532624505e-05
303
+ 301,1454,0.0052932570688426495,4.2254405343555845e-06
304
+ 302,583,0.02400384098291397,0.0004934982862323523
305
+ 303,1331,0.005475938320159912,2.2334130335366353e-05
306
+ 304,764,0.0045458655804395676,3.1304180083679967e-06
307
+ 305,1748,0.013972042128443718,5.910825166210998e-06
308
+ 306,427,0.003397156950086355,1.5576127907479531e-06
309
+ 307,1309,0.010959704406559467,1.1129241102025844e-05
310
+ 308,752,0.010071167722344398,6.563645729329437e-05
311
+ 309,1881,0.0059829456731677055,1.0738443961599842e-05
312
+ 310,1117,0.004652582108974457,5.720540684706066e-06
313
+ 311,1695,0.007664917968213558,1.0057332474389113e-05
314
+ 312,392,0.008071035146713257,2.6356492526247166e-05
315
+ 313,430,0.0055758277885615826,1.3050004781689495e-05
316
+ 314,1763,0.0077276979573071,7.089849987096386e-06
317
+ 315,497,0.003182126907631755,4.118501237826422e-06
318
+ 316,1275,0.012068829499185085,2.1639209080603905e-05
319
+ 317,234,0.013578591868281364,6.0878974181832746e-05
320
+ 318,87,0.0030860030092298985,2.3597729068569606e-06
321
+ 319,1166,0.020563749596476555,4.3402210394560825e-06
322
+ 320,1099,0.008293607272207737,4.685509793489473e-06
323
+ 321,1222,0.002800560090690851,1.8454970813763794e-06
324
+ 322,303,0.006599606946110725,2.219142061221646e-06
325
+ 323,384,0.011275193654000759,3.1071267585502937e-06
326
+ 324,1395,0.004302851855754852,1.1724775504262652e-05
327
+ 325,1295,0.012742860242724419,9.160882473224774e-05
328
+ 326,912,0.004864925984293222,6.161887085909257e-06
329
+ 327,105,0.005097734276205301,5.058087481302209e-06
330
+ 328,1548,0.007526828907430172,2.41211546381237e-06
331
+ 329,2041,0.008274940773844719,1.5901210645097308e-05
332
+ 330,3,0.013608796522021294,1.7969974578591064e-05
333
+ 331,1836,0.0042699179612100124,6.38377241557464e-06
334
+ 332,1302,0.007048876024782658,2.1042544176452793e-05
335
+ 333,774,0.0032877575140446424,3.495284545351751e-06
336
+ 334,1652,0.003602519165724516,3.44957402376167e-06
337
+ 335,1237,0.00501409312710166,3.849938366329297e-06
338
+ 336,1588,0.008198495022952557,1.20716322271619e-05
339
+ 337,2024,0.047612953931093216,0.0020715976133942604
340
+ 338,670,0.002806120552122593,2.3435570710717e-06
341
+ 339,1195,0.007337750867009163,2.1973821276333183e-05
342
+ 340,574,0.005096455570310354,4.694812560046557e-06
343
+ 341,1858,0.007012358866631985,3.267979536758503e-06
344
+ 342,2005,0.010681155137717724,3.702707545016892e-05
345
+ 343,186,0.0027373922057449818,1.8386889450994204e-06
346
+ 344,767,0.005201844498515129,1.7971013221540488e-05
347
+ 345,1436,0.005214421544224024,3.925587407138664e-06
348
+ 346,1489,0.015890518203377724,8.481130862492137e-06
349
+ 347,1407,0.007668566890060902,3.427387582632946e-06
350
+ 348,1979,0.006292196922004223,5.855485596839571e-06
351
+ 349,688,0.008275184780359268,9.112153747992124e-06
352
+ 350,1078,0.0036614560522139072,5.506354682438541e-06
353
+ 351,150,0.014428580179810524,4.679478024627315e-06
354
+ 352,1685,0.019184472039341927,0.00024031553766690195
355
+ 353,1240,0.004863765090703964,3.931779247068334e-06
356
+ 354,211,0.005806264467537403,3.8801899790996686e-06
357
+ 355,1968,0.003220674116164446,3.969436420447892e-06
358
+ 356,1447,0.012549413368105888,7.910454769444186e-06
359
+ 357,1327,0.0020490370225161314,8.488435696563101e-07
360
+ 358,1774,0.003385997610166669,1.9713495476025855e-06
361
+ 359,1399,0.008613907732069492,2.70579221250955e-05
362
+ 360,551,0.012549311853945255,6.799471520935185e-06
363
+ 361,476,0.0037223929539322853,6.399191534001147e-06
364
+ 362,623,0.005433864425867796,1.9866376533173025e-05
365
+ 363,1252,0.010122546926140785,4.093217739864485e-06
366
+ 364,916,0.005714761558920145,2.5066983653232455e-06
367
+ 365,1629,0.0034272971097379923,2.147247414541198e-06
368
+ 366,1793,0.009902245365083218,3.0928531487006694e-05
369
+ 367,632,0.010075864382088184,1.2468903150875121e-05
370
+ 368,854,0.010902026668190956,0.00010768228094093502
371
+ 369,1740,0.0064199636690318584,2.4167859464796493e-06
372
+ 370,1634,0.009051724337041378,6.038916126271943e-06
373
+ 371,1320,0.0063988687470555305,4.458368039195193e-06
374
+ 372,2046,0.004685756750404835,4.253170118317939e-06
375
+ 373,802,0.008411620743572712,9.960245733964257e-06
376
+ 374,236,0.0074165938422083855,2.8197582651046105e-06
377
+ 375,1122,0.0039044220466166735,2.7991607112198835e-06
378
+ 376,477,0.008462456054985523,2.6565936423139647e-05
379
+ 377,1243,0.007762406952679157,1.3722168660024181e-05
380
+ 378,1135,0.015380424447357655,1.6592264728387818e-05
381
+ 379,794,0.004590156953781843,4.8630231503921095e-06
382
+ 380,232,0.004656676668673754,9.526956091576722e-06
383
+ 381,1614,0.0036807102151215076,5.9938929553027265e-06
384
+ 382,1898,0.005461161956191063,5.496305675478652e-06
385
+ 383,804,0.009752052836120129,1.214987423736602e-05
386
+ 384,1870,0.00811659637838602,2.3828497432987206e-05
387
+ 385,1026,0.009386335499584675,6.246085104066879e-05
388
+ 386,1991,0.011349859647452831,1.1492800695123151e-05
389
+ 387,54,0.005545456428080797,1.1166937838424928e-05
390
+ 388,1809,0.005953263491392136,5.453948233480332e-06
391
+ 389,428,0.005132859572768211,5.217946181801381e-06
392
+ 390,1196,0.003744768677279353,4.89605463371845e-06
393
+ 391,1557,0.007695895619690418,4.9762656999519095e-06
394
+ 392,958,0.004905289504677057,2.826092895702459e-06
395
+ 393,401,0.0028787071350961924,1.661192641222442e-06
396
+ 394,1893,0.015774184837937355,0.0001840644545154646
397
+ 395,1758,0.007271637674421072,9.284838597523049e-06
398
+ 396,1232,0.0030909401830285788,3.255347110098228e-06
399
+ 397,1242,0.006966359447687864,4.164281199336983e-05
400
+ 398,820,0.006754095666110516,1.058532052411465e-05
401
+ 399,231,0.009276623837649822,3.2407318940386176e-05
402
+ 400,1555,0.005981341935694218,2.990755547216395e-06
403
+ 401,273,0.005077522248029709,3.8484322431031615e-06
404
+ 402,35,0.004291788674890995,1.5443066558873397e-06
405
+ 403,1540,0.00965913012623787,2.0924460386595456e-06
406
+ 404,1983,0.006420684512704611,3.720250560945715e-06
407
+ 405,1686,0.00538730388507247,3.1811700864636805e-06
408
+ 406,536,0.011519565246999264,5.420846719061956e-05
409
+ 407,917,0.005672916769981384,4.032057404401712e-06
410
+ 408,1796,0.017428023740649223,0.00021097686840221286
411
+ 409,1864,0.006404608488082886,1.5403345969389193e-05
412
+ 410,1674,0.017466647550463676,0.00012999882164876908
413
+ 411,1212,0.005612290930002928,1.2711517229035962e-05
414
+ 412,357,0.00220856792293489,1.5361255236712168e-06
415
+ 413,909,0.005833177361637354,3.9552937778353225e-06
416
+ 414,1904,0.005338562652468681,1.9105324099655263e-05
417
+ 415,1234,0.013170497491955757,3.636056499090046e-05
418
+ 416,2040,0.013932391069829464,1.6289013728965074e-05
419
+ 417,1211,0.006600424647331238,5.15655119670555e-06
420
+ 418,847,0.009446552954614162,3.758804450626485e-05
421
+ 419,771,0.0060704913921654224,3.3022515708580613e-06
422
+ 420,1477,0.02455759048461914,0.0004278153064660728
423
+ 421,1728,0.009784922935068607,9.110764949582517e-06
424
+ 422,1587,0.011792313307523727,1.4925566574675031e-05
425
+ 423,648,0.0062222606502473354,2.1590602045762353e-05
426
+ 424,1625,0.003945155069231987,2.3602638066222426e-06
427
+ 425,225,0.007632310502231121,6.986684184084879e-06
428
+ 426,944,0.011558364145457745,4.0504523894924205e-06
429
+ 427,1007,0.006920473650097847,1.3169837984605692e-06
430
+ 428,924,0.003867707448080182,2.3980762762221275e-06
431
+ 429,1322,0.008841494098305702,2.5250783437513746e-06
432
+ 430,1724,0.004315454047173262,8.944496585172601e-06
433
+ 431,1258,0.004166554193943739,5.888723990210565e-06
434
+ 432,1807,0.005387899931520224,6.445180588343646e-06
435
+ 433,342,0.00776286143809557,1.2151812370575499e-05
436
+ 434,852,0.00882843229919672,1.3146282071829773e-05
437
+ 435,1251,0.003652118844911456,6.464530997618567e-06
438
+ 436,180,0.0066243433393538,1.9956038158852607e-05
439
+ 437,440,0.0036326611880213022,2.41984366766701e-06
440
+ 438,706,0.01125594787299633,2.7050753487856127e-05
441
+ 439,530,0.004538081586360931,5.570773282670416e-06
442
+ 440,1776,0.01264292560517788,1.6088921256596223e-05
443
+ 441,1725,0.004602713510394096,1.1280220860498957e-05
444
+ 442,1161,0.009167377837002277,3.7857398638152517e-06
445
+ 443,1058,0.0036472389474511147,5.122510174260242e-06
446
+ 444,812,0.007336750160902739,3.7091642752784537e-06
447
+ 445,1429,0.0058655813336372375,8.489228093822021e-06
448
+ 446,1520,0.01698259264230728,0.00017079943791031837
449
+ 447,1596,0.004415638744831085,9.254630640498362e-06
results/predictions.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:de61f8cd7fa456ba757ba0d929f7ee4959a182e942604b266b3b3fb22cb40051
3
+ size 1279370
results/split_indices.json ADDED
@@ -0,0 +1,2055 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "seed": 42,
3
+ "train": [
4
+ 1126,
5
+ 1579,
6
+ 792,
7
+ 1987,
8
+ 1366,
9
+ 664,
10
+ 1654,
11
+ 833,
12
+ 1878,
13
+ 2027,
14
+ 926,
15
+ 1647,
16
+ 214,
17
+ 622,
18
+ 41,
19
+ 554,
20
+ 1571,
21
+ 561,
22
+ 1525,
23
+ 699,
24
+ 1137,
25
+ 614,
26
+ 1585,
27
+ 1684,
28
+ 907,
29
+ 1185,
30
+ 841,
31
+ 14,
32
+ 315,
33
+ 834,
34
+ 192,
35
+ 376,
36
+ 1803,
37
+ 307,
38
+ 759,
39
+ 1611,
40
+ 1031,
41
+ 608,
42
+ 690,
43
+ 985,
44
+ 15,
45
+ 1970,
46
+ 1635,
47
+ 1747,
48
+ 1259,
49
+ 30,
50
+ 249,
51
+ 1719,
52
+ 1741,
53
+ 399,
54
+ 800,
55
+ 1664,
56
+ 1042,
57
+ 737,
58
+ 1932,
59
+ 770,
60
+ 1743,
61
+ 1505,
62
+ 1556,
63
+ 98,
64
+ 142,
65
+ 1282,
66
+ 508,
67
+ 873,
68
+ 1702,
69
+ 1036,
70
+ 385,
71
+ 398,
72
+ 579,
73
+ 778,
74
+ 1463,
75
+ 1352,
76
+ 37,
77
+ 651,
78
+ 1908,
79
+ 386,
80
+ 1335,
81
+ 1761,
82
+ 1056,
83
+ 908,
84
+ 1046,
85
+ 1594,
86
+ 1034,
87
+ 956,
88
+ 938,
89
+ 230,
90
+ 1173,
91
+ 1998,
92
+ 323,
93
+ 1221,
94
+ 1125,
95
+ 662,
96
+ 845,
97
+ 2032,
98
+ 1169,
99
+ 1699,
100
+ 1065,
101
+ 1941,
102
+ 1459,
103
+ 867,
104
+ 1266,
105
+ 1244,
106
+ 143,
107
+ 683,
108
+ 1233,
109
+ 1330,
110
+ 1355,
111
+ 1521,
112
+ 413,
113
+ 765,
114
+ 533,
115
+ 1069,
116
+ 855,
117
+ 1319,
118
+ 1416,
119
+ 2004,
120
+ 760,
121
+ 679,
122
+ 1829,
123
+ 2012,
124
+ 1415,
125
+ 299,
126
+ 1183,
127
+ 294,
128
+ 624,
129
+ 1088,
130
+ 605,
131
+ 1204,
132
+ 1787,
133
+ 600,
134
+ 111,
135
+ 1894,
136
+ 668,
137
+ 208,
138
+ 1314,
139
+ 1419,
140
+ 1544,
141
+ 1623,
142
+ 1988,
143
+ 1325,
144
+ 2011,
145
+ 1449,
146
+ 1193,
147
+ 24,
148
+ 1255,
149
+ 896,
150
+ 1378,
151
+ 1317,
152
+ 1016,
153
+ 1497,
154
+ 1698,
155
+ 1602,
156
+ 1712,
157
+ 611,
158
+ 1734,
159
+ 1110,
160
+ 750,
161
+ 640,
162
+ 1838,
163
+ 1340,
164
+ 1862,
165
+ 1582,
166
+ 245,
167
+ 390,
168
+ 957,
169
+ 1267,
170
+ 869,
171
+ 340,
172
+ 1790,
173
+ 593,
174
+ 207,
175
+ 482,
176
+ 1950,
177
+ 95,
178
+ 1735,
179
+ 585,
180
+ 298,
181
+ 763,
182
+ 1926,
183
+ 258,
184
+ 228,
185
+ 580,
186
+ 1385,
187
+ 923,
188
+ 51,
189
+ 2010,
190
+ 1181,
191
+ 572,
192
+ 1014,
193
+ 409,
194
+ 81,
195
+ 1933,
196
+ 904,
197
+ 1413,
198
+ 990,
199
+ 1637,
200
+ 961,
201
+ 814,
202
+ 504,
203
+ 79,
204
+ 366,
205
+ 418,
206
+ 972,
207
+ 631,
208
+ 1567,
209
+ 1410,
210
+ 1367,
211
+ 1380,
212
+ 317,
213
+ 772,
214
+ 148,
215
+ 2042,
216
+ 101,
217
+ 465,
218
+ 886,
219
+ 138,
220
+ 1523,
221
+ 1651,
222
+ 325,
223
+ 1570,
224
+ 1914,
225
+ 1332,
226
+ 1085,
227
+ 1944,
228
+ 673,
229
+ 293,
230
+ 83,
231
+ 1294,
232
+ 1848,
233
+ 1726,
234
+ 2009,
235
+ 268,
236
+ 173,
237
+ 1307,
238
+ 1615,
239
+ 665,
240
+ 1257,
241
+ 817,
242
+ 1428,
243
+ 121,
244
+ 905,
245
+ 1519,
246
+ 206,
247
+ 1599,
248
+ 934,
249
+ 1442,
250
+ 1450,
251
+ 779,
252
+ 1120,
253
+ 1854,
254
+ 1167,
255
+ 1580,
256
+ 951,
257
+ 970,
258
+ 270,
259
+ 1318,
260
+ 0,
261
+ 1072,
262
+ 1789,
263
+ 1703,
264
+ 1840,
265
+ 599,
266
+ 562,
267
+ 1875,
268
+ 306,
269
+ 350,
270
+ 913,
271
+ 1074,
272
+ 1398,
273
+ 235,
274
+ 144,
275
+ 2035,
276
+ 1679,
277
+ 895,
278
+ 23,
279
+ 1358,
280
+ 532,
281
+ 1000,
282
+ 1040,
283
+ 2014,
284
+ 475,
285
+ 1210,
286
+ 1043,
287
+ 708,
288
+ 353,
289
+ 411,
290
+ 1426,
291
+ 1389,
292
+ 1360,
293
+ 1336,
294
+ 1086,
295
+ 69,
296
+ 1880,
297
+ 261,
298
+ 417,
299
+ 646,
300
+ 973,
301
+ 308,
302
+ 1742,
303
+ 657,
304
+ 1160,
305
+ 446,
306
+ 1714,
307
+ 1825,
308
+ 529,
309
+ 997,
310
+ 1013,
311
+ 1288,
312
+ 2047,
313
+ 1372,
314
+ 337,
315
+ 1643,
316
+ 899,
317
+ 718,
318
+ 1342,
319
+ 840,
320
+ 730,
321
+ 1437,
322
+ 454,
323
+ 560,
324
+ 1943,
325
+ 1044,
326
+ 137,
327
+ 1082,
328
+ 505,
329
+ 586,
330
+ 626,
331
+ 723,
332
+ 727,
333
+ 1286,
334
+ 906,
335
+ 1081,
336
+ 1583,
337
+ 136,
338
+ 1899,
339
+ 650,
340
+ 199,
341
+ 1766,
342
+ 493,
343
+ 1144,
344
+ 1114,
345
+ 1218,
346
+ 1960,
347
+ 77,
348
+ 594,
349
+ 801,
350
+ 584,
351
+ 1689,
352
+ 1511,
353
+ 1019,
354
+ 643,
355
+ 1957,
356
+ 1376,
357
+ 921,
358
+ 1601,
359
+ 423,
360
+ 949,
361
+ 550,
362
+ 1744,
363
+ 489,
364
+ 843,
365
+ 61,
366
+ 1852,
367
+ 1089,
368
+ 458,
369
+ 1310,
370
+ 1653,
371
+ 754,
372
+ 201,
373
+ 1305,
374
+ 1801,
375
+ 284,
376
+ 1777,
377
+ 984,
378
+ 74,
379
+ 1274,
380
+ 1067,
381
+ 1393,
382
+ 1347,
383
+ 382,
384
+ 731,
385
+ 799,
386
+ 1401,
387
+ 1068,
388
+ 676,
389
+ 1311,
390
+ 364,
391
+ 1324,
392
+ 1792,
393
+ 472,
394
+ 692,
395
+ 952,
396
+ 1391,
397
+ 379,
398
+ 436,
399
+ 1539,
400
+ 1639,
401
+ 619,
402
+ 757,
403
+ 795,
404
+ 112,
405
+ 806,
406
+ 256,
407
+ 965,
408
+ 1563,
409
+ 1155,
410
+ 1321,
411
+ 2017,
412
+ 1147,
413
+ 1883,
414
+ 1066,
415
+ 1343,
416
+ 1693,
417
+ 1025,
418
+ 1542,
419
+ 1422,
420
+ 1532,
421
+ 416,
422
+ 531,
423
+ 116,
424
+ 1993,
425
+ 215,
426
+ 1457,
427
+ 122,
428
+ 1551,
429
+ 165,
430
+ 1834,
431
+ 43,
432
+ 152,
433
+ 851,
434
+ 1536,
435
+ 1189,
436
+ 274,
437
+ 637,
438
+ 359,
439
+ 311,
440
+ 285,
441
+ 1529,
442
+ 286,
443
+ 248,
444
+ 1648,
445
+ 12,
446
+ 1038,
447
+ 1037,
448
+ 787,
449
+ 836,
450
+ 898,
451
+ 94,
452
+ 758,
453
+ 1730,
454
+ 1131,
455
+ 2036,
456
+ 1141,
457
+ 1718,
458
+ 1432,
459
+ 1976,
460
+ 92,
461
+ 1145,
462
+ 291,
463
+ 1593,
464
+ 1929,
465
+ 60,
466
+ 1071,
467
+ 305,
468
+ 19,
469
+ 1727,
470
+ 1869,
471
+ 481,
472
+ 1412,
473
+ 1508,
474
+ 500,
475
+ 1483,
476
+ 666,
477
+ 1254,
478
+ 1832,
479
+ 1083,
480
+ 1156,
481
+ 469,
482
+ 1198,
483
+ 672,
484
+ 49,
485
+ 510,
486
+ 1194,
487
+ 262,
488
+ 28,
489
+ 2034,
490
+ 756,
491
+ 1626,
492
+ 1888,
493
+ 1142,
494
+ 1873,
495
+ 129,
496
+ 1004,
497
+ 480,
498
+ 188,
499
+ 1349,
500
+ 1458,
501
+ 265,
502
+ 1560,
503
+ 879,
504
+ 994,
505
+ 1753,
506
+ 156,
507
+ 922,
508
+ 950,
509
+ 1153,
510
+ 509,
511
+ 635,
512
+ 203,
513
+ 246,
514
+ 1382,
515
+ 929,
516
+ 1246,
517
+ 160,
518
+ 1805,
519
+ 422,
520
+ 1227,
521
+ 310,
522
+ 1697,
523
+ 1339,
524
+ 1191,
525
+ 681,
526
+ 1607,
527
+ 1687,
528
+ 377,
529
+ 434,
530
+ 1356,
531
+ 893,
532
+ 511,
533
+ 805,
534
+ 1306,
535
+ 309,
536
+ 1496,
537
+ 528,
538
+ 40,
539
+ 996,
540
+ 1791,
541
+ 1163,
542
+ 1656,
543
+ 959,
544
+ 1978,
545
+ 930,
546
+ 467,
547
+ 661,
548
+ 920,
549
+ 1051,
550
+ 52,
551
+ 1921,
552
+ 1453,
553
+ 1710,
554
+ 1466,
555
+ 441,
556
+ 1260,
557
+ 963,
558
+ 210,
559
+ 492,
560
+ 671,
561
+ 1363,
562
+ 2001,
563
+ 564,
564
+ 1835,
565
+ 842,
566
+ 870,
567
+ 807,
568
+ 217,
569
+ 1348,
570
+ 407,
571
+ 1884,
572
+ 1782,
573
+ 1732,
574
+ 343,
575
+ 1931,
576
+ 1248,
577
+ 6,
578
+ 1374,
579
+ 1469,
580
+ 1148,
581
+ 219,
582
+ 9,
583
+ 1245,
584
+ 431,
585
+ 983,
586
+ 1595,
587
+ 1300,
588
+ 1165,
589
+ 1303,
590
+ 1087,
591
+ 383,
592
+ 1091,
593
+ 333,
594
+ 178,
595
+ 785,
596
+ 1940,
597
+ 1666,
598
+ 927,
599
+ 1329,
600
+ 780,
601
+ 858,
602
+ 338,
603
+ 1604,
604
+ 748,
605
+ 1172,
606
+ 490,
607
+ 44,
608
+ 1002,
609
+ 1821,
610
+ 1822,
611
+ 1751,
612
+ 1715,
613
+ 1723,
614
+ 442,
615
+ 1207,
616
+ 987,
617
+ 999,
618
+ 1441,
619
+ 140,
620
+ 50,
621
+ 397,
622
+ 1386,
623
+ 1022,
624
+ 395,
625
+ 1392,
626
+ 1576,
627
+ 1608,
628
+ 209,
629
+ 1750,
630
+ 892,
631
+ 978,
632
+ 470,
633
+ 162,
634
+ 1948,
635
+ 569,
636
+ 127,
637
+ 1692,
638
+ 1231,
639
+ 1701,
640
+ 876,
641
+ 1490,
642
+ 1915,
643
+ 1966,
644
+ 1533,
645
+ 1872,
646
+ 933,
647
+ 693,
648
+ 394,
649
+ 375,
650
+ 1448,
651
+ 104,
652
+ 1999,
653
+ 1052,
654
+ 1526,
655
+ 1241,
656
+ 502,
657
+ 1499,
658
+ 543,
659
+ 549,
660
+ 155,
661
+ 1047,
662
+ 381,
663
+ 484,
664
+ 106,
665
+ 1565,
666
+ 942,
667
+ 1671,
668
+ 1112,
669
+ 1151,
670
+ 524,
671
+ 592,
672
+ 1772,
673
+ 1843,
674
+ 313,
675
+ 42,
676
+ 139,
677
+ 73,
678
+ 39,
679
+ 1486,
680
+ 2019,
681
+ 729,
682
+ 1129,
683
+ 975,
684
+ 117,
685
+ 2022,
686
+ 368,
687
+ 989,
688
+ 1444,
689
+ 1773,
690
+ 1261,
691
+ 65,
692
+ 1430,
693
+ 1846,
694
+ 76,
695
+ 1795,
696
+ 1936,
697
+ 1230,
698
+ 2003,
699
+ 287,
700
+ 702,
701
+ 1632,
702
+ 70,
703
+ 856,
704
+ 1297,
705
+ 931,
706
+ 1424,
707
+ 1381,
708
+ 283,
709
+ 1084,
710
+ 747,
711
+ 1857,
712
+ 1923,
713
+ 1096,
714
+ 625,
715
+ 1655,
716
+ 1304,
717
+ 1855,
718
+ 1041,
719
+ 597,
720
+ 1154,
721
+ 1053,
722
+ 753,
723
+ 1106,
724
+ 1345,
725
+ 1202,
726
+ 1269,
727
+ 630,
728
+ 1592,
729
+ 782,
730
+ 521,
731
+ 872,
732
+ 1316,
733
+ 1383,
734
+ 362,
735
+ 1228,
736
+ 1276,
737
+ 456,
738
+ 1577,
739
+ 267,
740
+ 660,
741
+ 881,
742
+ 725,
743
+ 149,
744
+ 850,
745
+ 831,
746
+ 837,
747
+ 777,
748
+ 205,
749
+ 537,
750
+ 513,
751
+ 717,
752
+ 1460,
753
+ 1995,
754
+ 969,
755
+ 1513,
756
+ 85,
757
+ 1098,
758
+ 1823,
759
+ 829,
760
+ 518,
761
+ 425,
762
+ 1150,
763
+ 1049,
764
+ 582,
765
+ 1798,
766
+ 100,
767
+ 1709,
768
+ 1516,
769
+ 1767,
770
+ 80,
771
+ 46,
772
+ 701,
773
+ 419,
774
+ 358,
775
+ 1839,
776
+ 1552,
777
+ 863,
778
+ 1199,
779
+ 945,
780
+ 538,
781
+ 57,
782
+ 603,
783
+ 33,
784
+ 1048,
785
+ 1954,
786
+ 1771,
787
+ 946,
788
+ 354,
789
+ 1808,
790
+ 131,
791
+ 21,
792
+ 557,
793
+ 1682,
794
+ 1315,
795
+ 1206,
796
+ 1876,
797
+ 1270,
798
+ 4,
799
+ 53,
800
+ 119,
801
+ 1949,
802
+ 123,
803
+ 1509,
804
+ 1736,
805
+ 540,
806
+ 1680,
807
+ 242,
808
+ 925,
809
+ 1575,
810
+ 745,
811
+ 1093,
812
+ 695,
813
+ 839,
814
+ 1890,
815
+ 1902,
816
+ 884,
817
+ 1006,
818
+ 1673,
819
+ 2039,
820
+ 1768,
821
+ 1003,
822
+ 1769,
823
+ 573,
824
+ 974,
825
+ 135,
826
+ 90,
827
+ 110,
828
+ 396,
829
+ 1111,
830
+ 2018,
831
+ 890,
832
+ 1802,
833
+ 1292,
834
+ 976,
835
+ 910,
836
+ 1762,
837
+ 336,
838
+ 1534,
839
+ 1101,
840
+ 1170,
841
+ 1859,
842
+ 1229,
843
+ 883,
844
+ 483,
845
+ 1973,
846
+ 185,
847
+ 1501,
848
+ 260,
849
+ 865,
850
+ 1755,
851
+ 761,
852
+ 1814,
853
+ 1707,
854
+ 45,
855
+ 707,
856
+ 318,
857
+ 808,
858
+ 1984,
859
+ 1262,
860
+ 253,
861
+ 1434,
862
+ 545,
863
+ 435,
864
+ 47,
865
+ 1062,
866
+ 31,
867
+ 1471,
868
+ 319,
869
+ 655,
870
+ 1828,
871
+ 1408,
872
+ 88,
873
+ 227,
874
+ 1032,
875
+ 218,
876
+ 1833,
877
+ 610,
878
+ 864,
879
+ 1660,
880
+ 977,
881
+ 1867,
882
+ 1138,
883
+ 1208,
884
+ 964,
885
+ 1678,
886
+ 1132,
887
+ 243,
888
+ 520,
889
+ 1721,
890
+ 914,
891
+ 1220,
892
+ 620,
893
+ 372,
894
+ 1152,
895
+ 874,
896
+ 682,
897
+ 1362,
898
+ 1487,
899
+ 1827,
900
+ 495,
901
+ 1812,
902
+ 875,
903
+ 352,
904
+ 601,
905
+ 768,
906
+ 1865,
907
+ 2006,
908
+ 1522,
909
+ 1478,
910
+ 486,
911
+ 420,
912
+ 1130,
913
+ 2026,
914
+ 387,
915
+ 1162,
916
+ 1644,
917
+ 1076,
918
+ 1301,
919
+ 1341,
920
+ 1541,
921
+ 1868,
922
+ 1815,
923
+ 271,
924
+ 221,
925
+ 113,
926
+ 151,
927
+ 1008,
928
+ 292,
929
+ 1934,
930
+ 1278,
931
+ 1475,
932
+ 1853,
933
+ 300,
934
+ 238,
935
+ 751,
936
+ 589,
937
+ 1405,
938
+ 1371,
939
+ 694,
940
+ 1197,
941
+ 93,
942
+ 1373,
943
+ 1977,
944
+ 272,
945
+ 479,
946
+ 371,
947
+ 1176,
948
+ 2044,
949
+ 171,
950
+ 491,
951
+ 222,
952
+ 68,
953
+ 1470,
954
+ 1672,
955
+ 1959,
956
+ 684,
957
+ 1606,
958
+ 1030,
959
+ 1104,
960
+ 1427,
961
+ 861,
962
+ 1813,
963
+ 1203,
964
+ 1640,
965
+ 1731,
966
+ 902,
967
+ 1913,
968
+ 1498,
969
+ 1474,
970
+ 99,
971
+ 710,
972
+ 1797,
973
+ 1121,
974
+ 1491,
975
+ 1226,
976
+ 980,
977
+ 888,
978
+ 1597,
979
+ 1860,
980
+ 991,
981
+ 955,
982
+ 1249,
983
+ 181,
984
+ 1939,
985
+ 415,
986
+ 254,
987
+ 954,
988
+ 677,
989
+ 380,
990
+ 84,
991
+ 1108,
992
+ 457,
993
+ 1109,
994
+ 877,
995
+ 1546,
996
+ 1425,
997
+ 264,
998
+ 22,
999
+ 1451,
1000
+ 534,
1001
+ 1930,
1002
+ 1909,
1003
+ 452,
1004
+ 1133,
1005
+ 468,
1006
+ 1502,
1007
+ 1675,
1008
+ 900,
1009
+ 1216,
1010
+ 885,
1011
+ 2025,
1012
+ 1,
1013
+ 698,
1014
+ 1600,
1015
+ 1996,
1016
+ 1289,
1017
+ 889,
1018
+ 2000,
1019
+ 449,
1020
+ 1841,
1021
+ 1113,
1022
+ 1905,
1023
+ 644,
1024
+ 1746,
1025
+ 1073,
1026
+ 638,
1027
+ 1435,
1028
+ 1847,
1029
+ 652,
1030
+ 1961,
1031
+ 1100,
1032
+ 184,
1033
+ 744,
1034
+ 455,
1035
+ 507,
1036
+ 1912,
1037
+ 719,
1038
+ 168,
1039
+ 1764,
1040
+ 67,
1041
+ 1403,
1042
+ 1280,
1043
+ 501,
1044
+ 2,
1045
+ 563,
1046
+ 1896,
1047
+ 1472,
1048
+ 2045,
1049
+ 1512,
1050
+ 1982,
1051
+ 1591,
1052
+ 541,
1053
+ 91,
1054
+ 1953,
1055
+ 556,
1056
+ 1029,
1057
+ 629,
1058
+ 1658,
1059
+ 200,
1060
+ 11,
1061
+ 1187,
1062
+ 297,
1063
+ 2037,
1064
+ 1035,
1065
+ 1760,
1066
+ 680,
1067
+ 437,
1068
+ 1645,
1069
+ 1439,
1070
+ 400,
1071
+ 1756,
1072
+ 596,
1073
+ 1139,
1074
+ 134,
1075
+ 1357,
1076
+ 1433,
1077
+ 1510,
1078
+ 1550,
1079
+ 241,
1080
+ 838,
1081
+ 566,
1082
+ 233,
1083
+ 447,
1084
+ 1482,
1085
+ 1780,
1086
+ 1874,
1087
+ 1149,
1088
+ 324,
1089
+ 1633,
1090
+ 1370,
1091
+ 1638,
1092
+ 2015,
1093
+ 636,
1094
+ 1265,
1095
+ 18,
1096
+ 713,
1097
+ 1559,
1098
+ 1359,
1099
+ 1116,
1100
+ 1785,
1101
+ 821,
1102
+ 734,
1103
+ 1351,
1104
+ 1102,
1105
+ 724,
1106
+ 1733,
1107
+ 1384,
1108
+ 1157,
1109
+ 565,
1110
+ 1134,
1111
+ 815,
1112
+ 1465,
1113
+ 1146,
1114
+ 281,
1115
+ 182,
1116
+ 56,
1117
+ 1281,
1118
+ 1264,
1119
+ 1293,
1120
+ 1754,
1121
+ 335,
1122
+ 1224,
1123
+ 471,
1124
+ 1313,
1125
+ 1168,
1126
+ 402,
1127
+ 1235,
1128
+ 1473,
1129
+ 1250,
1130
+ 860,
1131
+ 1312,
1132
+ 26,
1133
+ 438,
1134
+ 1955,
1135
+ 130,
1136
+ 145,
1137
+ 1657,
1138
+ 598,
1139
+ 1394,
1140
+ 1598,
1141
+ 1942,
1142
+ 126,
1143
+ 1190,
1144
+ 444,
1145
+ 166,
1146
+ 773,
1147
+ 339,
1148
+ 715,
1149
+ 1975,
1150
+ 1924,
1151
+ 971,
1152
+ 27,
1153
+ 451,
1154
+ 220,
1155
+ 1572,
1156
+ 1411,
1157
+ 1720,
1158
+ 378,
1159
+ 832,
1160
+ 1981,
1161
+ 1364,
1162
+ 1455,
1163
+ 947,
1164
+ 1075,
1165
+ 634,
1166
+ 988,
1167
+ 1759,
1168
+ 1800,
1169
+ 1662,
1170
+ 932,
1171
+ 1630,
1172
+ 190,
1173
+ 590,
1174
+ 1423,
1175
+ 290,
1176
+ 154,
1177
+ 746,
1178
+ 496,
1179
+ 370,
1180
+ 568,
1181
+ 314,
1182
+ 1816,
1183
+ 1298,
1184
+ 360,
1185
+ 1947,
1186
+ 1285,
1187
+ 1566,
1188
+ 1863,
1189
+ 824,
1190
+ 1377,
1191
+ 618,
1192
+ 1214,
1193
+ 158,
1194
+ 712,
1195
+ 968,
1196
+ 674,
1197
+ 658,
1198
+ 642,
1199
+ 280,
1200
+ 1989,
1201
+ 1573,
1202
+ 365,
1203
+ 755,
1204
+ 1060,
1205
+ 20,
1206
+ 5,
1207
+ 1609,
1208
+ 326,
1209
+ 577,
1210
+ 1844,
1211
+ 1400,
1212
+ 937,
1213
+ 1503,
1214
+ 517,
1215
+ 346,
1216
+ 328,
1217
+ 940,
1218
+ 1897,
1219
+ 1818,
1220
+ 191,
1221
+ 516,
1222
+ 1290,
1223
+ 1749,
1224
+ 1476,
1225
+ 86,
1226
+ 1201,
1227
+ 1118,
1228
+ 816,
1229
+ 1017,
1230
+ 1223,
1231
+ 2008,
1232
+ 412,
1233
+ 34,
1234
+ 1103,
1235
+ 1213,
1236
+ 1420,
1237
+ 301,
1238
+ 1219,
1239
+ 304,
1240
+ 1824,
1241
+ 1892,
1242
+ 1804,
1243
+ 1414,
1244
+ 798,
1245
+ 649,
1246
+ 1928,
1247
+ 1011,
1248
+ 656,
1249
+ 277,
1250
+ 1283,
1251
+ 1205,
1252
+ 1273,
1253
+ 939,
1254
+ 345,
1255
+ 1063,
1256
+ 334,
1257
+ 691,
1258
+ 212,
1259
+ 406,
1260
+ 1861,
1261
+ 1971,
1262
+ 1024,
1263
+ 866,
1264
+ 1830,
1265
+ 1021,
1266
+ 63,
1267
+ 1901,
1268
+ 1677,
1269
+ 344,
1270
+ 1438,
1271
+ 1334,
1272
+ 1696,
1273
+ 1012,
1274
+ 1667,
1275
+ 1421,
1276
+ 880,
1277
+ 1015,
1278
+ 868,
1279
+ 1617,
1280
+ 408,
1281
+ 818,
1282
+ 732,
1283
+ 1851,
1284
+ 1481,
1285
+ 835,
1286
+ 527,
1287
+ 109,
1288
+ 1346,
1289
+ 1965,
1290
+ 257,
1291
+ 97,
1292
+ 559,
1293
+ 1291,
1294
+ 1464,
1295
+ 250,
1296
+ 617,
1297
+ 1333,
1298
+ 1963,
1299
+ 1810,
1300
+ 1906,
1301
+ 1553,
1302
+ 1738,
1303
+ 591,
1304
+ 1770,
1305
+ 102,
1306
+ 2016,
1307
+ 1605,
1308
+ 570,
1309
+ 687,
1310
+ 612,
1311
+ 1527,
1312
+ 1500,
1313
+ 1001,
1314
+ 71,
1315
+ 278,
1316
+ 960,
1317
+ 1140,
1318
+ 936,
1319
+ 525,
1320
+ 429,
1321
+ 25,
1322
+ 602,
1323
+ 1115,
1324
+ 1951,
1325
+ 1668,
1326
+ 1284,
1327
+ 462,
1328
+ 1217,
1329
+ 826,
1330
+ 279,
1331
+ 1986,
1332
+ 193,
1333
+ 266,
1334
+ 894,
1335
+ 424,
1336
+ 943,
1337
+ 1879,
1338
+ 1569,
1339
+ 1396,
1340
+ 1247,
1341
+ 1028,
1342
+ 351,
1343
+ 1819,
1344
+ 781,
1345
+ 1622,
1346
+ 506,
1347
+ 1558,
1348
+ 453,
1349
+ 1271,
1350
+ 659,
1351
+ 1158,
1352
+ 1683,
1353
+ 967,
1354
+ 1691,
1355
+ 576,
1356
+ 686,
1357
+ 604,
1358
+ 522,
1359
+ 439,
1360
+ 183,
1361
+ 1918,
1362
+ 1531,
1363
+ 823,
1364
+ 1027,
1365
+ 1711,
1366
+ 1171,
1367
+ 1549,
1368
+ 2023,
1369
+ 1123,
1370
+ 1179,
1371
+ 716,
1372
+ 966,
1373
+ 1705,
1374
+ 161,
1375
+ 426,
1376
+ 526,
1377
+ 827,
1378
+ 1492,
1379
+ 726,
1380
+ 613,
1381
+ 810,
1382
+ 825,
1383
+ 1745,
1384
+ 1613,
1385
+ 523,
1386
+ 542,
1387
+ 115,
1388
+ 1704,
1389
+ 1688,
1390
+ 1956,
1391
+ 1775,
1392
+ 1806,
1393
+ 1119,
1394
+ 460,
1395
+ 1781,
1396
+ 1919,
1397
+ 784,
1398
+ 762,
1399
+ 433,
1400
+ 811,
1401
+ 1524,
1402
+ 721,
1403
+ 487,
1404
+ 822,
1405
+ 1669,
1406
+ 844,
1407
+ 1765,
1408
+ 443,
1409
+ 167,
1410
+ 1737,
1411
+ 552,
1412
+ 349,
1413
+ 911,
1414
+ 466,
1415
+ 919,
1416
+ 1200,
1417
+ 595,
1418
+ 196,
1419
+ 547,
1420
+ 1856,
1421
+ 1612,
1422
+ 169,
1423
+ 1837,
1424
+ 616,
1425
+ 269,
1426
+ 1794,
1427
+ 776,
1428
+ 1365,
1429
+ 48,
1430
+ 64,
1431
+ 546,
1432
+ 347,
1433
+ 1997,
1434
+ 741,
1435
+ 388,
1436
+ 1287,
1437
+ 1127,
1438
+ 252,
1439
+ 2033,
1440
+ 321,
1441
+ 120,
1442
+ 255,
1443
+ 1236,
1444
+ 329,
1445
+ 1547,
1446
+ 1180,
1447
+ 1468,
1448
+ 229,
1449
+ 722,
1450
+ 1535,
1451
+ 316,
1452
+ 1263,
1453
+ 878,
1454
+ 1094,
1455
+ 1845,
1456
+ 1253,
1457
+ 1646,
1458
+ 1178,
1459
+ 295,
1460
+ 928,
1461
+ 38,
1462
+ 189,
1463
+ 174,
1464
+ 1788,
1465
+ 1323,
1466
+ 1443,
1467
+ 1706,
1468
+ 1946,
1469
+ 1568,
1470
+ 1097,
1471
+ 766,
1472
+ 237,
1473
+ 1681,
1474
+ 1095,
1475
+ 1967,
1476
+ 223,
1477
+ 1590,
1478
+ 1925,
1479
+ 1962,
1480
+ 1445,
1481
+ 539,
1482
+ 224,
1483
+ 59,
1484
+ 941,
1485
+ 1886,
1486
+ 1543,
1487
+ 204,
1488
+ 89,
1489
+ 1877,
1490
+ 548,
1491
+ 1903,
1492
+ 1992,
1493
+ 1375,
1494
+ 1514,
1495
+ 141,
1496
+ 1530,
1497
+ 488,
1498
+ 663,
1499
+ 738,
1500
+ 1409,
1501
+ 75,
1502
+ 13,
1503
+ 1985,
1504
+ 735,
1505
+ 62,
1506
+ 450,
1507
+ 1256,
1508
+ 1079,
1509
+ 571,
1510
+ 685,
1511
+ 1379,
1512
+ 1239,
1513
+ 1661,
1514
+ 445,
1515
+ 887,
1516
+ 1620,
1517
+ 1554,
1518
+ 1182,
1519
+ 503,
1520
+ 555,
1521
+ 177,
1522
+ 1175,
1523
+ 1586,
1524
+ 393,
1525
+ 705,
1526
+ 226,
1527
+ 1778,
1528
+ 327,
1529
+ 1328,
1530
+ 1900,
1531
+ 714,
1532
+ 2021,
1533
+ 1023,
1534
+ 1209,
1535
+ 78,
1536
+ 653,
1537
+ 1494,
1538
+ 915,
1539
+ 1945,
1540
+ 1493,
1541
+ 1188,
1542
+ 16,
1543
+ 259,
1544
+ 1504,
1545
+ 1895,
1546
+ 1390,
1547
+ 1485,
1548
+ 276,
1549
+ 897,
1550
+ 367,
1551
+ 788,
1552
+ 251,
1553
+ 1488,
1554
+ 1186,
1555
+ 1107,
1556
+ 979,
1557
+ 901,
1558
+ 743,
1559
+ 1820,
1560
+ 1528,
1561
+ 1564,
1562
+ 1238,
1563
+ 514,
1564
+ 289,
1565
+ 159,
1566
+ 1446,
1567
+ 1739,
1568
+ 828,
1569
+ 2038,
1570
+ 187,
1571
+ 1616,
1572
+ 1090,
1573
+ 1937,
1574
+ 775,
1575
+ 499,
1576
+ 1338,
1577
+ 627,
1578
+ 1927,
1579
+ 96,
1580
+ 1136,
1581
+ 1033,
1582
+ 1404,
1583
+ 494,
1584
+ 857,
1585
+ 448,
1586
+ 163,
1587
+ 1055,
1588
+ 464,
1589
+ 202,
1590
+ 1402,
1591
+ 1518,
1592
+ 1296,
1593
+ 1507,
1594
+ 1174,
1595
+ 790,
1596
+ 1452,
1597
+ 1361,
1598
+ 1406,
1599
+ 405,
1600
+ 1124,
1601
+ 1054,
1602
+ 859,
1603
+ 1308
1604
+ ],
1605
+ "validation": [
1606
+ 1354,
1607
+ 1059,
1608
+ 1871,
1609
+ 244,
1610
+ 2007,
1611
+ 830,
1612
+ 1589,
1613
+ 1842,
1614
+ 1517,
1615
+ 669,
1616
+ 789,
1617
+ 848,
1618
+ 1350,
1619
+ 263,
1620
+ 1479,
1621
+ 1676,
1622
+ 544,
1623
+ 1353,
1624
+ 498,
1625
+ 1057,
1626
+ 107,
1627
+ 1757,
1628
+ 1143,
1629
+ 114,
1630
+ 1064,
1631
+ 1484,
1632
+ 1722,
1633
+ 133,
1634
+ 302,
1635
+ 213,
1636
+ 322,
1637
+ 1279,
1638
+ 157,
1639
+ 749,
1640
+ 410,
1641
+ 641,
1642
+ 1368,
1643
+ 813,
1644
+ 172,
1645
+ 153,
1646
+ 32,
1647
+ 247,
1648
+ 2030,
1649
+ 736,
1650
+ 696,
1651
+ 953,
1652
+ 1581,
1653
+ 198,
1654
+ 1784,
1655
+ 1811,
1656
+ 1538,
1657
+ 882,
1658
+ 461,
1659
+ 1299,
1660
+ 179,
1661
+ 998,
1662
+ 553,
1663
+ 356,
1664
+ 633,
1665
+ 363,
1666
+ 1994,
1667
+ 2002,
1668
+ 819,
1669
+ 132,
1670
+ 1628,
1671
+ 1972,
1672
+ 195,
1673
+ 1952,
1674
+ 1603,
1675
+ 720,
1676
+ 1631,
1677
+ 421,
1678
+ 175,
1679
+ 1159,
1680
+ 981,
1681
+ 935,
1682
+ 82,
1683
+ 296,
1684
+ 1649,
1685
+ 361,
1686
+ 197,
1687
+ 414,
1688
+ 1920,
1689
+ 1418,
1690
+ 645,
1691
+ 1480,
1692
+ 519,
1693
+ 1045,
1694
+ 1177,
1695
+ 667,
1696
+ 535,
1697
+ 240,
1698
+ 275,
1699
+ 1935,
1700
+ 1215,
1701
+ 853,
1702
+ 29,
1703
+ 1910,
1704
+ 1716,
1705
+ 1070,
1706
+ 1268,
1707
+ 1020,
1708
+ 809,
1709
+ 1578,
1710
+ 1009,
1711
+ 1642,
1712
+ 740,
1713
+ 1690,
1714
+ 700,
1715
+ 675,
1716
+ 1610,
1717
+ 1467,
1718
+ 1636,
1719
+ 108,
1720
+ 1080,
1721
+ 849,
1722
+ 512,
1723
+ 1911,
1724
+ 1456,
1725
+ 55,
1726
+ 1337,
1727
+ 515,
1728
+ 1850,
1729
+ 1461,
1730
+ 1624,
1731
+ 36,
1732
+ 918,
1733
+ 1958,
1734
+ 1969,
1735
+ 404,
1736
+ 704,
1737
+ 587,
1738
+ 948,
1739
+ 1627,
1740
+ 330,
1741
+ 66,
1742
+ 1619,
1743
+ 1010,
1744
+ 1694,
1745
+ 2031,
1746
+ 1779,
1747
+ 1641,
1748
+ 1618,
1749
+ 348,
1750
+ 797,
1751
+ 588,
1752
+ 621,
1753
+ 485,
1754
+ 1388,
1755
+ 10,
1756
+ 1891,
1757
+ 1369,
1758
+ 1562,
1759
+ 332,
1760
+ 374,
1761
+ 1663,
1762
+ 474,
1763
+ 1817,
1764
+ 124,
1765
+ 1882,
1766
+ 391,
1767
+ 1729,
1768
+ 1665,
1769
+ 1717,
1770
+ 1650,
1771
+ 1713,
1772
+ 962,
1773
+ 2013,
1774
+ 607,
1775
+ 1990,
1776
+ 639,
1777
+ 992,
1778
+ 1397,
1779
+ 1272,
1780
+ 1164,
1781
+ 164,
1782
+ 1889,
1783
+ 986,
1784
+ 7,
1785
+ 606,
1786
+ 2029,
1787
+ 1885,
1788
+ 355,
1789
+ 176,
1790
+ 147,
1791
+ 1700,
1792
+ 1907,
1793
+ 146,
1794
+ 733,
1795
+ 982,
1796
+ 786,
1797
+ 615,
1798
+ 1326,
1799
+ 609,
1800
+ 194,
1801
+ 793,
1802
+ 1922,
1803
+ 1584,
1804
+ 432,
1805
+ 1039,
1806
+ 459,
1807
+ 742,
1808
+ 1938,
1809
+ 1128,
1810
+ 103,
1811
+ 578,
1812
+ 728,
1813
+ 1831,
1814
+ 891,
1815
+ 1105,
1816
+ 389,
1817
+ 125,
1818
+ 647,
1819
+ 1184,
1820
+ 1708,
1821
+ 473,
1822
+ 575,
1823
+ 216,
1824
+ 2043,
1825
+ 1799,
1826
+ 1431,
1827
+ 689,
1828
+ 288,
1829
+ 796,
1830
+ 2020,
1831
+ 1826,
1832
+ 1092,
1833
+ 373,
1834
+ 1050,
1835
+ 567,
1836
+ 1537,
1837
+ 1515,
1838
+ 993,
1839
+ 1670,
1840
+ 320,
1841
+ 1225,
1842
+ 711,
1843
+ 1387,
1844
+ 1018,
1845
+ 558,
1846
+ 1849,
1847
+ 678,
1848
+ 1005,
1849
+ 581,
1850
+ 995,
1851
+ 72,
1852
+ 128,
1853
+ 903,
1854
+ 282,
1855
+ 846,
1856
+ 1506,
1857
+ 1574,
1858
+ 403,
1859
+ 654,
1860
+ 1192,
1861
+ 628,
1862
+ 2028,
1863
+ 1887,
1864
+ 769,
1865
+ 239,
1866
+ 1417,
1867
+ 8,
1868
+ 341,
1869
+ 703,
1870
+ 862,
1871
+ 58,
1872
+ 1495,
1873
+ 783,
1874
+ 1916,
1875
+ 1277,
1876
+ 1974,
1877
+ 1462,
1878
+ 1545,
1879
+ 709,
1880
+ 1077,
1881
+ 803,
1882
+ 697,
1883
+ 17,
1884
+ 478,
1885
+ 1917,
1886
+ 331,
1887
+ 312,
1888
+ 791,
1889
+ 170,
1890
+ 1980,
1891
+ 739,
1892
+ 1866,
1893
+ 1621,
1894
+ 1344,
1895
+ 1440,
1896
+ 1752,
1897
+ 1561,
1898
+ 118,
1899
+ 1964,
1900
+ 463,
1901
+ 1786,
1902
+ 1061,
1903
+ 369,
1904
+ 1783,
1905
+ 871,
1906
+ 1659,
1907
+ 1454,
1908
+ 583,
1909
+ 1331,
1910
+ 764,
1911
+ 1748,
1912
+ 427,
1913
+ 1309,
1914
+ 752,
1915
+ 1881,
1916
+ 1117,
1917
+ 1695,
1918
+ 392,
1919
+ 430,
1920
+ 1763,
1921
+ 497,
1922
+ 1275,
1923
+ 234,
1924
+ 87,
1925
+ 1166,
1926
+ 1099,
1927
+ 1222,
1928
+ 303,
1929
+ 384,
1930
+ 1395,
1931
+ 1295,
1932
+ 912,
1933
+ 105,
1934
+ 1548,
1935
+ 2041,
1936
+ 3,
1937
+ 1836,
1938
+ 1302,
1939
+ 774,
1940
+ 1652,
1941
+ 1237,
1942
+ 1588,
1943
+ 2024,
1944
+ 670,
1945
+ 1195,
1946
+ 574,
1947
+ 1858,
1948
+ 2005,
1949
+ 186,
1950
+ 767,
1951
+ 1436,
1952
+ 1489,
1953
+ 1407,
1954
+ 1979,
1955
+ 688,
1956
+ 1078,
1957
+ 150,
1958
+ 1685,
1959
+ 1240,
1960
+ 211,
1961
+ 1968,
1962
+ 1447,
1963
+ 1327,
1964
+ 1774,
1965
+ 1399,
1966
+ 551,
1967
+ 476,
1968
+ 623,
1969
+ 1252,
1970
+ 916,
1971
+ 1629,
1972
+ 1793,
1973
+ 632,
1974
+ 854,
1975
+ 1740,
1976
+ 1634,
1977
+ 1320,
1978
+ 2046,
1979
+ 802,
1980
+ 236,
1981
+ 1122,
1982
+ 477,
1983
+ 1243,
1984
+ 1135,
1985
+ 794,
1986
+ 232,
1987
+ 1614,
1988
+ 1898,
1989
+ 804,
1990
+ 1870,
1991
+ 1026,
1992
+ 1991,
1993
+ 54,
1994
+ 1809,
1995
+ 428,
1996
+ 1196,
1997
+ 1557,
1998
+ 958,
1999
+ 401,
2000
+ 1893,
2001
+ 1758,
2002
+ 1232,
2003
+ 1242,
2004
+ 820,
2005
+ 231,
2006
+ 1555,
2007
+ 273,
2008
+ 35,
2009
+ 1540,
2010
+ 1983,
2011
+ 1686,
2012
+ 536,
2013
+ 917,
2014
+ 1796,
2015
+ 1864,
2016
+ 1674,
2017
+ 1212,
2018
+ 357,
2019
+ 909,
2020
+ 1904,
2021
+ 1234,
2022
+ 2040,
2023
+ 1211,
2024
+ 847,
2025
+ 771,
2026
+ 1477,
2027
+ 1728,
2028
+ 1587,
2029
+ 648,
2030
+ 1625,
2031
+ 225,
2032
+ 944,
2033
+ 1007,
2034
+ 924,
2035
+ 1322,
2036
+ 1724,
2037
+ 1258,
2038
+ 1807,
2039
+ 342,
2040
+ 852,
2041
+ 1251,
2042
+ 180,
2043
+ 440,
2044
+ 706,
2045
+ 530,
2046
+ 1776,
2047
+ 1725,
2048
+ 1161,
2049
+ 1058,
2050
+ 812,
2051
+ 1429,
2052
+ 1520,
2053
+ 1596
2054
+ ]
2055
+ }
results/training_curves.pdf ADDED
Binary file (31 kB). View file
 
results/training_curves.png ADDED

Git LFS Details

  • SHA256: d7e9bf352a7d2fc44c7356d67e490e952cd2536c1be2cfcd8f26069efc795aa3
  • Pointer size: 131 Bytes
  • Size of remote file: 127 kB
results/training_status.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "status": "completed",
3
+ "completed_epochs": 500,
4
+ "best_epoch": 495,
5
+ "best_val_relative_l2": 0.008166384883224964,
6
+ "paper_relative_l2": 0.0109,
7
+ "ratio_to_paper": 0.749209622314217,
8
+ "training_seconds": 12257.58068851661,
9
+ "n_train": 1600,
10
+ "n_val": 448,
11
+ "seed": 42,
12
+ "checkpoint": "weight/best_model.pth",
13
+ "slurm_job_id": "1059315"
14
+ }
results/training_summary.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "status": "completed",
3
+ "completed_epochs": 500,
4
+ "best_epoch": 495,
5
+ "best_val_relative_l2": 0.008166384883224964,
6
+ "paper_relative_l2": 0.0109,
7
+ "ratio_to_paper": 0.749209622314217,
8
+ "training_seconds": 12257.58068851661,
9
+ "n_train": 1600,
10
+ "n_val": 448,
11
+ "seed": 42,
12
+ "checkpoint": "weight/best_model.pth",
13
+ "slurm_job_id": "1059315"
14
+ }
results/validation_examples.pdf ADDED
Binary file (33.4 kB). View file
 
results/validation_examples.png ADDED

Git LFS Details

  • SHA256: c2394e0b3e690e9af0c44ec35767775ae0de277e8922f613a2c42188cf974836
  • Pointer size: 131 Bytes
  • Size of remote file: 448 kB
results/verification.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "status": "passed",
3
+ "completed_epochs": 500,
4
+ "n_train": 1600,
5
+ "n_validation": 448,
6
+ "resolution": 256,
7
+ "seed": 42,
8
+ "history_continuous": true,
9
+ "scheduler_verified": true,
10
+ "split_disjoint_and_complete": true,
11
+ "best_checkpoint_selection_verified": true,
12
+ "checkpoint_reload_metric_difference": 9.313225746154785e-10,
13
+ "independent_float64_relative_l2": 0.008166383878061999,
14
+ "physical_outputs_finite": true,
15
+ "figures_nonempty": true,
16
+ "portability": "passed: physically relocated code and checkpoint, changed data/results directories; CPU load only",
17
+ "accelerator_execution": "Slurm job 1059315, a01r3n12",
18
+ "metrics": {
19
+ "n_validation": 448,
20
+ "checkpoint_epoch": 495,
21
+ "best_epoch": 495,
22
+ "validation_relative_l2": 0.00816638395190239,
23
+ "validation_relative_l2_std": 0.0073033287189900875,
24
+ "validation_mse_physical": 5.692711056326516e-05,
25
+ "validation_rmse_physical": 0.00754500599578023,
26
+ "checkpoint_recorded_relative_l2": 0.008166384883224964,
27
+ "reload_metric_absolute_difference": 9.313225746154785e-10,
28
+ "paper_table1_relative_l2": 0.0109,
29
+ "ratio_to_paper": 0.7492095368717788,
30
+ "inference_seconds": 7.967788686975837,
31
+ "checkpoint_sha256": "82ca744dfb18510e680edf20b02213a585c6d859d269a2775c7192be8f67f821",
32
+ "device": "BW"
33
+ }
34
+ }
results/visualization_manifest.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "figures": [
3
+ "training_curves.png",
4
+ "training_curves.pdf",
5
+ "validation_examples.png",
6
+ "validation_examples.pdf",
7
+ "error_distribution.png"
8
+ ],
9
+ "selected_validation_indices": [
10
+ 0,
11
+ 111,
12
+ 136
13
+ ],
14
+ "sample_count": 448,
15
+ "completed_epochs": 500,
16
+ "metrics": {
17
+ "n_validation": 448,
18
+ "checkpoint_epoch": 495,
19
+ "best_epoch": 495,
20
+ "validation_relative_l2": 0.00816638395190239,
21
+ "validation_relative_l2_std": 0.0073033287189900875,
22
+ "validation_mse_physical": 5.692711056326516e-05,
23
+ "validation_rmse_physical": 0.00754500599578023,
24
+ "checkpoint_recorded_relative_l2": 0.008166384883224964,
25
+ "reload_metric_absolute_difference": 9.313225746154785e-10,
26
+ "paper_table1_relative_l2": 0.0109,
27
+ "ratio_to_paper": 0.7492095368717788,
28
+ "inference_seconds": 7.967788686975837,
29
+ "checkpoint_sha256": "82ca744dfb18510e680edf20b02213a585c6d859d269a2775c7192be8f67f821",
30
+ "device": "BW"
31
+ }
32
+ }
scripts/common.py ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Configuration, supplied MAT data, and portable checkpoint utilities."""
2
+
3
+ import hashlib
4
+ import json
5
+ import os
6
+ import random
7
+ from pathlib import Path
8
+
9
+ import numpy as np
10
+ import scipy.io
11
+ import torch
12
+ import yaml
13
+ from torch.nn import functional as F
14
+
15
+ ROOT = Path(__file__).resolve().parents[1]
16
+
17
+
18
+ def package_path(value):
19
+ path = Path(value).expanduser()
20
+ return path if path.is_absolute() else ROOT / path
21
+
22
+
23
+ def load_config(path):
24
+ with open(package_path(path)) as stream:
25
+ return yaml.safe_load(stream)
26
+
27
+
28
+ def save_json(path, value):
29
+ path = Path(path)
30
+ path.parent.mkdir(parents=True, exist_ok=True)
31
+ temp = path.with_name(path.name + ".tmp")
32
+ temp.write_text(json.dumps(value, ensure_ascii=False, indent=2, allow_nan=False))
33
+ temp.replace(path)
34
+
35
+
36
+ def seed_everything(seed):
37
+ random.seed(seed)
38
+ np.random.seed(seed)
39
+ torch.manual_seed(seed)
40
+ torch.cuda.manual_seed_all(seed)
41
+
42
+
43
+ def compute_device(name):
44
+ device = torch.device(name)
45
+ if device.type == "cuda":
46
+ if not os.environ.get("SLURM_JOB_ID"):
47
+ raise RuntimeError("Accelerator execution requires a Slurm allocation")
48
+ if not torch.cuda.is_available():
49
+ raise RuntimeError("No accelerator visible inside the Slurm job")
50
+ return device
51
+
52
+
53
+ def read_fields(config):
54
+ data = config["data"]
55
+ path = package_path(data["directory"]) / data["filename"]
56
+ arrays = scipy.io.loadmat(path, variable_names=[data["input_key"], data["target_key"]])
57
+ fields = []
58
+ for key in [data["input_key"], data["target_key"]]:
59
+ array = arrays[key]
60
+ if list(array.shape) != data["expected_shape"] or array.dtype != np.float64:
61
+ raise ValueError(f"Unexpected supplied data {key}: {array.shape}, {array.dtype}")
62
+ if not np.isfinite(array).all():
63
+ raise ValueError(f"Nonfinite values in {key}")
64
+ tensor = torch.from_numpy(array.astype(np.float32))
65
+ # Paper leaves resizing unspecified: author's linear interpolation,
66
+ # align_corners=False, evaluates at source centers 15.5,47.5,... .
67
+ tensor = F.interpolate(tensor[:, None], size=data["resolution"],
68
+ mode=data["interpolation"], align_corners=False)
69
+ fields.append(tensor.transpose(1, 2).contiguous())
70
+ return fields
71
+
72
+
73
+ def split_indices(config):
74
+ data = config["data"]
75
+ permutation = torch.randperm(data["expected_shape"][0], generator=torch.Generator().manual_seed(config["seed"]))
76
+ n, m = data["n_train"], data["n_val"]
77
+ if n + m != len(permutation):
78
+ raise ValueError("The formal experiment must use all 2048 supplied samples")
79
+ return permutation[:n], permutation[n:n + m]
80
+
81
+
82
+ def fit_normalizers(initial, final, train_ids, eps):
83
+ result = {"eps": eps}
84
+ for prefix, field in [("a", initial), ("u", final)]:
85
+ training = field[train_ids]
86
+ result[prefix + "_mean"] = training.mean()
87
+ result[prefix + "_std"] = training.std(correction=1)
88
+ return result
89
+
90
+
91
+ def encode(field, stats, prefix):
92
+ return (field - stats[prefix + "_mean"].to(field)) / (stats[prefix + "_std"].to(field) + stats["eps"])
93
+
94
+
95
+ def decode(field, stats, prefix="u"):
96
+ return field * (stats[prefix + "_std"].to(field) + stats["eps"]) + stats[prefix + "_mean"].to(field)
97
+
98
+
99
+ def make_inputs(initial, stats):
100
+ physical = encode(initial, stats, "a")
101
+ grid = torch.linspace(0, 1, initial.shape[1], dtype=initial.dtype).view(1, -1, 1)
102
+ return torch.cat([physical, grid.expand(initial.shape[0], -1, -1)], dim=-1)
103
+
104
+
105
+ def relative_l2(prediction, target):
106
+ difference = (prediction - target).flatten(1)
107
+ return torch.linalg.vector_norm(difference, dim=1) / (torch.linalg.vector_norm(target.flatten(1), dim=1) + 1e-12)
108
+
109
+
110
+ def atomic_checkpoint(path, state):
111
+ path = package_path(path)
112
+ path.parent.mkdir(parents=True, exist_ok=True)
113
+ temp = path.with_name(path.name + ".tmp")
114
+ torch.save(state, temp)
115
+ temp.replace(path)
116
+
117
+
118
+ def load_checkpoint(path):
119
+ # Tensor/primitive-only checkpoint; no pickled custom class or path equality.
120
+ state = torch.load(package_path(path), map_location="cpu", weights_only=True)
121
+ if state.get("format") != "lino-burgers-v1":
122
+ raise ValueError("Unsupported LiNO checkpoint")
123
+ return state
124
+
125
+
126
+ def file_digest(path):
127
+ digest = hashlib.sha256()
128
+ with open(path, "rb") as stream:
129
+ for block in iter(lambda: stream.read(8 * 1024 * 1024), b""):
130
+ digest.update(block)
131
+ return digest.hexdigest()
scripts/inference.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Reload the best checkpoint and evaluate every held-out validation sample."""
2
+
3
+ import argparse
4
+ import csv
5
+ import sys
6
+ import time
7
+ from pathlib import Path
8
+
9
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
10
+ import numpy as np
11
+ import torch
12
+ from model.lino import LiNO
13
+ from common import (compute_device, decode, file_digest, load_checkpoint, load_config,
14
+ make_inputs, package_path, read_fields, relative_l2, save_json)
15
+
16
+
17
+ @torch.no_grad()
18
+ def inference(config, checkpoint=None):
19
+ device = compute_device(config["inference"]["device"])
20
+ checkpoint = package_path(checkpoint or config["training"]["checkpoint"])
21
+ state = load_checkpoint(checkpoint)
22
+ contract = state["data_contract"]
23
+ for key in ["resolution", "interpolation", "input_key", "target_key"]:
24
+ if config["data"][key] != contract[key]:
25
+ raise ValueError(f"Data contract mismatch for {key}")
26
+ data_path = package_path(config["data"]["directory"]) / config["data"]["filename"]
27
+ if file_digest(data_path) != contract["dataset_sha256"]:
28
+ raise ValueError("Dataset content differs from the training data (paths may change)")
29
+ initial, final = read_fields(config)
30
+ ids, stats = state["val_indices"], state["normalizers"]
31
+ model = LiNO(**state["architecture"]).to(device)
32
+ model.load_state_dict(state["model_state"], strict=True)
33
+ model.eval()
34
+ inputs = make_inputs(initial[ids], stats)
35
+ targets = final[ids]
36
+ predictions = []
37
+ started = time.monotonic()
38
+ batch_size = config["inference"]["batch_size"]
39
+ for start in range(0, len(ids), batch_size):
40
+ normalized = model(inputs[start:start+batch_size].to(device))
41
+ predictions.append(decode(normalized, stats).cpu())
42
+ if start % (batch_size * 25) == 0:
43
+ print(f"INFERENCE samples={min(start+batch_size,len(ids))}/{len(ids)} checkpoint_epoch={state['epoch']}", flush=True)
44
+ prediction = torch.cat(predictions)
45
+ errors = relative_l2(prediction, targets)
46
+ mse_by_sample = (prediction-targets).square().flatten(1).mean(1)
47
+ if not torch.isfinite(prediction).all():
48
+ raise FloatingPointError("Nonfinite inference output")
49
+ output = package_path(config["results"]["directory"])
50
+ output.mkdir(parents=True, exist_ok=True)
51
+ np.savez_compressed(output/"predictions.npz", initial=initial[ids].numpy(), target=targets.numpy(),
52
+ prediction=prediction.numpy(), sample_indices=ids.numpy(), relative_l2=errors.numpy(),
53
+ x=np.linspace(0,1,config["data"]["resolution"],dtype=np.float32))
54
+ with open(output/"per_sample_metrics.csv", "w", newline="") as stream:
55
+ writer = csv.writer(stream)
56
+ writer.writerow(["validation_index", "source_index", "relative_l2", "mse_physical"])
57
+ writer.writerows((i,int(source),float(rel),float(mse)) for i,(source,rel,mse) in enumerate(zip(ids,errors,mse_by_sample)))
58
+ metric = errors.mean().item()
59
+ metrics = dict(n_validation=len(ids), checkpoint_epoch=state["epoch"], best_epoch=state["best_epoch"],
60
+ validation_relative_l2=metric, validation_relative_l2_std=errors.std(correction=0).item(),
61
+ validation_mse_physical=mse_by_sample.mean().item(),
62
+ validation_rmse_physical=mse_by_sample.mean().sqrt().item(),
63
+ checkpoint_recorded_relative_l2=state["best_val_relative_l2"],
64
+ reload_metric_absolute_difference=abs(metric-state["best_val_relative_l2"]),
65
+ paper_table1_relative_l2=0.0109, ratio_to_paper=metric/0.0109,
66
+ inference_seconds=time.monotonic()-started,
67
+ checkpoint_sha256=file_digest(checkpoint), device=torch.cuda.get_device_name(device))
68
+ if metrics["reload_metric_absolute_difference"] > 1e-6:
69
+ raise AssertionError(f"Reloaded metric disagrees with checkpoint: {metrics}")
70
+ save_json(output/"metrics.json", metrics)
71
+ print("BEST CHECKPOINT INFERENCE COMPLETED", metrics, flush=True)
72
+
73
+
74
+ if __name__ == "__main__":
75
+ parser = argparse.ArgumentParser(description=__doc__)
76
+ parser.add_argument("--config", default="config/config.yaml")
77
+ parser.add_argument("--checkpoint", default=None)
78
+ args = parser.parse_args()
79
+ inference(load_config(args.config), args.checkpoint)
scripts/result.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Plot training curves and physical-space validation predictions."""
2
+
3
+ import argparse
4
+ import csv
5
+ import json
6
+ from pathlib import Path
7
+ import matplotlib
8
+ matplotlib.use("Agg")
9
+ import matplotlib.pyplot as plt
10
+ import numpy as np
11
+ from common import load_config, package_path, save_json
12
+
13
+
14
+ def render(config):
15
+ output = package_path(config["results"]["directory"])
16
+ data = np.load(output/"predictions.npz")
17
+ metrics = json.loads((output/"metrics.json").read_text())
18
+ with open(output/"history.csv") as stream:
19
+ rows = list(csv.DictReader(stream))
20
+ epoch = np.array([int(r["epoch"]) for r in rows])
21
+ fig, axes = plt.subplots(1, 2, figsize=(11, 4), constrained_layout=True)
22
+ for name, label in [("train_loss","Training"),("val_loss","Validation")]:
23
+ axes[0].semilogy(epoch,[float(r[name]) for r in rows],label=label)
24
+ axes[0].set(xlabel="Epoch",ylabel="MSE + relative L2 (normalized)")
25
+ axes[0].legend()
26
+ axes[1].semilogy(epoch,[float(r["val_relative_l2"]) for r in rows],color="tab:blue",label="Validation")
27
+ axes[1].axhline(0.0109,color="tab:red",linestyle="--",label="Paper Table 1: 0.0109")
28
+ axes[1].set(xlabel="Epoch",ylabel="Relative L2 (physical space)")
29
+ axes[1].legend()
30
+ for ax in axes: ax.grid(alpha=0.2)
31
+ fig.savefig(output/"training_curves.png",dpi=200)
32
+ fig.savefig(output/"training_curves.pdf")
33
+ plt.close(fig)
34
+ errors=data["relative_l2"]
35
+ chosen=[0,int(np.argsort(errors)[len(errors)//2]),int(np.argmax(errors))]
36
+ fig, axes=plt.subplots(3,2,figsize=(12,10),constrained_layout=True)
37
+ x=data["x"]
38
+ for row,index in enumerate(chosen):
39
+ initial=data["initial"][index,:,0]; target=data["target"][index,:,0]; pred=data["prediction"][index,:,0]
40
+ axes[row,0].plot(x,initial,color="0.6",linewidth=1,label="Initial u0")
41
+ axes[row,0].plot(x,target,color="black",linewidth=1.5,label="Reference u(T)")
42
+ axes[row,0].plot(x,pred,color="tab:blue",linestyle="--",label="LiNO")
43
+ axes[row,0].set_title(f"Source sample {data['sample_indices'][index]}, relative L2={errors[index]:.4g}")
44
+ axes[row,0].set(xlabel="x",ylabel="u (dataset units)")
45
+ axes[row,0].legend()
46
+ axes[row,1].plot(x,pred-target,color="tab:red")
47
+ axes[row,1].axhline(0,color="0.5",linewidth=0.5)
48
+ axes[row,1].set(xlabel="x",ylabel="Prediction - reference")
49
+ fig.savefig(output/"validation_examples.png",dpi=200)
50
+ fig.savefig(output/"validation_examples.pdf")
51
+ plt.close(fig)
52
+ fig, ax=plt.subplots(figsize=(6,4),constrained_layout=True)
53
+ ax.hist(errors,bins=35,color="tab:blue",alpha=.85)
54
+ ax.set(xlabel="Validation relative L2",ylabel="Samples",title=f"All {len(errors)} held-out samples")
55
+ fig.savefig(output/"error_distribution.png",dpi=200)
56
+ plt.close(fig)
57
+ save_json(output/"visualization_manifest.json",dict(figures=["training_curves.png","training_curves.pdf","validation_examples.png","validation_examples.pdf","error_distribution.png"],
58
+ selected_validation_indices=chosen,sample_count=len(errors),completed_epochs=len(rows),metrics=metrics))
59
+ print(f"VISUALIZATION COMPLETED: {output} ({len(rows)} epochs, {len(errors)} validation samples)",flush=True)
60
+
61
+
62
+ if __name__ == "__main__":
63
+ parser=argparse.ArgumentParser(description=__doc__)
64
+ parser.add_argument("--config",default="config/config.yaml")
65
+ args=parser.parse_args()
66
+ render(load_config(args.config))
scripts/train.py ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Full paper training: python scripts/train.py --config config/config.yaml."""
2
+
3
+ import argparse
4
+ import csv
5
+ import os
6
+ import platform
7
+ import sys
8
+ import time
9
+ from pathlib import Path
10
+
11
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
12
+ import torch
13
+ from torch.utils.data import DataLoader, TensorDataset
14
+ from model.lino import LiNO
15
+ from common import (atomic_checkpoint, compute_device, decode, encode, file_digest,
16
+ fit_normalizers, load_checkpoint, load_config, make_inputs,
17
+ package_path, read_fields, relative_l2, save_json,
18
+ seed_everything, split_indices)
19
+
20
+
21
+ @torch.no_grad()
22
+ def evaluate(model, loader, stats, device):
23
+ model.eval()
24
+ total = torch.zeros(4, device=device)
25
+ count = 0
26
+ for inputs, targets in loader:
27
+ inputs, targets = inputs.to(device), targets.to(device)
28
+ prediction = model(inputs)
29
+ mse = (prediction - targets).square().mean()
30
+ rel = relative_l2(prediction, targets).mean()
31
+ physical_prediction, physical_target = decode(prediction, stats), decode(targets, stats)
32
+ physical_rel = relative_l2(physical_prediction, physical_target).mean()
33
+ physical_mse = (physical_prediction - physical_target).square().mean()
34
+ total += torch.stack([mse + rel, mse, physical_rel, physical_mse]) * len(inputs)
35
+ count += len(inputs)
36
+ values = (total / count).cpu().tolist()
37
+ if not all(torch.isfinite(torch.tensor(values))):
38
+ raise FloatingPointError("Nonfinite validation metrics")
39
+ return dict(zip(["val_loss", "val_mse_normalized", "val_relative_l2", "val_mse_physical"], values))
40
+
41
+
42
+ def train(config, resume=None):
43
+ seed_everything(config["seed"])
44
+ settings = config["training"]
45
+ device = compute_device(settings["device"])
46
+ output = package_path(config["results"]["directory"])
47
+ output.mkdir(parents=True, exist_ok=True)
48
+ initial, final = read_fields(config)
49
+ train_ids, val_ids = split_indices(config)
50
+ stats = fit_normalizers(initial, final, train_ids, config["data"]["normalization_eps"])
51
+ restored = load_checkpoint(resume) if resume else None
52
+ if restored:
53
+ if restored["architecture"] != config["model"]:
54
+ raise ValueError("Resume architecture differs from config")
55
+ train_ids, val_ids, stats = restored["train_indices"], restored["val_indices"], restored["normalizers"]
56
+ inputs, targets = make_inputs(initial, stats), encode(final, stats, "u")
57
+ loader_args = dict(batch_size=settings["batch_size"], num_workers=settings["num_workers"], pin_memory=True, drop_last=False)
58
+ training = DataLoader(TensorDataset(inputs[train_ids], targets[train_ids]), shuffle=True, **loader_args)
59
+ validation = DataLoader(TensorDataset(inputs[val_ids], targets[val_ids]), shuffle=False, **loader_args)
60
+ model = LiNO(**config["model"]).to(device)
61
+ optimizer = torch.optim.AdamW(model.parameters(), lr=settings["learning_rate"],
62
+ weight_decay=settings["weight_decay"], betas=tuple(settings["betas"]), eps=settings["optimizer_eps"])
63
+ scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=settings["scheduler_step"], gamma=settings["scheduler_gamma"])
64
+ best, best_epoch, start_epoch = float("inf"), 0, 0
65
+ if restored:
66
+ model.load_state_dict(restored["model_state"], strict=True)
67
+ optimizer.load_state_dict(restored["optimizer_state"])
68
+ scheduler.load_state_dict(restored["scheduler_state"])
69
+ best, best_epoch, start_epoch = restored["best_val_relative_l2"], restored["best_epoch"], restored["epoch"]
70
+ torch.set_rng_state(restored["torch_rng_state"])
71
+ torch.cuda.set_rng_state_all(restored["accelerator_rng_states"])
72
+ data_path = package_path(config["data"]["directory"]) / config["data"]["filename"]
73
+ parameter_count = sum(p.numel() for p in model.parameters())
74
+ manifest = dict(config=config, architecture=model.architecture, parameter_count=parameter_count,
75
+ dataset_path=str(data_path), dataset_sha256=file_digest(data_path),
76
+ raw_shape=config["data"]["expected_shape"], resolution=config["data"]["resolution"],
77
+ n_train=len(train_ids), n_val=len(val_ids), seed=config["seed"],
78
+ dtype="float32", optimizer="AdamW", precision="float32", early_stopping=False,
79
+ torch_version=str(torch.__version__), hip_version=torch.version.hip,
80
+ python_version=platform.python_version(), hostname=platform.node(),
81
+ slurm_job_id=os.environ.get("SLURM_JOB_ID"), device=torch.cuda.get_device_name(device),
82
+ source_files={str(p.relative_to(Path(__file__).resolve().parents[1])):file_digest(p)
83
+ for folder in ["model", "scripts"] for p in (Path(__file__).resolve().parents[1]/folder).glob("*.py")})
84
+ save_json(output / "run_manifest.json", manifest)
85
+ save_json(output / "split_indices.json", {"seed":config["seed"], "train":train_ids.tolist(), "validation":val_ids.tolist()})
86
+ history_path = output / "history.csv"
87
+ columns = ["epoch", "train_loss", "train_mse_normalized", "train_relative_l2_normalized", "val_loss", "val_mse_normalized", "val_relative_l2", "val_mse_physical", "lr_used", "lr_next", "epoch_seconds", "best_val_relative_l2"]
88
+ print(f"FORMAL RUN device={manifest['device']} job={manifest['slurm_job_id']} params={parameter_count} train={len(train_ids)} val={len(val_ids)} resolution={inputs.shape[1]} epochs={settings['epochs']} batch={settings['batch_size']}", flush=True)
89
+ started = time.monotonic()
90
+ with open(history_path, "a" if resume else "w", newline="", buffering=1) as stream:
91
+ writer = csv.DictWriter(stream, fieldnames=columns)
92
+ if not resume:
93
+ writer.writeheader()
94
+ for epoch in range(start_epoch + 1, settings["epochs"] + 1):
95
+ epoch_start = time.monotonic()
96
+ lr_used = optimizer.param_groups[0]["lr"]
97
+ model.train()
98
+ totals = torch.zeros(3, device=device)
99
+ count = 0
100
+ for step, (batch_x, batch_y) in enumerate(training, 1):
101
+ batch_x, batch_y = batch_x.to(device), batch_y.to(device)
102
+ optimizer.zero_grad(set_to_none=True)
103
+ prediction = model(batch_x)
104
+ mse = (prediction - batch_y).square().mean()
105
+ relative = relative_l2(prediction, batch_y).mean()
106
+ loss = mse + relative
107
+ loss.backward()
108
+ gradient_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), settings["grad_clip"], error_if_nonfinite=True)
109
+ optimizer.step()
110
+ totals += torch.stack([loss.detach(), mse.detach(), relative.detach()]) * len(batch_x)
111
+ count += len(batch_x)
112
+ if step % settings["log_interval"] == 0 or step == len(training):
113
+ print(f"epoch={epoch:03d}/{settings['epochs']} step={step:03d}/{len(training)} loss={loss.item():.7e} mse={mse.item():.7e} rel_l2_norm={relative.item():.7e} grad_norm={gradient_norm.item():.5e}", flush=True)
114
+ scheduler.step()
115
+ metrics = evaluate(model, validation, stats, device)
116
+ train_loss, train_mse, train_rel = (totals / count).cpu().tolist()
117
+ improved = metrics["val_relative_l2"] < best
118
+ if improved:
119
+ best, best_epoch = metrics["val_relative_l2"], epoch
120
+ row = dict(epoch=epoch, train_loss=train_loss, train_mse_normalized=train_mse,
121
+ train_relative_l2_normalized=train_rel, **metrics, lr_used=lr_used,
122
+ lr_next=optimizer.param_groups[0]["lr"], epoch_seconds=time.monotonic()-epoch_start,
123
+ best_val_relative_l2=best)
124
+ state = dict(format="lino-burgers-v1", architecture=model.architecture,
125
+ model_state=model.state_dict(), optimizer_state=optimizer.state_dict(),
126
+ scheduler_state=scheduler.state_dict(), epoch=epoch, best_epoch=best_epoch,
127
+ best_val_relative_l2=best, normalizers=stats, train_indices=train_ids,
128
+ val_indices=val_ids, data_contract={"resolution":config["data"]["resolution"],
129
+ "interpolation":config["data"]["interpolation"], "input_key":config["data"]["input_key"],
130
+ "target_key":config["data"]["target_key"], "dataset_sha256":manifest["dataset_sha256"]},
131
+ torch_rng_state=torch.get_rng_state(), accelerator_rng_states=torch.cuda.get_rng_state_all(),
132
+ validation_metrics=metrics)
133
+ if improved:
134
+ atomic_checkpoint(settings["checkpoint"], state)
135
+ atomic_checkpoint(settings["last_checkpoint"], state)
136
+ writer.writerow(row)
137
+ save_json(output / "training_status.json", {**row, "best_epoch":best_epoch, "status":"running", "completed_epochs":epoch})
138
+ print(f"EPOCH {epoch:03d}/{settings['epochs']} train_loss={train_loss:.8e} val_loss={metrics['val_loss']:.8e} val_relative_l2={metrics['val_relative_l2']:.8e} best={best:.8e} best_epoch={best_epoch} lr={lr_used:.6e} seconds={row['epoch_seconds']:.2f}", flush=True)
139
+ summary = dict(status="completed", completed_epochs=settings["epochs"], best_epoch=best_epoch,
140
+ best_val_relative_l2=best, paper_relative_l2=0.0109,
141
+ ratio_to_paper=best/0.0109, training_seconds=time.monotonic()-started,
142
+ n_train=len(train_ids), n_val=len(val_ids), seed=config["seed"],
143
+ checkpoint=str(settings["checkpoint"]), slurm_job_id=manifest["slurm_job_id"])
144
+ save_json(output / "training_summary.json", summary)
145
+ save_json(output / "training_status.json", summary)
146
+ print("TRAINING COMPLETED", summary, flush=True)
147
+
148
+
149
+ if __name__ == "__main__":
150
+ parser = argparse.ArgumentParser(description=__doc__)
151
+ parser.add_argument("--config", default="config/config.yaml")
152
+ parser.add_argument("--resume", default=None, help="Restore a full last checkpoint if interrupted")
153
+ args = parser.parse_args()
154
+ train(load_config(args.config), args.resume)
weight/best_model.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:82ca744dfb18510e680edf20b02213a585c6d859d269a2775c7192be8f67f821
3
+ size 22643009