Publish COPRA Flow v0.1.0 artifacts and documentation
Browse files- LICENSE +21 -0
- README.md +109 -0
- SHA256SUMS +9 -0
- config.json +51 -0
- copra-flow.pt +3 -0
- example.npz +3 -0
- release.json +18 -0
- splits.json +0 -0
- training_history.json +404 -0
- validation_results.json +57 -0
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 Atal Narayan Sahu and COPRA Flow contributors
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
language:
|
| 4 |
+
- en
|
| 5 |
+
tags:
|
| 6 |
+
- physics
|
| 7 |
+
- optics
|
| 8 |
+
- ultrafast-optics
|
| 9 |
+
- tg-frog
|
| 10 |
+
- pulse-retrieval
|
| 11 |
+
- flow-matching
|
| 12 |
+
- pytorch
|
| 13 |
+
datasets:
|
| 14 |
+
- atal-narayan/copra-flow-tg-frog
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
# COPRA Flow
|
| 18 |
+
|
| 19 |
+
COPRA Flow refines ultrafast laser pulse reconstructions from transient-grating
|
| 20 |
+
frequency-resolved optical gating (TG-FROG) measurements. A conditional flow
|
| 21 |
+
model takes a COPRA reconstruction and the measured trace, then produces a
|
| 22 |
+
refined complex electric field.
|
| 23 |
+
|
| 24 |
+
- **Code and installation:** [atalnarayan/copra-flow](https://github.com/atalnarayan/copra-flow)
|
| 25 |
+
- **Training data:** [COPRA Flow TG-FROG](https://huggingface.co/datasets/atal-narayan/copra-flow-tg-frog)
|
| 26 |
+
- **Weights:** [`copra-flow.pt`](copra-flow.pt), PyTorch checkpoint, approximately 7 MB
|
| 27 |
+
- **License:** MIT
|
| 28 |
+
|
| 29 |
+
## Run the model
|
| 30 |
+
|
| 31 |
+
Install the code following the GitHub README. From the code repository, download
|
| 32 |
+
this checkpoint with the Hugging Face CLI:
|
| 33 |
+
|
| 34 |
+
```bash
|
| 35 |
+
hf download atal-narayan/copra-flow copra-flow.pt --revision v0.1.0 --local-dir checkpoints
|
| 36 |
+
uv run copra-flow example --out data/example.npz
|
| 37 |
+
uv run copra-flow infer --checkpoint checkpoints/copra-flow.pt \
|
| 38 |
+
--input data/example.npz --out-dir runs/example
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
The command performs 400 COPRA iterations and 64 Euler flow refinement steps.
|
| 42 |
+
It writes `prediction.npz` and `metrics.json`. No training data or ground-truth
|
| 43 |
+
pulse is required for inference. See the
|
| 44 |
+
[inference guide](https://github.com/atalnarayan/copra-flow/blob/main/docs/inference.md)
|
| 45 |
+
for preparing experimental measurements or refining an existing COPRA field.
|
| 46 |
+
|
| 47 |
+
Inputs use 256 temporal samples at 2.5 fs spacing. The measurement must follow
|
| 48 |
+
the documented frequency and delay conventions. This is a custom scientific
|
| 49 |
+
PyTorch model; load it through `copra-flow`, rather than a Transformers pipeline.
|
| 50 |
+
|
| 51 |
+
## Model and training
|
| 52 |
+
|
| 53 |
+
The model has **1,754,770 parameters**. It predicts a conditional vector field
|
| 54 |
+
using two-channel real/imaginary pulse fields and a peak-normalized,
|
| 55 |
+
square-root-transformed TG-FROG trace. The architecture uses 128 hidden channels,
|
| 56 |
+
eight residual blocks, a 256-dimensional condition embedding, and a
|
| 57 |
+
128-dimensional time embedding.
|
| 58 |
+
|
| 59 |
+
Training used 270,000 source–target pairs from 9,000 synthetic pulses, with
|
| 60 |
+
30,000 pairs from 1,000 disjoint pulses for validation. All source candidates
|
| 61 |
+
for a pulse stay in the same partition. The run used AdamW, learning rate
|
| 62 |
+
0.0003, batch size 64, and 50 epochs on an NVIDIA A100 40 GB GPU with mixed
|
| 63 |
+
precision. The released checkpoint was selected by validation loss at epoch
|
| 64 |
+
46, update 194,074; its validation flow loss was 0.017534218672072208.
|
| 65 |
+
|
| 66 |
+
`config.json` contains the training and architecture settings. `splits.json`
|
| 67 |
+
contains the fixed pulse split, and `training_history.json` records all 50
|
| 68 |
+
epochs. This release preserves every model tensor exactly, removes optimizer
|
| 69 |
+
state, and replaces machine-specific paths with portable relative paths.
|
| 70 |
+
It is intended for inference and evaluation, not exact training resumption.
|
| 71 |
+
Source and release hashes are recorded in `release.json` and `SHA256SUMS`.
|
| 72 |
+
|
| 73 |
+
## Evaluation
|
| 74 |
+
|
| 75 |
+
The paper's synthetic benchmark evaluates the final COPRA source for each of
|
| 76 |
+
1,000 validation pulses with 64 Euler steps:
|
| 77 |
+
|
| 78 |
+
| Method | Mean pulse MAE ↓ | Mean trace SSIM ↑ |
|
| 79 |
+
| --- | ---: | ---: |
|
| 80 |
+
| COPRA | 0.4685 | 0.9709 |
|
| 81 |
+
| COPRA + direct Hann | 0.3345 | 0.8207 |
|
| 82 |
+
| COPRA Flow | 0.0674 | 0.9103 |
|
| 83 |
+
|
| 84 |
+
These are validation results, not results on an independent held-out test set.
|
| 85 |
+
The same validation partition selected the checkpoint. Pulse errors use the
|
| 86 |
+
synthetic benchmark's target alignment and normalization. A complete rerun
|
| 87 |
+
matched the six reference metric means within an absolute tolerance of 0.0001;
|
| 88 |
+
see `validation_results.json` and the code's benchmark script.
|
| 89 |
+
|
| 90 |
+
## Scope and limitations
|
| 91 |
+
|
| 92 |
+
Training uses synthetic TG-FROG traces at 800 nm with 1% additive Gaussian
|
| 93 |
+
trace noise and nonnegative clipping. Performance on other pulse distributions,
|
| 94 |
+
noise conditions, acquisition systems, or physical grids is not established.
|
| 95 |
+
Improved pulse error does not guarantee improved trace consistency; check the
|
| 96 |
+
reconstructed trace when interpreting a result. Smoothness alone does not
|
| 97 |
+
establish pulse accuracy.
|
| 98 |
+
|
| 99 |
+
The experimental inference workflow executes, but the historical experimental
|
| 100 |
+
metric table does not reproduce exactly, including when rerunning the original
|
| 101 |
+
research scripts. See the
|
| 102 |
+
[reproducibility notes](https://github.com/atalnarayan/copra-flow/blob/main/docs/reproducibility.md)
|
| 103 |
+
for the observed differences and verification limits. This release does not
|
| 104 |
+
claim an exact reproduction of that table.
|
| 105 |
+
|
| 106 |
+
## Citation
|
| 107 |
+
|
| 108 |
+
Citation metadata is maintained in the code repository's
|
| 109 |
+
[CITATION.cff](https://github.com/atalnarayan/copra-flow/blob/main/CITATION.cff).
|
SHA256SUMS
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
520145a615164fbf664950a5fd2a46107841ad4959bc823b2c112c5791dfdf8e LICENSE
|
| 2 |
+
5061fe95f4821a57af14aea7b1916022c50ca382c8bda20ae9e9343d285a40cc README.md
|
| 3 |
+
f380df7043bd1e95a92437735e14640f79c0eb1ede970a0c1ced2e2cbfe66808 config.json
|
| 4 |
+
07ee14467fc6ea7ada500121e1aeed71f24f0d2c6138147f6704a05acd4095b5 copra-flow.pt
|
| 5 |
+
18694e1f4a17ca3e404fab5e9b76dfd14480942316fe4ae61704fa57975b8fc9 example.npz
|
| 6 |
+
1cb0660e95c3dd56277c3d47cf02a016da0903805659e856dec5047b71abf7cc release.json
|
| 7 |
+
7d4b6284dc550969600d87e9f7dd91734dc3d32fb5172667634269ee700b630b splits.json
|
| 8 |
+
3cda8c91cad4fb8c4bcda9277c64f4a9e4c5162ca6102711be887766a242d39a training_history.json
|
| 9 |
+
7db3171cbe99c70baabe7467354bb3315f1e191a1f0e0d5739d2e1b2bb087935 validation_results.json
|
config.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"dataset": {
|
| 3 |
+
"cache_shards": 16,
|
| 4 |
+
"data_dir": "data/flow_matching_10k",
|
| 5 |
+
"include_hard_negatives": true,
|
| 6 |
+
"max_shards": null,
|
| 7 |
+
"max_source_weight": 5.0,
|
| 8 |
+
"min_source_weight": 0.0,
|
| 9 |
+
"normalize_trace": true,
|
| 10 |
+
"seed": 42,
|
| 11 |
+
"source_mode": "all",
|
| 12 |
+
"split": "train",
|
| 13 |
+
"split_file": "splits.json",
|
| 14 |
+
"trace_transform": "sqrt",
|
| 15 |
+
"use_source_weights": true,
|
| 16 |
+
"validation_fraction": 0.1
|
| 17 |
+
},
|
| 18 |
+
"loss": {
|
| 19 |
+
"path_noise_std": 0.0,
|
| 20 |
+
"time_eps": 0.0001
|
| 21 |
+
},
|
| 22 |
+
"model": {
|
| 23 |
+
"condition_dim": 256,
|
| 24 |
+
"condition_on_source": false,
|
| 25 |
+
"dropout": 0.0,
|
| 26 |
+
"field_length": 256,
|
| 27 |
+
"hidden_channels": 128,
|
| 28 |
+
"residual_blocks": 8,
|
| 29 |
+
"time_embedding_dim": 128,
|
| 30 |
+
"trace_base_channels": 24,
|
| 31 |
+
"trace_layers": 4
|
| 32 |
+
},
|
| 33 |
+
"training": {
|
| 34 |
+
"amp": true,
|
| 35 |
+
"batch_size": 64,
|
| 36 |
+
"checkpoint_every": 1,
|
| 37 |
+
"compile_model": false,
|
| 38 |
+
"device": "cuda",
|
| 39 |
+
"epochs": 50,
|
| 40 |
+
"grad_clip_norm": 1.0,
|
| 41 |
+
"learning_rate": 0.0003,
|
| 42 |
+
"log_every": 25,
|
| 43 |
+
"max_train_batches": null,
|
| 44 |
+
"max_val_batches": null,
|
| 45 |
+
"num_workers": 4,
|
| 46 |
+
"out_dir": "runs/copra-flow",
|
| 47 |
+
"seed": 42,
|
| 48 |
+
"validate_every": 1,
|
| 49 |
+
"weight_decay": 0.0001
|
| 50 |
+
}
|
| 51 |
+
}
|
copra-flow.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:07ee14467fc6ea7ada500121e1aeed71f24f0d2c6138147f6704a05acd4095b5
|
| 3 |
+
size 7057902
|
example.npz
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:18694e1f4a17ca3e404fab5e9b76dfd14480942316fe4ae61704fa57975b8fc9
|
| 3 |
+
size 280603
|
release.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"best_validation_flow_loss": 0.017534218672072208,
|
| 3 |
+
"checkpoint_sha256": "07ee14467fc6ea7ada500121e1aeed71f24f0d2c6138147f6704a05acd4095b5",
|
| 4 |
+
"code_repository": "https://github.com/atalnarayan/copra-flow",
|
| 5 |
+
"code_revision": "a70b5ead847ef180e660095471ecc2db074e6a2c",
|
| 6 |
+
"dataset_repository": "atal-narayan/copra-flow-tg-frog",
|
| 7 |
+
"epoch": 46,
|
| 8 |
+
"format_version": 1,
|
| 9 |
+
"global_step": 194074,
|
| 10 |
+
"license": "mit",
|
| 11 |
+
"machine_specific_paths_removed": true,
|
| 12 |
+
"name": "COPRA Flow",
|
| 13 |
+
"optimizer_state_included": false,
|
| 14 |
+
"parameter_count": 1754770,
|
| 15 |
+
"source_checkpoint_sha256": "9d7159f8d5495832592ac0a17365a35e442742ae9ff319d7c7144520c847a3d9",
|
| 16 |
+
"version": "v0.1.0",
|
| 17 |
+
"weights_bit_identical_to_source": true
|
| 18 |
+
}
|
splits.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
training_history.json
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"history": [
|
| 3 |
+
{
|
| 4 |
+
"best_val_loss": 0.039760063515543176,
|
| 5 |
+
"epoch": 1,
|
| 6 |
+
"global_step": 4219,
|
| 7 |
+
"train_loss": 0.048370899312272335,
|
| 8 |
+
"val_loss": 0.039760063515543176,
|
| 9 |
+
"val_velocity_mse": 0.03949241956342449
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
"best_val_loss": 0.03155958008116433,
|
| 13 |
+
"epoch": 2,
|
| 14 |
+
"global_step": 8438,
|
| 15 |
+
"train_loss": 0.03499699404569571,
|
| 16 |
+
"val_loss": 0.03155958008116433,
|
| 17 |
+
"val_velocity_mse": 0.03132850126917365
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"best_val_loss": 0.02882730234354766,
|
| 21 |
+
"epoch": 3,
|
| 22 |
+
"global_step": 12657,
|
| 23 |
+
"train_loss": 0.030509617545627168,
|
| 24 |
+
"val_loss": 0.02882730234354766,
|
| 25 |
+
"val_velocity_mse": 0.028554000174884856
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"best_val_loss": 0.027223503759214236,
|
| 29 |
+
"epoch": 4,
|
| 30 |
+
"global_step": 16876,
|
| 31 |
+
"train_loss": 0.02752542236539959,
|
| 32 |
+
"val_loss": 0.027223503759214236,
|
| 33 |
+
"val_velocity_mse": 0.02700459882060983
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"best_val_loss": 0.02561977235719498,
|
| 37 |
+
"epoch": 5,
|
| 38 |
+
"global_step": 21095,
|
| 39 |
+
"train_loss": 0.025577741026088972,
|
| 40 |
+
"val_loss": 0.02561977235719498,
|
| 41 |
+
"val_velocity_mse": 0.02545351006968348
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"best_val_loss": 0.0242692795537436,
|
| 45 |
+
"epoch": 6,
|
| 46 |
+
"global_step": 25314,
|
| 47 |
+
"train_loss": 0.02391287040351253,
|
| 48 |
+
"val_loss": 0.0242692795537436,
|
| 49 |
+
"val_velocity_mse": 0.024098803883970482
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
"best_val_loss": 0.02334500584147696,
|
| 53 |
+
"epoch": 7,
|
| 54 |
+
"global_step": 29533,
|
| 55 |
+
"train_loss": 0.02270620756741312,
|
| 56 |
+
"val_loss": 0.02334500584147696,
|
| 57 |
+
"val_velocity_mse": 0.023134769776017902
|
| 58 |
+
},
|
| 59 |
+
{
|
| 60 |
+
"best_val_loss": 0.02334500584147696,
|
| 61 |
+
"epoch": 8,
|
| 62 |
+
"global_step": 33752,
|
| 63 |
+
"train_loss": 0.021694983564525608,
|
| 64 |
+
"val_loss": 0.024200269045915875,
|
| 65 |
+
"val_velocity_mse": 0.023980851785075277
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"best_val_loss": 0.022769615025337,
|
| 69 |
+
"epoch": 9,
|
| 70 |
+
"global_step": 37971,
|
| 71 |
+
"train_loss": 0.020887004655242163,
|
| 72 |
+
"val_loss": 0.022769615025337,
|
| 73 |
+
"val_velocity_mse": 0.022586058968229336
|
| 74 |
+
},
|
| 75 |
+
{
|
| 76 |
+
"best_val_loss": 0.022260717521888265,
|
| 77 |
+
"epoch": 10,
|
| 78 |
+
"global_step": 42190,
|
| 79 |
+
"train_loss": 0.02003164939064922,
|
| 80 |
+
"val_loss": 0.022260717521888265,
|
| 81 |
+
"val_velocity_mse": 0.021982301976770036
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"best_val_loss": 0.021717482185892777,
|
| 85 |
+
"epoch": 11,
|
| 86 |
+
"global_step": 46409,
|
| 87 |
+
"train_loss": 0.01939831668315453,
|
| 88 |
+
"val_loss": 0.021717482185892777,
|
| 89 |
+
"val_velocity_mse": 0.021489336470594762
|
| 90 |
+
},
|
| 91 |
+
{
|
| 92 |
+
"best_val_loss": 0.0209960921752904,
|
| 93 |
+
"epoch": 12,
|
| 94 |
+
"global_step": 50628,
|
| 95 |
+
"train_loss": 0.018800052028113166,
|
| 96 |
+
"val_loss": 0.0209960921752904,
|
| 97 |
+
"val_velocity_mse": 0.020898054225811126
|
| 98 |
+
},
|
| 99 |
+
{
|
| 100 |
+
"best_val_loss": 0.0209960921752904,
|
| 101 |
+
"epoch": 13,
|
| 102 |
+
"global_step": 54847,
|
| 103 |
+
"train_loss": 0.018252122872201123,
|
| 104 |
+
"val_loss": 0.021723932831355534,
|
| 105 |
+
"val_velocity_mse": 0.021559210957339738
|
| 106 |
+
},
|
| 107 |
+
{
|
| 108 |
+
"best_val_loss": 0.020144825595726907,
|
| 109 |
+
"epoch": 14,
|
| 110 |
+
"global_step": 59066,
|
| 111 |
+
"train_loss": 0.017749218866083365,
|
| 112 |
+
"val_loss": 0.020144825595726907,
|
| 113 |
+
"val_velocity_mse": 0.02002382862157246
|
| 114 |
+
},
|
| 115 |
+
{
|
| 116 |
+
"best_val_loss": 0.020144825595726907,
|
| 117 |
+
"epoch": 15,
|
| 118 |
+
"global_step": 63285,
|
| 119 |
+
"train_loss": 0.01737314341351404,
|
| 120 |
+
"val_loss": 0.02020938856664227,
|
| 121 |
+
"val_velocity_mse": 0.020047664452693674
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"best_val_loss": 0.019933219938509182,
|
| 125 |
+
"epoch": 16,
|
| 126 |
+
"global_step": 67504,
|
| 127 |
+
"train_loss": 0.016984601340645805,
|
| 128 |
+
"val_loss": 0.019933219938509182,
|
| 129 |
+
"val_velocity_mse": 0.019860347839139862
|
| 130 |
+
},
|
| 131 |
+
{
|
| 132 |
+
"best_val_loss": 0.019614729162520057,
|
| 133 |
+
"epoch": 17,
|
| 134 |
+
"global_step": 71723,
|
| 135 |
+
"train_loss": 0.016502560571526558,
|
| 136 |
+
"val_loss": 0.019614729162520057,
|
| 137 |
+
"val_velocity_mse": 0.019502528752984683
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"best_val_loss": 0.019614729162520057,
|
| 141 |
+
"epoch": 18,
|
| 142 |
+
"global_step": 75942,
|
| 143 |
+
"train_loss": 0.016225659600268096,
|
| 144 |
+
"val_loss": 0.02001298490319965,
|
| 145 |
+
"val_velocity_mse": 0.019915231435037435
|
| 146 |
+
},
|
| 147 |
+
{
|
| 148 |
+
"best_val_loss": 0.01907965998430409,
|
| 149 |
+
"epoch": 19,
|
| 150 |
+
"global_step": 80161,
|
| 151 |
+
"train_loss": 0.01588083613978694,
|
| 152 |
+
"val_loss": 0.01907965998430409,
|
| 153 |
+
"val_velocity_mse": 0.018915601661984822
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"best_val_loss": 0.01907965998430409,
|
| 157 |
+
"epoch": 20,
|
| 158 |
+
"global_step": 84380,
|
| 159 |
+
"train_loss": 0.015566516729744125,
|
| 160 |
+
"val_loss": 0.01913045131629194,
|
| 161 |
+
"val_velocity_mse": 0.019057416352632046
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"best_val_loss": 0.01907965998430409,
|
| 165 |
+
"epoch": 21,
|
| 166 |
+
"global_step": 88599,
|
| 167 |
+
"train_loss": 0.015295855905269067,
|
| 168 |
+
"val_loss": 0.019084638624545385,
|
| 169 |
+
"val_velocity_mse": 0.01895866795221586
|
| 170 |
+
},
|
| 171 |
+
{
|
| 172 |
+
"best_val_loss": 0.01907965998430409,
|
| 173 |
+
"epoch": 22,
|
| 174 |
+
"global_step": 92818,
|
| 175 |
+
"train_loss": 0.015068221784855276,
|
| 176 |
+
"val_loss": 0.01933192863498431,
|
| 177 |
+
"val_velocity_mse": 0.01924421370817797
|
| 178 |
+
},
|
| 179 |
+
{
|
| 180 |
+
"best_val_loss": 0.019020103234877146,
|
| 181 |
+
"epoch": 23,
|
| 182 |
+
"global_step": 97037,
|
| 183 |
+
"train_loss": 0.014716366195795617,
|
| 184 |
+
"val_loss": 0.019020103234877146,
|
| 185 |
+
"val_velocity_mse": 0.018923386160447114
|
| 186 |
+
},
|
| 187 |
+
{
|
| 188 |
+
"best_val_loss": 0.01863780426286431,
|
| 189 |
+
"epoch": 24,
|
| 190 |
+
"global_step": 101256,
|
| 191 |
+
"train_loss": 0.014551253272580306,
|
| 192 |
+
"val_loss": 0.01863780426286431,
|
| 193 |
+
"val_velocity_mse": 0.01855770379070566
|
| 194 |
+
},
|
| 195 |
+
{
|
| 196 |
+
"best_val_loss": 0.01863780426286431,
|
| 197 |
+
"epoch": 25,
|
| 198 |
+
"global_step": 105475,
|
| 199 |
+
"train_loss": 0.014335928779160751,
|
| 200 |
+
"val_loss": 0.01937202660432423,
|
| 201 |
+
"val_velocity_mse": 0.019298528307683464
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"best_val_loss": 0.01863780426286431,
|
| 205 |
+
"epoch": 26,
|
| 206 |
+
"global_step": 109694,
|
| 207 |
+
"train_loss": 0.014139085923416245,
|
| 208 |
+
"val_loss": 0.019486618616969695,
|
| 209 |
+
"val_velocity_mse": 0.019388307728417424
|
| 210 |
+
},
|
| 211 |
+
{
|
| 212 |
+
"best_val_loss": 0.01863780426286431,
|
| 213 |
+
"epoch": 27,
|
| 214 |
+
"global_step": 113913,
|
| 215 |
+
"train_loss": 0.013962219816922406,
|
| 216 |
+
"val_loss": 0.01891431351006627,
|
| 217 |
+
"val_velocity_mse": 0.018772572249686446
|
| 218 |
+
},
|
| 219 |
+
{
|
| 220 |
+
"best_val_loss": 0.01863780426286431,
|
| 221 |
+
"epoch": 28,
|
| 222 |
+
"global_step": 118132,
|
| 223 |
+
"train_loss": 0.013814259375462984,
|
| 224 |
+
"val_loss": 0.018865748732062832,
|
| 225 |
+
"val_velocity_mse": 0.01877909741535195
|
| 226 |
+
},
|
| 227 |
+
{
|
| 228 |
+
"best_val_loss": 0.01845446058255094,
|
| 229 |
+
"epoch": 29,
|
| 230 |
+
"global_step": 122351,
|
| 231 |
+
"train_loss": 0.013589550947192566,
|
| 232 |
+
"val_loss": 0.01845446058255094,
|
| 233 |
+
"val_velocity_mse": 0.018339544156891926
|
| 234 |
+
},
|
| 235 |
+
{
|
| 236 |
+
"best_val_loss": 0.01845446058255094,
|
| 237 |
+
"epoch": 30,
|
| 238 |
+
"global_step": 126570,
|
| 239 |
+
"train_loss": 0.013435004625586883,
|
| 240 |
+
"val_loss": 0.018775178734878346,
|
| 241 |
+
"val_velocity_mse": 0.01869818495749347
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"best_val_loss": 0.017927906914814704,
|
| 245 |
+
"epoch": 31,
|
| 246 |
+
"global_step": 130789,
|
| 247 |
+
"train_loss": 0.013200156528301383,
|
| 248 |
+
"val_loss": 0.017927906914814704,
|
| 249 |
+
"val_velocity_mse": 0.017874638566366043
|
| 250 |
+
},
|
| 251 |
+
{
|
| 252 |
+
"best_val_loss": 0.017927906914814704,
|
| 253 |
+
"epoch": 32,
|
| 254 |
+
"global_step": 135008,
|
| 255 |
+
"train_loss": 0.01310668048058363,
|
| 256 |
+
"val_loss": 0.018309819042932853,
|
| 257 |
+
"val_velocity_mse": 0.018275553875886745
|
| 258 |
+
},
|
| 259 |
+
{
|
| 260 |
+
"best_val_loss": 0.017927906914814704,
|
| 261 |
+
"epoch": 33,
|
| 262 |
+
"global_step": 139227,
|
| 263 |
+
"train_loss": 0.012972866195715605,
|
| 264 |
+
"val_loss": 0.018503636373941704,
|
| 265 |
+
"val_velocity_mse": 0.018387774342118995
|
| 266 |
+
},
|
| 267 |
+
{
|
| 268 |
+
"best_val_loss": 0.017927906914814704,
|
| 269 |
+
"epoch": 34,
|
| 270 |
+
"global_step": 143446,
|
| 271 |
+
"train_loss": 0.012931580841254321,
|
| 272 |
+
"val_loss": 0.019117971031573106,
|
| 273 |
+
"val_velocity_mse": 0.01907257352824579
|
| 274 |
+
},
|
| 275 |
+
{
|
| 276 |
+
"best_val_loss": 0.017927906914814704,
|
| 277 |
+
"epoch": 35,
|
| 278 |
+
"global_step": 147665,
|
| 279 |
+
"train_loss": 0.01262996628631942,
|
| 280 |
+
"val_loss": 0.018617702523188822,
|
| 281 |
+
"val_velocity_mse": 0.018537213953871177
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"best_val_loss": 0.017927906914814704,
|
| 285 |
+
"epoch": 36,
|
| 286 |
+
"global_step": 151884,
|
| 287 |
+
"train_loss": 0.012559264660006092,
|
| 288 |
+
"val_loss": 0.01829620239648547,
|
| 289 |
+
"val_velocity_mse": 0.01820652960821478
|
| 290 |
+
},
|
| 291 |
+
{
|
| 292 |
+
"best_val_loss": 0.017927906914814704,
|
| 293 |
+
"epoch": 37,
|
| 294 |
+
"global_step": 156103,
|
| 295 |
+
"train_loss": 0.012401056233559507,
|
| 296 |
+
"val_loss": 0.01799670454394668,
|
| 297 |
+
"val_velocity_mse": 0.01792410507312676
|
| 298 |
+
},
|
| 299 |
+
{
|
| 300 |
+
"best_val_loss": 0.017927906914814704,
|
| 301 |
+
"epoch": 38,
|
| 302 |
+
"global_step": 160322,
|
| 303 |
+
"train_loss": 0.012327932121338552,
|
| 304 |
+
"val_loss": 0.018183529605346322,
|
| 305 |
+
"val_velocity_mse": 0.01807728126796006
|
| 306 |
+
},
|
| 307 |
+
{
|
| 308 |
+
"best_val_loss": 0.017927906914814704,
|
| 309 |
+
"epoch": 39,
|
| 310 |
+
"global_step": 164541,
|
| 311 |
+
"train_loss": 0.012218607810788823,
|
| 312 |
+
"val_loss": 0.01806522283141118,
|
| 313 |
+
"val_velocity_mse": 0.01798392593962893
|
| 314 |
+
},
|
| 315 |
+
{
|
| 316 |
+
"best_val_loss": 0.017927906914814704,
|
| 317 |
+
"epoch": 40,
|
| 318 |
+
"global_step": 168760,
|
| 319 |
+
"train_loss": 0.012007822082507107,
|
| 320 |
+
"val_loss": 0.018169880389168398,
|
| 321 |
+
"val_velocity_mse": 0.018171396032015463
|
| 322 |
+
},
|
| 323 |
+
{
|
| 324 |
+
"best_val_loss": 0.017927906914814704,
|
| 325 |
+
"epoch": 41,
|
| 326 |
+
"global_step": 172979,
|
| 327 |
+
"train_loss": 0.011967390129781074,
|
| 328 |
+
"val_loss": 0.017935370404108454,
|
| 329 |
+
"val_velocity_mse": 0.01786259362406568
|
| 330 |
+
},
|
| 331 |
+
{
|
| 332 |
+
"best_val_loss": 0.017927906914814704,
|
| 333 |
+
"epoch": 42,
|
| 334 |
+
"global_step": 177198,
|
| 335 |
+
"train_loss": 0.01175453150514659,
|
| 336 |
+
"val_loss": 0.01834996097357765,
|
| 337 |
+
"val_velocity_mse": 0.0182461737623331
|
| 338 |
+
},
|
| 339 |
+
{
|
| 340 |
+
"best_val_loss": 0.017927906914814704,
|
| 341 |
+
"epoch": 43,
|
| 342 |
+
"global_step": 181417,
|
| 343 |
+
"train_loss": 0.011790214158867449,
|
| 344 |
+
"val_loss": 0.018066336671863473,
|
| 345 |
+
"val_velocity_mse": 0.01797330983008927
|
| 346 |
+
},
|
| 347 |
+
{
|
| 348 |
+
"best_val_loss": 0.017927906914814704,
|
| 349 |
+
"epoch": 44,
|
| 350 |
+
"global_step": 185636,
|
| 351 |
+
"train_loss": 0.011659870573177555,
|
| 352 |
+
"val_loss": 0.018028129656453614,
|
| 353 |
+
"val_velocity_mse": 0.017978237838105066
|
| 354 |
+
},
|
| 355 |
+
{
|
| 356 |
+
"best_val_loss": 0.017851904242126737,
|
| 357 |
+
"epoch": 45,
|
| 358 |
+
"global_step": 189855,
|
| 359 |
+
"train_loss": 0.01151867015307147,
|
| 360 |
+
"val_loss": 0.017851904242126737,
|
| 361 |
+
"val_velocity_mse": 0.01775320437796382
|
| 362 |
+
},
|
| 363 |
+
{
|
| 364 |
+
"best_val_loss": 0.017534218672072208,
|
| 365 |
+
"epoch": 46,
|
| 366 |
+
"global_step": 194074,
|
| 367 |
+
"train_loss": 0.011408890792439973,
|
| 368 |
+
"val_loss": 0.017534218672072208,
|
| 369 |
+
"val_velocity_mse": 0.017501561924803264
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"best_val_loss": 0.017534218672072208,
|
| 373 |
+
"epoch": 47,
|
| 374 |
+
"global_step": 198293,
|
| 375 |
+
"train_loss": 0.011332371521036534,
|
| 376 |
+
"val_loss": 0.018026406452782563,
|
| 377 |
+
"val_velocity_mse": 0.017964028369591656
|
| 378 |
+
},
|
| 379 |
+
{
|
| 380 |
+
"best_val_loss": 0.017534218672072208,
|
| 381 |
+
"epoch": 48,
|
| 382 |
+
"global_step": 202512,
|
| 383 |
+
"train_loss": 0.011249471013550122,
|
| 384 |
+
"val_loss": 0.018014545434279675,
|
| 385 |
+
"val_velocity_mse": 0.017935520937559065
|
| 386 |
+
},
|
| 387 |
+
{
|
| 388 |
+
"best_val_loss": 0.017534218672072208,
|
| 389 |
+
"epoch": 49,
|
| 390 |
+
"global_step": 206731,
|
| 391 |
+
"train_loss": 0.011179602435192004,
|
| 392 |
+
"val_loss": 0.018949583041241398,
|
| 393 |
+
"val_velocity_mse": 0.01884937141937559
|
| 394 |
+
},
|
| 395 |
+
{
|
| 396 |
+
"best_val_loss": 0.017534218672072208,
|
| 397 |
+
"epoch": 50,
|
| 398 |
+
"global_step": 210950,
|
| 399 |
+
"train_loss": 0.011112038898307138,
|
| 400 |
+
"val_loss": 0.018457344781333353,
|
| 401 |
+
"val_velocity_mse": 0.018436944999569244
|
| 402 |
+
}
|
| 403 |
+
]
|
| 404 |
+
}
|
validation_results.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"environment": {
|
| 3 |
+
"device": "mps",
|
| 4 |
+
"numpy": "2.5.1",
|
| 5 |
+
"python": "3.12.2",
|
| 6 |
+
"scipy": "1.18.0",
|
| 7 |
+
"torch": "2.5.1"
|
| 8 |
+
},
|
| 9 |
+
"pulses": 1000,
|
| 10 |
+
"reference_comparison": {
|
| 11 |
+
"copra_hann_direct_final_pulse_mae": {
|
| 12 |
+
"absolute_error": 1.8179416860775177e-09,
|
| 13 |
+
"expected": 0.3344596439450979,
|
| 14 |
+
"observed": 0.3344596457630396,
|
| 15 |
+
"passed": true,
|
| 16 |
+
"tolerance": 0.0001
|
| 17 |
+
},
|
| 18 |
+
"predicted_pulse_mae": {
|
| 19 |
+
"absolute_error": 8.795470464978417e-06,
|
| 20 |
+
"expected": 0.0674247687458992,
|
| 21 |
+
"observed": 0.06741597327543422,
|
| 22 |
+
"passed": true,
|
| 23 |
+
"tolerance": 0.0001
|
| 24 |
+
},
|
| 25 |
+
"predicted_trace_ssim": {
|
| 26 |
+
"absolute_error": 3.990351403748704e-07,
|
| 27 |
+
"expected": 0.9102954186510317,
|
| 28 |
+
"observed": 0.9102958176861721,
|
| 29 |
+
"passed": true,
|
| 30 |
+
"tolerance": 0.0001
|
| 31 |
+
},
|
| 32 |
+
"source_pulse_mae": {
|
| 33 |
+
"absolute_error": 1.2144446004391796e-09,
|
| 34 |
+
"expected": 0.46853104860335587,
|
| 35 |
+
"observed": 0.46853104738891127,
|
| 36 |
+
"passed": true,
|
| 37 |
+
"tolerance": 0.0001
|
| 38 |
+
},
|
| 39 |
+
"source_trace_ssim": {
|
| 40 |
+
"absolute_error": 0.0,
|
| 41 |
+
"expected": 0.9709196563363075,
|
| 42 |
+
"observed": 0.9709196563363075,
|
| 43 |
+
"passed": true,
|
| 44 |
+
"tolerance": 0.0001
|
| 45 |
+
},
|
| 46 |
+
"target_trace_ssim": {
|
| 47 |
+
"absolute_error": 0.0,
|
| 48 |
+
"expected": 0.927486524318055,
|
| 49 |
+
"observed": 0.927486524318055,
|
| 50 |
+
"passed": true,
|
| 51 |
+
"tolerance": 0.0001
|
| 52 |
+
}
|
| 53 |
+
},
|
| 54 |
+
"reference_status": "passed",
|
| 55 |
+
"solver": "64-step Euler",
|
| 56 |
+
"source_kind": "copra_final"
|
| 57 |
+
}
|